39 | 禁止向集成分支执行 push -f 操作#
-f / --force:force update
场景:在本地和远端不是 fast-forwards 关系时,本地本来是不允许推送到远端的,但是,如果使用 git push -f
命令,就可以将本地强制更新到远端。
演示:强制抹掉远端的 commit。
先看看目前远端的 commit 记录:
以及本地的 commit 记录:
此时我们将本地版本重置到之前的某一个 commit,如 f21c98a,执行git reset --hard f21c98a
,然后再看一下本地的 commit 记录:
发现其之后的 commit 记录已经消失。
此时再进行推送:
直接 git push
肯定是不行的,但是加了 -f
之后成功推送了,再来看看远端的 commit 记录:
No!如果你是远端的另一个开发人员,看到这里会是什么感受?
那么有什么机制防止执行这种操作呢?可以自行搜索一下,Github 和 Gitlab 都提供了相应的保护机制。
📢此外,还可以通过 git reflog
找回刚刚丢失的分支,如下图红框所示:
然后利用 git reset --hard HAED@{n}
恢复喔~
40 | 禁止向集成分支执行变更历史的操作#
团队里公共的分支严禁做 rebase 操作
比如:
同事 A 通过 rebase 变更 commit 的 message 并推送到远端:
他在两个 commit 的 message 里加了 [feature] 前缀。
而另一位同事 B 在他变更前,就已经基于 origin/temp 分支同样创建了 test_rebase_inter 分支,并提交了 2 次新的 commit:
此时这位同事 B 想推送自己的更新,一定会遇到问题。
并且后面每一位已经在开发 test_rebase_inter 分支的同事都会遇到这个问题,他们还需要再用 rebase 来处理,这样带来了很多不必要的麻烦。
或者,找到同事 A,让他恢复原状,具体方法可参考上一节提到的 git reflog
方式。
rebase 适用场景之一:在还没有推送到远端的情况下,通过 rebase,把自己在本地的多次 commit,合并成一次 commit,再推送。
集成开发,铭记两点:不 push -f;不变更远端历史。