Force-push가 필요하다면 lease와 함께 써
push한 commit을 amend하거나 interactive rebase로 drop 또는 squash하면 로컬 branch와 remote branch는 같은 작업의 서로 다른 이력을 갖게 돼. Plain git push는 서버 이력을 덮지 않으려고 거부해. 다시 쓴 이력을 올리려면 force-push가 필요하지만 plain --force는 잘못된 도구야. --force-with-lease를 써.
차이는 안전 조건이야. git push --force는 remote tip을 로컬 tip으로 무조건 덮어써. 동료가 네가 아직 받지 않은 commit을 push했다면 서버에서 그 작업을 지울 수 있어. git push --force-with-lease는 마지막 fetch 때 본 remote tip을 기억하고, 그 뒤 tip이 움직였다면 push를 거부해. 평소 편의는 같고 동시 작업을 잃을 순간에만 멈춰.
--force-with-lease=<branch>:<sha> 형식은 기대하는 remote SHA를 정확히 지정해서 script에 유용해. Git 2.30+의 --force-if-includes는 --force-with-lease를 보강해 로컬 branch가 덮으려는 remote tip을 base로 삼았는지 확인해, 자동 fetch 환경에서 놓칠 수 있는 경우를 더 막아. 둘을 함께 쓰면 git push --force-with-lease --force-if-includes야.
규율은 단순해. git push --force를 반사적으로 쓰지 마. git config --global alias.pushf 'push --force-with-lease --force-if-includes'로 git pushf를 만들고 손버릇을 안전한 쪽으로 옮겨. plain --force는 동작을 정확히 통제하는 드문 script에 남겨둬.