39 | 禁止向集成分支執行 push -f 操作#
-f /--force:強制更新
場景:在本地和遠端不是 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;不變更遠端歷史。