Git 푸시
git push
명령은 로컬 리포지토리 콘텐츠를 원격 리포지토리에 업로드하는 데 사용됩니다. 푸시는 로컬 리포지토리에서 원격 리포지토리로 커밋을 전송하는 방법입니다. git fetch
와 상대가 명령이지만 가져오기는 커밋을 로컬 브랜치로 가져오는 반면, 푸시는 커밋을 원격 브랜치로 내보냅니다. 원격 브랜치는 git remote
명령을 사용하여 구성합니다. 푸시는 변경사항을 덮어쓸 수 있으므로 푸시할 경우 주의를 기울여야 합니다. 이 문제는 아래에 설명되어 있습니다.
Git push 사용
git push <remote> <branch>
지정된 브랜치를 필요한 커밋 및 내부 개체와 함께
git push <remote> --force
위의 명령과 동일하지만 빨리 감기 이외의(non-fast-foward) 병합이 되는 경우에도 푸시를 강제로 실행합니다. 수행하는 작업이 분명하게 이해하고 있는 경우가 아니라면 --force
플래그를 사용하지 마십시오.
git push <remote> --all
모든 로컬 브랜치를 지정된 원격 리포지토리로 푸시합니다.
git push <remote> --tags
브랜치를 푸시하거나 --all
옵션을 사용하면 태그는 자동으로 푸시되지 않습니다. --tags
플래그는 모든 로컬 태그를 원격 리포지토리로 보냅니다.
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
명령에 브랜치 이름 앞에 콜론을 붙여서 전달하면 원격 브랜치를 삭제합니다.