Git 푸시
git push
명령은 로컬 리포지토리 콘텐츠를 원격 리포지토리에 업로드하는 데 사용됩니다. 푸시는 로컬 리포지토리에서 원격 리포지토리로 커밋을 전송하는 방법입니다. git fetch와 대응하는 명령이지만 가져오기는 커밋을 로컬 브랜치로 가져오는 반면 푸시는 커밋을 원격 브랜치로 내보냅니다. 원격 브랜치는 git remote 명령을 사용하여 구성합니다. 푸시는 변경 사항을 덮어쓸 수 있으므로 푸시할 경우 주의를 기울여야 합니다. 이러한 문제는 아래에 설명되어 있습니다.
Git push 사용
git push <remote> <branch>
지정된 브랜치를 필요한 커밋 및 내부 개체와 함께 푸시합니다. 대상 리포지토리에 로컬 브랜치가 만들어집니다. Git은 커밋을 덮어쓰는 것을 방지하기 위해 대상 리포지토리에서 빨리 감기 이외의(non-fast-foward) 병합이 되는 경우 푸시를 허용하지 않습니다.
git push <remote> --force
위의 명령과 동일하지만, 빨리 감기 이외의 병합이 되는 경우에도 푸시를 강제로 실행합니다. 수행하는 작업에서 조금이라도 이해되지 않는 부분이 있다면 --force
플래그를 사용하지 마세요.
모든 로컬 브랜치를 지정된 원격으로 푸시합니다.
git push <remote> --tags
관련 자료
고급 Git 로그
솔루션 보기
Bitbucket Cloud에서 Git에 대해 알아보기
브랜치를 푸시하거나 --all
옵션을 사용할 때 태그가 자동으로 푸시되지 않습니다. --tags
플래그는 모든 로컬 태그를 원격 리포지토리로 보냅니다.
Git push 설명
git push
는 로컬 변경 사항을 중앙 집중식 리포지토리에 게시하는 데 가장 일반적으로 사용합니다. 로컬 리포지토리를 수정한 후에 푸시를 실행하여 원격 팀원과 수정 사항을 공유합니다.
위의 다이어그램은 로컬 main
이 중앙 리포지토리의 main
보다 더 많이 진행했고 사용자가 git push origin main
을 실행하여 변경 사항을 게시할 경우 발생하는 결과를 보여줍니다. git push
는 원격 리포지토리 내부에서 git merge main
을 실행하는 것과 실질적으로 동일합니다.
Git push 및 동기화
git push
는 전체 Git "동기화" 프로세스에서 많이 사용되는 컴포넌트입니다. 동기화 명령은 git remote 명령을 사용하여 구성된 원격 브랜치에서 작동합니다. git push
는 '업로드' 명령으로 간주할 수 있지만 git fetch 및 git pull 명령은 '다운로드' 명령으로 간주할 수 있습니다. 다운로드 또는 업로드를 통해 변경 집합이 이동된 경우 대상에서 git merge를 수행하여 변경 사항을 통합할 수 있습니다.
베어 리포지토리로 푸시
자주 사용하는 최신 Git 사례는 원격으로 호스팅하는 --bare
리포지토리를 중앙 집중식 origin 리포지토리로 사용하는 것입니다. origin 리포지토리는 종종 Bitbucket과 같은 신뢰할 수 있는 타사에 오프사이트로 호스팅합니다. 푸시는 원격 브랜치 구조에 방해가 되므로 --bare
플래그를 사용하여 만든 리포지토리에 푸시하는 것이 가장 안전하고 일반적인 방법입니다. bare 리포지토리에는 작업 디렉터리가 없으므로 푸시해도 진행 중인 작업 디렉터리의 콘텐츠는 변경되지 않습니다. bare 리포지토리 만들기에 대한 자세한 내용은 git init에서 확인하세요.
강제 푸시
Git은 푸시 요청으로 인해 빨리 감기가 아닌 병합이 발생할 경우 푸시 요청을 거부하여 중앙 리포지토리의 기록을 덮어쓰지 못하도록 합니다. 따라서 원격 기록이 기록과 다른 경우 원격 브랜치를 가져와 로컬 브랜치에 병합한 다음 다시 푸시를 시도해야 합니다. SVN이 변경 세트를 커밋하기 전에 svn update
를 통해 중앙 리포지토리와 동기화하는 방식과 유사합니다.
--force
플래그는 이런 작동 방식을 무시하여 원격 리포지토리의 브랜치를 로컬 브랜치와 일치시키며 마지막 풀 이후에 발생했을 수 있는 업스트림 변경 사항을 삭제합니다. 방금 공유한 커밋이 올바르지 않음을 알게 되어 git commit --amend
또는 대화형 rebase를 사용하여 수정한 경우에만 푸시를 강제로 실행해야 합니다. 하지만 --force
옵션을 사용하기 전에 팀원 중 어느 누구도 이 커밋을 끌어오지 않았다는 것을 확인해야 합니다.
예제
기본 git push
다음 예시에서는 로컬에서 작업한 내용을 중앙 리포지토리에 게시하는 표준 방법을 설명합니다. 먼저 중앙 리포지토리의 복사본을 가져와서 이를 기반으로 변경 사항을 rebase해서 로컬 메인이 최신 상태인지 확인합니다. 대화형 rebase는 커밋을 공유하기 전에 정리할 수 있는 좋은 기회이기도 합니다. 그런 다음 git push
명령을 실행하여 로컬 메인의 모든 커밋을 중앙 리포지토리로 보냅니다.
git checkout main
git fetch origin main
git rebase -i origin/main
# Squash commits, fix up commit messages etc.
git push origin main
로컬 메인이 최신 상태임을 이미 확인했으므로 빨리 감기 병합이 발생하며 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 main
위의 예제에서는 커밋 기록이 있는 기존 리포지토리에서 실행되고 있다고 가정합니다. git commit --amend
는 이전 커밋을 업데이트하는 데 사용합니다. 그런 다음 --force
옵션을 사용하여 수정된 커밋을 강제로 푸시합니다.
원격 브랜치 또는 태그 삭제
기록 유지 또는 구조상 목적으로 브랜치를 정리해야 하는 경우가 간혹 있습니다. 브랜치를 완전히 삭제하려면 로컬과 원격에서도 삭제해야 합니다.
git branch -D branch_name
git push origin :branch_name
위 명령은 branch_name이라는 이름의 원격 브랜치를 삭제하며 git push
명령에 브랜치 이름 앞에 콜론을 붙여서 전달하여 원격 브랜치를 삭제합니다.
이 문서 공유
다음 토픽
여러분께 도움을 드릴 자료를 추천합니다.
이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.