5 Git集成使用禁忌

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