git push
Update remote refs along with associated objects
— Git 공식 매뉴얼(git-push Manual Page)
"푸시를 눌렀다. 빌드 서버에서 빨간 불이 켜졌다. 슬며시 아우터를 챙겨 입는다." 제발 CI/CD 빌드가 성공하게 해주세요 무조건 기도메타
1. 개요
Git 환경에서 내 컴퓨터(로컬 저장소)에 얌전히 저장되어 있던 커밋들을 GitHub이나 GitLab 등 저 멀리 구름 위에 있는 원격 저장소로 쏘아 올리는 명령어이다. 로컬 세계에만 갇혀 있던 내 작업 결과물이 비로소 공적 영역으로 진입하여 다른 동료들에게 노출되는 순간이기도 하다. 즉, 협업의 최종 단계이자 내 밥줄을 결정하는 운명의 슛팅 버튼이다.(...)
2. 거절당하는 아픔: Non-fast-forward
가장 흔하게 마주하는 상황은 신나게 기능 구현을 마치고 푸시를 날렸을 때 원격 저장소로부터 거절(Rejected) 메시지를 받는 것이다. 원격 저장소에 이미 나보다 먼저 누군가 커밋을 올려놓은 상태라면, 깃은 동기화가 덜 된 녀석의 푸시는 받지 않는다며 단칼에 거절한다. 이때는 조용히 git pull을 땡겨서 합친 다음 다시 푸시해야 한다. 만약 이 경고를 무시하고 강제로 내 코드를 덮어씌우려 한다면 지옥문이 열리게 된다.1
3. 금단의 주문: --force (-f)
히스토리가 완전히 꼬였을 때, 인터넷 검색창은 어김없이 우리에게 git push -f (혹은 --force)라는 파괴적인 옵션을 추천해 준다. 이는 원격 저장소의 히스토리가 어찌 되었든 말든 내 로컬 컴퓨터의 상태로 강제 덮어쓰기하는 핵무기급 명령어다. 다른 사람들의 커밋 히스토리를 우주에서 흔적도 없이 증발시키는 마법을 발휘하므로, 협업 중에 메인 브랜치에 이걸 날리는 순간 사유서 작성이 확정된다. 그리고 회사 슬랙방에는 경보음이 울려 퍼진다.2
4. 실제 사용 예시
로컬 커밋을 원격 저장소로 올리는 기본 명령이다. 새 브랜치를 처음 올릴 때는 -u로 upstream을 연결해두면 다음부터 git push만 입력해도 된다.
git push origin main
# 새 기능 브랜치 최초 업로드
git push -u origin feature/login
이미 올린 브랜치의 역사를 고친 뒤에는 일반 push가 거절될 수 있다. 꼭 필요할 때만 --force-with-lease를 사용하고, 팀원과 공유한 브랜치에서는 먼저 확인해야 한다.
git push --force-with-lease origin feature/login
git push origin --delete feature/login
5. 관련 밈 및 드립
5.1. Friday Force Push (금요일의 포스 푸시)
금요일 오후 5시 59분에 git push -f origin main을 실행해 원격 메인 저장소의 모든 히스토리를 덮어씌운 뒤, 주말 동안 회사 전화를 꺼두고 유유히 퇴근해 버리는 진정한 빌런 개발자를 희화화한 유명 밈.
6. 여담
- Protected Branches: 웬만한 개념을 탑재한 원격 저장소들은
main이나master같은 중요한 브랜치에 대해 직접 푸시나 force push를 원천 차단(Protected Branch)하도록 설정해 둔다. 이거 안 뚫어놓으면 언젠가 한 명은 대형 사고를 친다. - Push 안 하고 퇴근하기: 로컬에서 커밋까지 다 해놓고 완벽하게 기능이 동작함을 확인한 뒤 기분 좋게 컴퓨터를 끄고 퇴근했으나, 사실 원격에 푸시를 안 해서 월요일 아침까지 팀원들이 내 작업물을 보지 못해 일정이 홀딩되는 황당한 실수가 자주 터진다.(...)