git push 명령은 로컬 리포지토리 콘텐츠를 원격 리포지토리에 업로드하는 데 사용됩니다. 푸시는 로컬 리포지토리에서 원격 리포지토리로 커밋을 전송하는 방법입니다. git fetch와 상대가 명령이지만 가져오기는 커밋을 로컬 브랜치로 가져오는 반면, 푸시는 커밋을 원격 브랜치로 내보냅니다. 원격 브랜치는 git remote 명령을 사용하여 구성합니다. 푸시는 변경사항을 덮어쓸 수 있으므로 푸시할 경우 주의를 기울여야 합니다. 이 문제는 아래에 설명되어 있습니다.

Git push 사용

git push <remote> <branch>

지정된 브랜치를 필요한 커밋 및 내부 개체와 함께 <remote>로 푸시합니다. 대상 리포지토리에 로컬 브랜치가 만들어집니다. Git은 커밋을 덮어쓰지 않는 것을 방지하기 위해 대상 리포지토리에서 빨리 감기 이외의(non-fast-foward) 병합이 되는 경우 푸시를 허용하지 않습니다.

git push <remote> --force

위의 명령과 동일하지만 빨리 감기 이외의(non-fast-foward) 병합이 되는 경우에도 푸시를 강제로 실행합니다. 수행하는 작업이 분명하게 이해하고 있는 경우가 아니라면 --force 플래그를 사용하지 마십시오.

git push <remote> --all

모든 로컬 브랜치를 지정된 원격 리포지토리로 푸시합니다.

git push <remote> --tags

브랜치를 푸시하거나 --all 옵션을 사용하면 태그는 자동으로 푸시되지 않습니다. --tags 플래그는 모든 로컬 태그를 원격 리포지토리로 보냅니다.

Git push 설명

git push는 로컬 변경 사항을 중앙 리포지토리에 게시하는 데 가장 일반적으로 사용합니다. 로컬 리포지토리를 수정한 후에 푸시를 실행하여 원격 팀원과 수정사항을 공유할 수 있습니다.

git push를 사용하여 변경 사항 게시

위의 다이어그램은 로컬 마스터의 진행 상황이 중앙 리포지토리의 마스터보다 빠르고 사용자가 git push origin master를 실행하여 변경사항을 게시할 경우 발생하는 결과를 보여줍니다. git push는 원격 리포지토리 내부에서 git merge master를 실행하는 것과 본질적으로 동일합니다.

Git push 및 동기화

git push 는 전체 Git "동기화" 프로세스에서 사용되는 많은 구성 요소 중 하나입니다. 동기화 명령은 git remote 명령을 사용하여 구성된 원격 브랜치에서 작동합니다. git push는 '업로드' 명령으로 간주할 수 있지만, git fetch 및 git pull 은 '다운로드' 명령으로 간주할 수 있습니다. 다운로드 또는 업로드를 통해 변경 세트가 이동된 경우, git merge를 수행하여 변경사항을 대상에 통합할 수 있습니다.

베어 리포지토리로 푸시

자주 사용하는 최신 Git 사례는 원격으로 호스팅하는 --bare 리포지토리를 중앙 origin 리포지토리로 사용하는 것입니다. 이 orgin 리포지토리는 종종 Bitbucket과 같은 신뢰할 수 있는 타사에 오프사이트로 호스팅합니다. 푸시는 원격 브랜치 구조에 방해가 되므로 --bare 플래그를 사용하여 만든 리포지토리에 푸시하는 것이 가장 안전하고 일반적인 방법입니다. 베어 리포지토리에는 작업 디렉토리가 없으므로 푸시를 수행해도 진행 중인 작업 디렉토리의 콘텐츠는 변경되지 않습니다. 베어 리포지토리를 만들기에 대한 자세한 내용은 git init에 대해 읽어보십시오.

강제 푸시

Git에서는 푸시로 인해 빨리 감기 이외(non-fast-foward)의 합병이 되는 경우 푸시를 거부하여 중앙 리포지토리의 기록을 덮어쓰는 것을 방지할 수 있습니다. 따라서 원격 기록이 사용자의 기록에서 분기된 경우, 원격 브랜치를 끌어와서(pull) 로컬 브랜치에 병합한 후 다시 푸시를 시도해야 합니다. 이는 SVN이 변경 세트를 커밋하기 전에 svn update를 통해 중앙 리포지토리와 동기화는 방법과 유사합니다.

--force 플래그는 이런 작동 방식을 무시하여 원격 리포지토리의 브랜치를 로컬 브랜치와 일치시키며 마지막 끌어오기(pull) 이후에 발생했을 수 있는 업스트림 변경 사항을 삭제합니다. 오직 방금 공유한 커밋이 올바르지 않음을 알게 되어 git commit --amend 또는 대화형 기준 재지정(rebase)을 사용하여 수정한 경우에만 푸시를 강제로 실행해야 합니다. 하지만 --force 옵션을 사용하기 전에 팀원 중 어느 누구도 이 커밋을 끌어오지(pull) 않았다는 것을 확인해야 합니다.

기본 git push

다음 예제에서는 로컬에서 작업한 내용을 중앙 리포지토리에 게시하는 기본적인 방법 중 하나를 설명합니다. 먼저 중앙 리포지토리의 복사본을 가져와서 이를 기반으로 변경사항의 기준을 재정의해 로컬 마스터가 최신 상태인지 확인하십시오. 대화형 기준 재지정은 커밋을 공유하기 전에 정리할 좋은 기회이기도 합니다. 그런 다음, git push 명령을 실행하여 로컬 마스터의 모든 커밋을 중앙 리포지토리로 보냅니다.

git checkout master
git fetch origin master
git rebase -i origin/master
# Squash commits, fix up commit messages etc.
git push origin master

로컬 마스터가 최신 상태임을 이미 확인했으므로 빨리 감기(fast-foward) 병합이 되며 git push를 실행했을 때 위에서 설명한 빠른 감기 이외 상황 이슈는 발생하지 않을 것입니다.

수정된 강제 푸시

git commit 명령은 이전 커밋을 업데이트하는 --amend 옵션을 수락합니다. 커밋 메시지를 업데이트하거나 새로운 변경 사항을 추가하기 위해 커밋을 수정하는 경우가 종종 있습니다. 커밋을 수정하면 Git이 수정된 커밋과 원격 커밋을 분기된 콘텐츠로 인식하므로 git push가 실패하게 됩니다. --force 옵션은 변경된 커밋을 푸시할 때만 사용해야 합니다.

# make changes to a repo and git add
git commit --amend
# update the existing commit message
git push --force origin master

위의 예제에서는 커밋 기록이 있는 기존 리포지토리에서 실행되는 것으로 가정합니다. git commit --amend는 이전 커밋을 업데이트하는 데 사용합니다. 그런 다음 -- force 옵션을 사용하여 변경된 커밋을 강제로 푸시합니다.

원격 브랜치 또는 태그 삭제

기록 유지 또는 구조상 목적으로 브랜치를 정리해야 하는 경우가 간혹 있습니다. 브랜치를 완전히 삭제하려면 로컬과 원격에서도 삭제해야 합니다.

git branch -D branch_name
git push origin :branch_name

위 명령은 branch_name이라는 이름의 로컬 브랜치를 삭제하며 git push 명령에 브랜치 이름 앞에 콜론을 붙여서 전달하면 원격 브랜치를 삭제합니다.