應用場景
當一個功能模塊比較龐大時,本地工作區在開發中可能進行了多次 commit / merge 操作,這時本地版本庫的工作樹是混亂不堪的。
如果將混亂的工作樹維持原狀提交至遠程分支,當我們只需要提前發布該部分的代碼時,就要在 master 遠程分支中不斷地 pick + rebase 操作,產生不小的額外工作量,還有可能在 rebase 中丟失代碼。
於是我們在開發完一個完整的模塊后,應該將本地版本庫中存在多次 commit 的工作樹合並為一次 commit,再提交至遠程倉庫。
合並工作樹中的commit
假設當前開發完成的功能模塊有3次commit提交,我們需要將這個完整的模塊推送至遠程倉庫,首先需要將這 3 次 commit 進行合並操作
取這 3 次 commit 的上一個 commit ID 執行 rebase 操作
進入操作面板,可見 Rebase 排序是由倒序排列的,我們可以用 squash (縮寫 s ) 將每次 commit 合並至前一個 commit
鍵入i,將需要合並的 commit 前的 pick 操作 改為 squash
squash 做的事就是把每次 commit 合並到更早的一次 commit,因此最早的分支應該是 pick 操作,因為在這次 Rebase 中它是最早的一次 commit
如果是 squash 將會報錯,如下:
修改后鍵入 :wq 保存退出,假若報錯:
用自己習慣的方式解決此次本地沖突,解決所有沖突之后git status查看:
按提示git rebase --continue:
如果rebase操作沒有代碼沖突保存退出后直接進入日志面板:
仍然是鍵入 i 進入編輯模式,將三次 commit 的工作樹日志合並:
編輯完成后鍵入 :wq 保存退出回到主面板:
使用 git log 查看是否合並成功:
可以看到 rebase 操作后的 3 次 commit 已經合並為一次 commit,並更換了 commit ID
這時就可以 push 到遠程倉庫了,假設之前的三次 commit 已經有進行過 push 操作,那么此次 push 會被檢測到本地工作樹與遠程倉庫的工作樹相異而報錯,
此時可以使用 --force 將本地版本庫強制覆蓋至遠程倉庫: