基於 GitFlow 工作流,可能某個提交(commit)導致了 bug,或者有多個提交需要返工,此時你就會用到刪除提交。
接下來的內容都基於下面這張 git log 提交記錄圖來寫。
刪除最后的提交
當需要刪除最新的提交、或最最近的幾個提交。比如刪除 1 或者 1~3 的提交,使用 git reset命令。
我們需要關注一下 git reset的 --hard 和 --soft 參數。
舉個例子刪除最近兩個提交看看:
git reset --soft commit~3 ,然后 git status
雖然刪除了最近兩個提交記錄,但是還保存了提交所做的更改。那么你可能也想到了
--hard就是刪除提交記錄並不保存所刪除記錄所做的更改。所以,使用
--hard要注意這些更改是否真的不要保存。
刪除提交記錄中間的提交
如果想要刪除的提交不是最近的記錄,而是在提交記錄列表中間的一個或者多個,那么我們應該如何處理呢?
其中刪除提交列表中間的 commit 又分為兩種:刪除中間連續的幾個 commit 或者刪除不連續的commit 。
舉個栗子,你可能需要刪除上圖中的:commit3,commit4,commit~5;不連續的提交記錄為 commit3,commit5 。那么 Git 是如何處理的呢?
** 刪除提交記錄列表中間一個或連續多個的提交用 rebase,不連續的使用 cherry-pick **
在這里我們只需要記住 rebase 就可以了。因為想要刪除提交記錄中間不連續的多個提交記錄也可以變換為刪除“提交列表中間的一個提交”,我們重復幾次“提交列表中間的一個提交”的操作就可以了。所以,記住 rebase 的方法即可。
使用 rebase
首先貼一下我們需要用到的命令:
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
接着我們來刪除上圖中的第二、第三個 commit:
-
git log看一下執行命令前的提交記錄列表[紅色部分表示即將要刪除的commit]
git log - 然后開始刪除提交記錄2,3[執行 rebase 時會可能遇到沖突,解決沖突不在本文描述范圍]
git rebase onto -
git log看一下刪除2,3 commit 之后的提交記錄列表。
對比一下刪除提交記錄前的 git log ,是不是 commit2,3 不見了呢。那么到這我們就完成任務了。
git log
文章來源:查看
