Git Force Push with Lease

Git

在一些 Git 开发流程中,需要使用 Git Rebase 来确保分支同步(比如在某一个 feature 分支上开发代码,通过 Rebase 来保证分支上一直可以有最新的开发分支上的所有提交内容)。这种情况下,在 Rebase 完 master(或其他代码提交分支)的代码之后,往往需要通过 Force Push 的方式,将 Rebase 的结果覆盖远程的工作分支。然而,Git Force Push 是一个有潜在危险的工作:当一个人在进行 Force Push 操作的时候,如果正好有另一个开发者在远端提交了新的代码,Force Push 会将远端他人的改动直接覆盖(删除)掉,导致一些代码提交丢失。

造成这一问题的直接原因,是 Force Push 的时候,代码没有带上最新的远端改动。然而,要解决这一问题却不是非常容易。因为无论进行 Rebase 的开发者如何小心,在进行网络操作进行提交的过程中,都有可能因为潜在的时间差,导致覆盖提交。

Git 为此设计了一个新的 API --force-with-lease 来解决这一问题。解决的思路是这样的:

当使用 --force-with-lease Flag 进行提交的时候,Git 会将当前提交者本地远程分支内的提交和真正远程服务器上的提交进行比较。如果两者是相同的,那么就会允许这一次的 Force Push 操作;如果发现是不同的,那么很大概率就是远端有了他人的新提交,这时 Force Push 就不会成功了。

此时,提交者应该通过 git fetch 的方式拿到最新的代码,确认是否需要进行更新改动,然后再次提交。

需要注意的是,因为 Git 只是进行了本地远程分支和远程分支的比较,因此 git fetch 之后即使什么也不做,直接再一次进行 git push --force-with-lease 操作也是可以成功的。所以操作的安全性最终还是需要人来保证,Git 只是提供了工具以确保人不会在无意间犯错误。