업스트림 설정으로 push/pull 자동화하기
git branch --set-upstream-to와 git push -u로 로컬 브랜치의 업스트림을 설정하고, 매번 remote 이름을 입력하지 않아도 되는 워크플로를 만드는 방법을 다룬다.
지난 글에서 원격 추적 브랜치가 무엇인지 살펴봤다. 이번에는 로컬 브랜치가 어떤 원격 추적 브랜치를 추적(tracking)하는지 설정하는 방법을 다룬다. 업스트림이 설정되면 git push origin feature/x 대신 git push만 입력해도 Git이 어디로 보내야 할지 알아서 판단한다.
업스트림이 없을 때의 문제
새 로컬 브랜치를 만들고 처음으로 push하려 하면 오류가 발생한다.
git switch -c feature/login
# 작업 후
git push
# fatal: The current branch feature/login has no upstream branch.
Git이 어느 원격 저장소의 어떤 브랜치로 push할지 모르기 때문이다. 매번 git push origin feature/login을 입력하는 것도 방법이지만, 업스트림을 설정해두면 이후부터 git push만으로 충분하다.
push -u: push와 동시에 업스트림 설정
# 첫 번째 push 시 -u(--set-upstream) 플래그 추가
git push -u origin feature/login
이 명령은 두 가지를 동시에 수행한다.
origin에feature/login브랜치로 커밋을 전송한다- 로컬
feature/login의 업스트림을origin/feature/login으로 설정한다
이후부터는 해당 브랜치에서 git push, git pull을 인자 없이 실행할 수 있다.
—set-upstream-to: 기존 브랜치에 업스트림 연결
이미 로컬에 있는 브랜치에 업스트림을 나중에 설정할 때는 --set-upstream-to를 사용한다.
# 긴 형식
git branch --set-upstream-to=origin/feature/login
# 단축 형식 (-u)
git branch -u origin/feature/login
# 다른 브랜치에 설정 (현재 브랜치가 아닐 때)
git branch -u origin/develop develop
설정 내용은 .git/config의 [branch "feature/login"] 섹션에 저장된다.
[branch "feature/login"]
remote = origin
merge = refs/heads/feature/login
업스트림 확인과 해제
# 모든 브랜치의 추적 상태 확인
git branch -vv
# * feature/login abc1234 [origin/feature/login] 로그인 폼 추가
# main def5678 [origin/main] 릴리스 v1.2
# 업스트림 해제
git branch --unset-upstream
# 특정 브랜치 업스트림 해제
git branch --unset-upstream feature/login
push.default 설정과의 관계
업스트림 동작 방식은 push.default 설정에 따라 달라진다.
# simple (Git 2.x 기본값): 업스트림 브랜치와 이름이 같을 때만 push
git config --global push.default simple
# upstream: 업스트림 브랜치 이름에 관계없이 push
git config --global push.default upstream
# current: 현재 브랜치와 같은 이름의 원격 브랜치로 push
git config --global push.default current
대부분의 환경에서 simple(기본값)이면 충분하다. 로컬 브랜치 이름과 원격 브랜치 이름을 항상 일치시키는 관례를 따르면 헷갈릴 일이 없다.
정리
업스트림 설정은 git push -u origin <브랜치>로 첫 push 시 함께 처리하는 것이 가장 간편하다. 이미 존재하는 브랜치라면 git branch -u origin/<브랜치>로 연결하고, git branch -vv로 상태를 확인한다. 업스트림이 설정된 이후에는 git push와 git pull에서 remote·브랜치 인자를 생략할 수 있어 워크플로가 한결 단순해진다.
지난 글: 원격 추적 브랜치 이해하기
다음 글: 여러 원격 저장소 관리하기
읽어주셔서 감사합니다. 😊