2011-05-11 67 views
98

因此,我正在與其他人一起開展一個項目,並且有多個github正在進行工作。有人解決了一個問題,我把他的叉子合併,但後來我意識到我可以找到更好的解決方案。我想恢復我剛剛提交的提交。我試圖用git revert HEAD這樣做,但它給了我這個錯誤:爲什麼git回覆抱怨缺少-m選項?

fatal: Commit <SHA1> is a merge but no -m option was given.

這是什麼意思?當我合併並提交時,我確實使用了-m選項來說「合併< username>」。

我在這裏做錯了什麼?

回答

107

默認情況下,git revert拒絕恢復合併提交,因爲實際上這意味着模糊不清。我認爲你的HEAD實際上是一個合併提交。

如果你想恢復合併提交,你必須指定你想要考慮的合併的哪一個父主幹,即你想要恢復的東西。

通常這將是父頭號,例如,如果你在master,做git merge unwanted,然後決定恢復的unwanted合併。第一個父母將是您的合併前master分支,第二個父母將是unwanted的小費。

在這種情況下,你可以這樣做:

git revert -m 1 HEAD 
+3

好的謝謝。我發現只需更改受合併影響的兩個文件,然後再提交一些其他更改也更容易。 – icnhzabot 2011-05-11 22:11:31

+19

我在哪裏可以找到有關我是否必須使用-m1或-m2,...的信息? – 2016-07-18 08:51:35

+10

'git cat-file -p [MERGE_COMMIT_ID]'將按順序顯示父分支。列出的第一個是「-m 1」,第二個是「-m 2」。 – nostromo 2016-10-12 05:23:56

34

說於foo的頂部其他人創造了吧,但你創造了同時巴茲然後合併,給人

$ git lola 
* 2582152 (HEAD, master) Merge branch 'otherguy' 
|\ 
| * c7256de (otherguy) bar 
* | b7e7176 baz 
|/ 
* 9968f79 foo
歷史

注:git lola是一個非標準但有用的別名。

git revert沒有骰子:

$ git revert HEAD 
fatal: Commit 2582152... is a merge but no -m option was given.

查爾斯·貝利發表了excellent answer如常。使用git revert

$ git revert --no-edit -m 1 HEAD 
[master e900aad] Revert "Merge branch 'otherguy'" 
0 files changed, 0 insertions(+), 0 deletions(-) 
delete mode 100644 bar

有效地刪除bar和產生的

$ git lola 
* e900aad (HEAD, master) Revert "Merge branch 'otherguy'" 
* 2582152 Merge branch 'otherguy' 
|\ 
| * c7256de (otherguy) bar 
* | b7e7176 baz 
|/ 
* 9968f79 foo

歷史,但我懷疑你想扔掉這次合併提交:

$ git reset --hard HEAD^ 
HEAD is now at b7e7176 baz 

$ git lola 
* b7e7176 (HEAD, master) baz 
| * c7256de (otherguy) bar 
|/ 
* 9968f79 foo

作爲記錄git rev-parse manual

<rev>^ , e.g. HEAD^, v1.5.1^0
A suffix ^ to a revision parameter means the first parent of that commit object. ^<n> means the n-th parent (i.e.<rev>^ is equivalent to <rev>^1). As a special rule, <rev>^0 means the commit itself and is used when <rev> is the object name of a tag object that refers to a commit object.

所以調用之前git resetHEAD^(或HEAD^1)爲b7e7176和HEAD^2是c7256de,,分別合併的第一和第二父母提交。

小心git reset --hard因爲它可以摧毀工作。

+2

這是一個混亂起來,混亂起來,震動世界。除了蘿拉。感謝百萬這個奇妙的別名。 – Barney 2016-01-28 14:52:22

3

我有這個問題,解決方法是看提交圖(用gitk來),看看我有以下幾點:

* commit I want to cherry-pick (x) 
|\ 
| * branch I want to cherry-pick to (y) 
* | 
|/ 
* common parent (x) 

我現在明白了,我想要做的

git cherry-pick -m 2 mycommitsha 

這是因爲-m 1將基於共同的父母進行合併,其中-m 2基於分支y合併,這是我想要挑選的分支。

+0

有人可以評論他們爲什麼downvoted這個? – shmish111 2016-04-13 10:06:35

+0

可能是因爲它與'git-revert'沒有關係,這是這個問題的關鍵。 – pnomolos 2016-05-09 16:52:02

+0

我認爲這個問題是關於'-m'選項的,不是專門關於'git merge'的。也就是說,使用'-m'選項背後的原因看起來與恢復和櫻桃選擇類似。如果不是這樣,請告訴我們。由於我沒有發現任何其他問題,特別是櫻桃挑選使用它,感謝這個答案,這可能導致谷歌幫助我找到這個問題和有用的,相關的討論! – nealmcb 2017-11-30 15:54:23