Close

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 로고
솔루션 보기

Bitbucket Cloud에서 Git에 대해 알아보기

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

Git push 설명


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에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up