origin, upstream, 그리고 remote-tracking 그림자
Git 의 remote 는 다른 repo 사본에 대한 이름 붙은 책갈피야 — 보통 GitHub, GitLab, 자체 gitolite 같은 서버 URL. 관습적으로 clone 한 곳이 origin; 기술적으로 특별한 거 없지만 모든 도구 / 튜토리얼이 이걸 가정해. 남의 프로젝트에서 fork 한 repo 는 보통 원본 가리키는 두 번째 remote upstream 추가해.
remote 를 유용하게 만드는 게 remote-tracking branch. fetch 하면 Git 이 remote 의 각 branch 시각을 refs/remotes/origin/<branch> 아래 저장해. branch 처럼 보이고 read-only pointer 처럼 동작 — origin/main 은 네 머신이 서버의 main 에 마지막으로 본 모습. 네 local main 은 앞설 수도 뒤질 수도 같은 자리에 있을 수도 있어. fetch 의 핵심 목적이 이 그림자를 정확하게 유지해서 추측 없이 local 작업과 비교 가능하게 하는 거야.
"Tracking" 은 별개의 선택적 설정이야: local branch 가 remote-tracking branch 를 tracking 하도록 세팅 가능, 그러면 git pull 과 git push 가 인자 없이 default-correct. remote 만 있는 branch 에 git switch feature/login 하면 local branch 가 자동으로 origin/feature/login 을 tracking 해 (Git 2.23+). 새 branch 는 git push -u origin feature/x 로 첫 push 때 tracking 설정.
멘탈 모델: 어딘가 진짜 서버가 있고, origin/main 은 마지막 fetch 시점의 스냅샷, main 은 local 작업, upstream/main (있으면) 은 원본 프로젝트. fetch 는 작업 안 건드리고 스냅샷만 업데이트, merge/rebase 는 작업을 스냅샷에 통합 (또는 반대), push 는 작업을 서버에 업로드. 혼란은 거의 다 '스냅샷 존재' 를 잊은 데서 와.