핵심 정리
git switch -c feature/login --track origin/feature/login
git branch -vv
git push -u origin feature/login구조 이해
어떤 추적 관계를 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 로컬 브랜치가 따를 원격 브랜치 설정 | upstream |
| 원격 상태 확인 | remote-tracking branch |
| 원격 추적 상태 요약 보기 | git branch -vv |
| 처음 push하면서 추적 설정 | git push -u origin <branch> |
로컬 브랜치, remote tracking branch, 실제 원격 브랜치는 세 개의 별개 존재다
Git을 처음 다루면 이 세 개를 혼동하기 쉽다. 실제 원격 브랜치는 원격 저장소 서버에 있는 ref다. remote tracking branch(origin/main 같은 이름)는 로컬 저장소가 마지막 fetch 시점에 원격 상태를 캐시한 읽기 전용 ref로, .git/refs/remotes/origin/ 아래에 저장된다. 로컬 브랜치는 내가 직접 커밋을 쌓는 ref다. 이 셋을 구분해야 git fetch, git pull, git push가 각각 무엇을 어디서 어디로 이동시키는지 정확히 이해할 수 있다.
fetch는 remote tracking branch를 갱신하지만 로컬 브랜치는 건드리지 않는다
git fetch origin을 실행하면 원격의 최신 커밋 객체를 내려받고 origin/main 같은 remote tracking branch를 최신으로 갱신한다. 그러나 내 로컬 main 브랜치는 자동으로 이동하지 않는다. 따라서 origin/main을 보고 있더라도 fetch 전에는 오래된 정보일 수 있다. git pull은 fetch + merge(또는 rebase)를 한 번에 수행하지만, 정확히 무슨 일이 일어나는지 파악하기 어려울 때는 fetch와 merge를 분리해서 실행하는 것이 명시적이다.
upstream 설정이 왜 필요한가 — push와 pull의 기본 대상을 지정한다
upstream은 내 현재 브랜치가 기본적으로 비교하고 push/pull할 상대 브랜치를 뜻한다. 이 연결이 잡혀 있어야 git pull, git push를 인자 없이 짧게 쓸 때 Git이 어디와 동기화할지 알 수 있다. 새 작업 브랜치를 처음 push할 때 git push -u origin feature/login처럼 -u 옵션을 쓰면 push와 upstream 설정이 한 번에 이루어진다. upstream이 설정되지 않은 상태에서 git push를 실행하면 "no upstream configured" 오류가 발생한다.
branch -vv로 현재 추적 상태를 한눈에 파악할 수 있다
git branch -vv를 보면 각 브랜치가 어떤 upstream을 따라가는지, 그리고 원격과 몇 커밋 차이가 나는지([origin/main: ahead 2, behind 1] 형태)를 함께 볼 수 있다. "ahead"는 로컬에는 있지만 원격에 없는 커밋 수, "behind"는 원격에는 있지만 로컬에 없는 커밋 수를 의미한다. 협업 중에 "내 브랜치가 원격보다 뒤처졌는가"를 빠르게 확인할 때, 또는 fetch 후 어떤 브랜치를 갱신해야 하는지 파악할 때 유용하다.
git fetch origin
git branch -vv
# * feature/login abc1234 [origin/feature/login: ahead 2, behind 1] ...upstream과 remote-tracking branch는 같은 것이 아니다
upstream은 "내 로컬 브랜치가 기본적으로 누구를 따라갈지"라는 관계 설정이고, remote-tracking branch는 "마지막 fetch 시점의 원격 상태 복사본"입니다. 둘을 같은 것으로 생각하면 origin/main이 실시간 원격이라고 오해하거나, upstream이 없는데 git push가 왜 실패하는지 이해하기 어려워집니다. 보통 push -u는 두 문제를 한 번에 풀어 주지만, 개념은 분리해서 이해하는 편이 안전합니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 브랜치 추적 상태와 원격과의 차이 확인 | git branch -vv |
| 새 브랜치를 push하면서 upstream 동시 설정 | git push -u origin <branch> |
| 원격 최신 상태를 로컬에 반영(로컬 브랜치 건드리지 않음) | git fetch origin |
| remote tracking branch를 기준으로 로컬 브랜치 생성 | git switch -c <name> --track origin/<name> |
| upstream만 나중에 별도로 설정 | git branch --set-upstream-to=origin/<name> |
주의할 점
origin/main을 보고 있다고 해서 원격 저장소를 실시간으로 보고 있는 것은 아닙니다.
remote tracking branch는 마지막 fetch 시점의 스냅샷이므로, 최신 상태를 확인하려면
먼저 git fetch를 실행하는 편이 안전합니다. pull은 fetch와 merge를 한 번에 하므로
편리하지만, 예상치 못한 merge commit이 생길 수 있어 주의가 필요합니다.
git switch -c feature/login
git push
# fatal: The current branch feature/login has no upstream branch.
# 처음 push할 때는 -u로 추적 관계를 먼저 설정해야 함참고 링크
2 sources