git force push, 안전하게 하는 법

3 min read
TL;DR
  • --force 대신 --force-with-lease를 사용하면 동료 커밋을 날릴 일이 없습니다
  • --force-with-lease는 원격이 내가 마지막으로 fetch한 상태와 같을 때만 push를 허용합니다
  • --force-if-includes를 함께 사용하면 fetch만 하고 통합하지 않은 경우도 방어할 수 있습니다
  • alias로 git pushf를 등록핸두면 편리하고 안전합니다
Cover

TL;DR

--force 대신 --force-with-lease를 쓰면 동료 커밋을 날릴 일이 없습니다. alias 하나 등록핸두면 끝입니다.

force push, 왜 필요한가

rebasecommit --amend 후에는 로컬 히스토리가 원격과 달라집니다. 일반 push가 거부되니 force push가 필요하죠. 이때 선택지가 갈립니다.

--force vs --force-with-lease

--force — 원격 브랜치를 무조건 덮어씁니다. 동료가 중간에 push한 커밋이 있어도 경고 없이 날아갑니다.

--force-with-lease — 원격이 내가 마지막으로 fetch한 상태와 같을 때만 허용합니다. 누군가 중간에 push했으면 거부되죠.

저도 평소에 --force-with-lease로 쓰고 있는데, 같이 작업하는 사람들한테 물어본면 이 옵션을 쓰는 사람이 손에 꼽을 정도로 적더군요. 실제로 몇 번 이 명령어 덕분에 한숨 돌린 적이 있습니다. 언제 실수할지 모르기 때문에, 습관으로 들여놓으면 좋습니다.

--force-with-lease의 함정과 --force-if-includes

--force-with-lease에도 함정이 하나 있습니다. git fetch를 먼저 실행하면 로컬 ref가 갱신되면서 보호가 물력화됩니다. VS Code처럼 백그라운드 auto-fetch를 쓰는 환경에서 특히 주의가 필요하죠.

Git 2.30에서 추가된 --force-if-includes를 함께 쓰면 이 함정까지 방어할 수 있습니다. fetch만 하고 실제로 통합하지 않은 커밋이 있으면 push를 거부합니다.

실전 alias 설정

git config --global alias.pushf 'push --force-with-lease --force-if-includes'

이후 git pushf origin feature-branch로 사용하면 됩니다.

마치며

--force를 쓸 이유는 거의 없습니다. alias 하나 등록핸두면 타이핑도 짧아지고, 동료 커밋을 날릴 위험도 사라집니다.

Refs