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;不变更远端历史。