origin, upstream, remote를 비추는 그림자
Git의 remote는 다른 repo에 붙인 이름표야. 보통 GitHub, GitLab, 자체 gitolite 같은 서버 URL을 가리켜. clone해온 곳은 관습적으로 origin이라 부르지만 기술적으로 특별하지는 않아. 남의 프로젝트를 fork했다면 원본을 가리키는 두 번째 remote를 보통 upstream이라는 이름으로 추가해.
remote를 실제로 쓸모 있게 만드는 것이 remote-tracking branch야. fetch하면 Git은 remote branch의 모습을 refs/remotes/origin/<branch> 아래 저장해. branch처럼 보이지만 읽기 전용 pointer처럼 움직여. origin/main은 네 머신이 서버의 main을 마지막으로 본 모습이야. 로컬 main은 그보다 앞설 수도, 뒤질 수도, 같은 자리에 있을 수도 있어. fetch는 이 그림자를 최신으로 만들어 로컬 작업과 추측 없이 비교하게 해.
"Tracking"은 별도의 선택 설정이야. 로컬 branch가 remote-tracking branch를 tracking하게 만들면 git pull과 git push가 인자 없이도 알맞은 곳을 찾아. remote에만 있는 branch에서 git switch feature/login하면 로컬 branch를 만들고 origin/feature/login을 tracking해(Git 2.23+). 새 branch는 첫 push에서 git push -u origin feature/x로 관계를 맺어.
그림을 세 층으로 기억해. 어딘가에 실제 서버가 있고, origin/main은 마지막 fetch 때 본 snapshot이며, main은 네 로컬 작업이야. fork라면 upstream/main이 원본 프로젝트를 비춰. fetch는 작업을 건드리지 않고 그림자만 갱신하고, merge나 rebase는 작업과 그 그림자를 통합하며, push는 작업을 서버로 올려. remote 혼란은 대개 중간의 그림자를 잊어서 생겨.