HOWTO · Git
`git push origin`과 `git push origin master`의 차이
이 기사에서는 git push origin과 git push origin master 명령의 차이점에 대해 설명합니다.
이 페이지의 내용
git push origin master는 푸시할 로컬 master 브랜치를 지정해 원격 저장소 origin으로 보냅니다. 반면 git push origin은 브랜치 이름을 생략하므로, 어떤 참조를 푸시하는지는 push.default 설정에 따라 달라집니다. simple은 필요한 추적 설정과 브랜치 이름 검사가 통과하면 현재 브랜치를 업스트림으로 푸시하고, matching은 origin에 같은 이름의 브랜치가 있는 로컬 브랜치를 여러 개 푸시할 수 있습니다. master를 지정하려면 브랜치 이름을 포함한 명령을 사용하세요. 브랜치 이름을 생략한 명령을 사용하기 전에는 설정된 모드와 해당 모드가 선택하는 브랜치를 확인하세요.
이름이 지정된 브랜치를 git push origin master로 푸시하기
git push origin master는 master라는 로컬 브랜치를 명시적으로 선택해 origin으로 보냅니다. 현재 체크아웃된 브랜치는 이 선택에 영향을 주지 않습니다. feature 브랜치에 있는 상태에서 실행해도 지정된 브랜치는 master입니다. 원격 브랜치는 푸시 refspec에 따라 갱신됩니다. 이 명령이 master를 프로젝트의 기본 브랜치라고 뜻하는 것은 아니며, 다른 로컬 브랜치 이름을 지정할 수도 있습니다.
예를 들어 git push origin feature는 feature를 명시적으로 선택합니다. 원격에 해당 이름의 브랜치가 없더라도, 원격이 푸시를 허용하면 푸시 과정에서 원격 참조를 만들 수 있습니다. 이 명령은 소스 브랜치를 선택할 때 현재 브랜치의 업스트림에 의존하지 않습니다.
현재 브랜치를 git push origin으로 푸시하기
브랜치 인수를 생략하면 Git은 설정된 push.default 동작을 따릅니다. 따라서 이 명령이 항상 체크아웃된 브랜치만 대상으로 하는 것은 아니며, 그 브랜치의 업스트림이 반드시 필요한 것도 아닙니다. simple 모드에서는 업스트림이 설정되어 있고 브랜치 이름 검사도 통과할 때 현재 브랜치를 업스트림으로 푸시합니다. matching 모드에서는 원격에 같은 이름의 브랜치가 이미 있는 로컬 브랜치를 푸시합니다. 따라서 git push origin 한 번으로 여러 브랜치가 갱신될 수 있으며, 현재 브랜치의 업스트림을 기준으로 브랜치를 선택하지 않습니다. 브랜치 이름을 생략한 푸시에 의존하기 전에 git config --get push.default로 설정된 모드를 확인하고 git branch -vv로 브랜치 추적 정보를 살펴보세요.
다음 예제는 로컬 bare 원격 저장소와 작업 저장소를 만들고, 먼저 master를 이름으로 지정해 푸시한 뒤 추적 중인 현재 브랜치를 git push origin으로 푸시합니다. 설정은 임시 저장소에만 적용됩니다. 직접 실행해 볼 수 있는 예제이며, 여기서는 실행 결과를 제시하지 않습니다.
set -eu
root=$(mktemp -d)
trap 'rm -rf "$root"' EXIT
remote="$root/origin.git"
repo="$root/work"
git init --bare -q "$remote"
git init -q -b master "$repo"
git -C "$repo" config user.name "Example User"
git -C "$repo" config user.email "example@example.com"
git -C "$repo" config push.default simple
git -C "$repo" remote add origin "$remote"
printf 'first commit\n' > "$repo/README.md"
git -C "$repo" add README.md
git -C "$repo" commit -q -m "Add README"
git -C "$repo" push -q origin master
git -C "$repo" switch -q -c feature
printf 'feature work\n' > "$repo/feature.txt"
git -C "$repo" add feature.txt
git -C "$repo" commit -q -m "Add feature"
git -C "$repo" push -q --set-upstream origin feature
git -C "$repo" push -q origin
git --git-dir="$remote" for-each-ref --format='%(refname:short)' refs/heads | sort
상황에 맞는 명령 선택하기
| 명령 | 브랜치 선택 방식 | 확인할 사항 |
|---|---|---|
git push origin master |
이름을 지정한 로컬 master 브랜치 |
보내려는 브랜치가 master인지 확인합니다. |
push.default=simple일 때의 git push origin |
추적 설정과 브랜치 이름 검사가 통과하면 현재 브랜치를 업스트림으로 푸시 | 업스트림, 브랜치 이름 검사, 설정된 모드를 확인합니다. |
push.default=matching일 때의 git push origin |
origin에 같은 이름의 브랜치가 있는 모든 로컬 브랜치. 여러 브랜치가 포함될 수 있습니다. |
푸시 전에 원격의 동일 이름 브랜치를 모두 확인합니다. |
특정 브랜치 하나를 선택하려면 브랜치 이름을 지정하는 형식을 사용하세요. 브랜치 이름을 생략한 형식은 push.default를 확인한 뒤에만 사용하세요. simple은 업스트림 관계를 확인해 현재 브랜치를 선택하고, matching은 이름이 일치하는 여러 브랜치를 선택할 수 있습니다. 결과가 분명하지 않다면 푸시 전에 git branch --show-current로 현재 브랜치를, git branch -vv로 브랜치 추적 정보를, git config --get push.default로 푸시 모드를 확인하세요.