[譯] 分割一個已存在的 git commit
原文:https://codewithhugo.com/split-an-existing-git-commit/
Git 與其他版本控制系統的主要區別之一,在於其允許使用者重寫歷史。實現這一目的的主要途徑則是 git reabse
,通常還跟隨著一句 git push --force
以用本地歷史重寫遠端歷史。
這裡要談論的是如何用 rebase
、 reset
和 commit
來分割既有的提交。
比方說在一次 commit 中,包含了兩個編輯過的檔案(A 和 B);但你只想把其中的 A 引入當前分支,B 則不需要。
使用 git cherry-pick <commit-hash>
並不可行,因為它會把 A 和 B 的改變都拉過來。
解決方法是將那次 commit 分成兩個,然後只 cherry-pick
包含了 A 的那個。
做法如下:
-
執行
git rebase -i <commit-hash>~
(注意~
),或者git rebase -i <hash-of-previous-commit>
-
在編輯視窗中找到要更改的那次 commit,將其前面的
pick
改成edit
-
儲存並退出 VIM
-
git reset HEAD~
以重置階段性的改變 -
git add [files-to-add]
所有本次需要用到的檔案 (此處就是 A) -
正常的
git commit -m <message>
-
一次或多次的將剩餘的檔案分別提交
-
git add [other-files-to-add]
` -
git commit
-
git rebase --continue
以指示分割過程完成並退出變基操作
最後,就可以用 git cherry-pick <new-commit-hash>
將所需的新提交引入我們的分支中了。