git revert
主要用於還原一個或多個現有提交,並生成一條新的更改記錄。
日常開發過程中,可能會出現要發版的時候,發現master分支上合並了這一期不需要發版的功能點,需要將這些提交還原。
以下是 git 官網 給出的git revert
命令相關的選項。
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>
git revert (--continue | --skip | --abort | --quit)
選項
<commit>...
用於還原指定的某次提交記錄
git revert 版本號
git revert HEAD~3
git revert -n master~5..master~2
對於合並的提交記錄,如果直接使用 git revert 2a06e3ca2840277c6c3d1991f4f815cec0fea546
,則會提示下面的錯誤信息:
error: 提交 2a06e3ca2840277c6c3d1991f4f815cec0fea546 是一個合並提交但未提供 -m 選項。 fatal: 還原失敗
git revert -m 2a06e3ca2840277c6c3d1991f4f815cec0fea546
error: 選項 `mainline' 期望一個大於零的數字
這就需要用到下面的這個命令選項
-m parent-number | --mainline parent-number
該選項主要用於還原 merge
操作產生的記錄。也是我們在工作場景中最容易用到的一個命令。
引自官網原文
Usually you cannot revert a merge because you do not know which side of the merge should be considered the mainline. This option specifies the parent number (starting from 1) of the mainline and allows revert to reverse the change relative to the specified parent.
Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
合並產生的提交記錄會指向兩個父結點:如下圖所示
在還原合並的提交的時候我們要指定以那個父節點為 mainline
本保留該主線的提交記錄。
所以就會出現我們經常會用到的指令:
git revert -m 1 32f842e7542bfb8b5d4dcf8fbe905028b1b99f33
這個命令的具體含義就是還原 feat_revert
分支合並過來的提交記錄。並保留 release-brance
的提交記錄。
我們可以看到在release-brance
分支生成了一個新的提交,提交的內容就是還原了
feat_revert
分支合並過來的提交記錄。
如果執行#2
父節點為 mainline
git revert -m 2 32f842e7542bfb8b5d4dcf8fbe905028b1b99f33
這個命令的具體含義就是還原 release-brance
的提交記錄,並保留feat_revert
分支合並過來的提交記錄。
執行結果如下:
-e | --edit
該選項是默認選項,允許我們修改提交的commit message
。
--no-edit
該選項不允許我們修改提交的commit message
,會直接生成提交信息,並自動提交。
-n | --no-commit
不進行自動提交,默認會自動提交commit
.
sequencer
子命令
--continue
繼續當前的還原操作。在處理完沖突后可以使用這個命令繼續操作。
--skip
跳過當前提交並繼續序列的其余部分。
--quit
退出當前正在進行的操作。可用於在cherry-pick
或revert
失敗后清除sequencer state
。
--abort
取消操作,返回之前的狀態。