본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

origin, upstream, remote-tracking branch

~20 min · remote, fetch

Level 0추적 전 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

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 pullgit 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 혼란은 대개 중간의 그림자를 잊어서 생겨.

Code

remote 검사 + 설정·bash
# 이 repo 가 아는 remote 들?
git remote -v

# 두 번째 remote 추가 (fork 의 전형):
git remote add upstream https://github.com/original/repo.git

# rename / remove / URL 변경:
git remote rename origin github
git remote remove old-remote
git remote set-url origin git@github.com:user/repo.git

# remote-tracking 포함 모든 ref:
git branch -a
git for-each-ref refs/remotes/
local 을 remote-tracking 그림자와 비교·bash
# working tree 안 건드리고 remote-tracking ref 업데이트:
git fetch origin

# origin 이 가지고 있고 내가 없는 것?
git log main..origin/main --oneline

# 내가 가지고 있고 origin 이 없는 것?
git log origin/main..main --oneline

# 대칭: 양쪽 발산
git log --left-right --oneline main...origin/main

External links

Exercise

clone한 repo에서 git remote -v, git branch -a, git for-each-ref refs/remotes/를 실행해. git fetch origin 뒤에는 git log main..origin/maingit log origin/main..main을 실행해. 매번 출력을 보기 전에 결과를 예측하고 확인한 뒤, 각 명령이 로컬과 remote의 발산에 관해 무엇을 보여줬는지 적어봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.