2011-02-14 157 views
83

如何恢復git中的一系列提交?從查看gitrevisions文檔,我看不到如何指定我需要的範圍。例如:恢復git中的一系列提交

A -> B -> C -> D -> E -> HEAD 

我想做的相當於:

git revert B-D 

它的結果將是:

A -> B -> C -> D -> E -> F -> HEAD 

其中F包含B-d包容性的逆轉。

+0

邁向gitrevisions(7)頁的端部,有爲首的部分「指定覆蓋範圍」。你想要什麼與那裏描述的不同? – 2011-02-14 11:30:43

+1

gitrevisions頁面顯示'git revert A..​​D'會做我想做的事。但是,當我嘗試,我得到的錯誤「致命的:無法找到'A..D'」 – 2011-02-14 11:36:48

+0

[Git恢復多個提交](http://www.singhajit.com/git-revert-multiple-commits/) – 2016-02-11 18:50:23

回答

108

你使用的是什麼版本的Git?

僅在Git1.7.2 +中支持多個提交才能恢復:有關更多詳細信息,請參閱「Rollback to an old commit using revert multiple times.」。
當前git revert man page僅針對當前 Git版本(1.7.4+)。


正如評論OP Alex Spurling報告:

升級到1.7.4工作正常。
要回答我的問題,這是我一直在尋找的語法:

git revert B^..D 

B^指「第一父提交B的」:即允許包括在復歸B
見「git rev-parse SPECIFYING REVISIONS section」,其中包括了<rev>^, e.g. HEAD^語法:多見於「What does the caret (^) character mean?」)

注意,每個回覆提交單獨提交。

Henrik N明確了the comments

git revert OLDER_COMMIT^..NEWER_COMMIT 

如下圖所示,你可以不提交馬上回復:

git revert -n OLDER_COMMIT^..NEWER_COMMIT 
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT" 
+1

謝謝那就是答案。升級到1.7.4可以正常工作。爲了回答我自己的問題,這是我正在尋找的語法: git revert B^.. D – 2011-02-14 14:56:14

+1

@Alex:太棒了!我已將您的評論納入我的回答。 – VonC 2011-02-14 15:04:18

-1

使用git rebase -i壁球相關的提交到一個。然後你只需要一次提交即可恢復。

4

git revert OLDER_COMMIT^..NEWER_COMMIT我沒有工作,我用git revert -n OLDER_COMMIT^..NEWER_COMMIT,一切都很好,我使用Git版本1.7.9.6

3

如果要恢復承諾b到d的(至少在Git版本2)在一個單一提交,你可以做

git revert -n B^..D 

這種恢復通過提交從B的父母所做的更改提交(不包括)提交給D提交(包含),但不會對已還原的更改創建任何提交。恢復只修改工作樹和索引。

不要忘記之後

git commit -m "revert commit range B to D" 

提交更改,也可以轉而多個無關提交的單一提交,使用同樣的方法。例如恢復B和d但不是C

git revert -n B D 
git commit -m "Revert commits B and D" 

參考:https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

感謝Honza Haeringcorrection