web-dev-qa-db-ja.com

なぜgit revertは-mオプションがないと文句を言うのですか?

だから私は他の人とプロジェクトに取り組んでおり、複数のgithubフォークに取り組んでいます。誰かが問題を修正したばかりで、私は彼のフォークと合併しましたが、より良い解決策を見つけることができることに気付きました。作成したコミットを元に戻したい。私はgit revert HEADでこれをやろうとしましたが、このエラーが発生しました:

致命的:コミット<SHA1>はマージですが、-mオプションが指定されていません。

どういう意味ですか?マージしてコミットしたときに、-mオプションを使用して「<username>とマージされました」と言いました。

ここで何が間違っていますか?

141
icnhzabot

デフォルトでは、git revertは実際には意味があいまいであるため、マージコミットの復帰を拒否します。あなたのHEADは実際にはマージコミットであると思います。

マージコミットを元に戻したい場合は、メイントランクと見なすマージの親、つまり元に戻すものを指定する必要があります。

多くの場合、これは親番号1になります。たとえば、mastergit merge unwantedを実行し、unwantedのマージを元に戻すことにした場合です。最初の親はマージ前のmasterブランチで、2番目の親はunwantedの先端になります。

この場合、次のことができます。

git revert -m 1 HEAD
158
CB Bailey

他の男がfooの上にbarを作成したが、その間にbazを作成してからマージし、

$ git lola 
 * 2582152(HEAD、マスター)Merge branch 'otherguy' 
 |\
 | * c7256de(otherguy)bar 
 * | b7e7176 baz 
 |/
 * 9968f79 foo

注: git lola は、非標準ですが便利なエイリアスです。

git revertでサイコロなし:

$ git revert HEAD 
 fatal:Commit 2582152 ...はマージですが、-mオプションが指定されていません。

チャールズベイリーはいつものように 優秀な答え を出した。のようにgit revertを使用する

$ git revert --no-edit -m 1 HEAD 
 [master e900aad] Revert "Merge branch 'otherguy'" 
 0個のファイルが変更され、0個の挿入(+)、0個の削除(-)
削除モード100644 bar

barを効果的に削除し、

$ git lola 
 * e900aad(HEAD、マスター)「Merge branch 'otherguy'」を元に戻します
 * 2582152 Merge branch 'otherguy' 
 |\
 | * c7256de(otherguy)bar 
 * | b7e7176 baz 
 |/
 * 9968f79 foo

しかし、私はあなたがthrow awayマージコミットをしたいと思う:

$ git reset --hard HEAD ^ 
 HEADは現在b7e7176 baz 
 
 $ git lola 
 * b7e7176(HEAD、マスター)baz 
 | * c7256de(otherguy)bar 
 |/
 * 9968f79 foo

git rev-parse manual に記載されているとおり

<rev>^、例: HEAD ^、v1.5.1^0
リビジョンパラメータのサフィックス^は、そのコミットオブジェクトの最初の親を意味します。 ^<n>n-th親を意味します(i.e。<rev>^<rev>^1と同等です)。特別なルールとして、<rev>^0はコミット自体を意味し、<rev>がコミットオブジェクトを参照するタグオブジェクトのオブジェクト名である場合に使用されます。

したがって、git resetを呼び出す前に、HEAD^(またはHEAD^1)はb7e7176で、HEAD^2はc7256de、i.e。であり、それぞれマージコミットの最初と2番目の親です。

git reset --hardは作業を破壊する可能性があるため注意してください。

40
Greg Bacon

私はこの問題を抱えていましたが、解決策はコミットグラフ(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に基づいてマージするためです。

6
shmish111