【Git】強制更新遠端分支 與 強制覆蓋本地的分支

記錄一個壞習慣 XD 我這處女座的個性,大概每隔一陣子就會對專案的 commit 的歷史紀錄感到不順眼,想要對它大刀闊斧地診整頓一番。

如果只有整理 local 端的 commit 倒是簡單,只要用git-rebase就好,但是如果 commit 已經上遠端了的呢?

只能來硬的了 XDDD



強制更新遠端分支

其實只要一條指令就可以將git-rebase後的 commit 給送上遠端。

1
$ git push -f origin <rbranch>:<lbranch> 
危險的 force 指令
危險的 force 指令(圖片來源: Engineering Tomorrow’s Systems


使用前請注意!-f 是個非常危險的指令,它可以無視一切先來後到的規則,讓你的 commit,直接取代線上所有內容。不是讓團隊進度付之一炬,不然就是像這些 Jenkins 的開發人員一樣不小心強制更新了 150 多個 github repos。真的做了你應該會被組員拖去套麻布袋 XD

強烈建議
1. 用在只有自己一個人的 Project 或 Branch。
2. 務必確認送出的內容與遠端分支。
3. 務必頭腦清晰確認自己在做啥,不清晰,回去睡飽再回來。



做完才想到一件事。我是一個人開發沒錯,但我在兩台機器上都有程式碼,所以另一台的 repo 怎麼辦?

強制覆蓋本地的分支

在開始抓程式碼覆蓋前,請先確認沒有要保存的程式或 commit,一旦執行了這些都會不見的!

git pull

對相應git pushpull當然也有相對應的強制指令:

1
$ git pull --force origin master:master


不過一開始我並沒下完整分支,所以一直跳出 merge 的訊息。所以我回頭看了文件,發現它寫到:

-f, –force
When git fetch is used with <rbranch>:<lbranch> refspec, it refuses to update the local branch <lbranch> unless the remote branch <rbranch> it fetches is a descendant of <lbranch>. This option overrides that check.

似乎是需要完全指定分支才行。


git reset

如過上面一招不行還有另外一招組合技,先取回遠端數據庫的最新歷史紀錄

1
$ git fetch --all 

然後放棄目前所有檔案與 commit,還原成遠端版本

1
$ git reset --hard origin/master

最後重新拉回來

1
$ git pull origin master



參考資料

  1. 高見龍 (2017)。【狀況題】聽說 git push -f 這個指令很可怕,什麼情況可以用它呢? 。檢自 為你自己學 Git (2020-02-07)。
  2. Toh Weiqing (2016-12-01)。A gentler force push on git: Force-with-lease。檢自 Engineering Tomorrow’s Systems (2020-02-07)。
  3. 10km (2018-11-30)。git:pull –force 強制覆蓋本地的分支 。檢自 10km的专栏-CSDN博客 (2020-02-07)。
  4. Mike (2019-11-04)。[Git] Git 自學筆記 : 單一檔案(checkout) ,退版(reset) ,重拉(pull), 強推(push)。檢自 Mike’s開發瘋 - 點部落 (2020-02-07)。