246

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

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

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

私はここで何が間違っているのですか?

4

4 に答える 4

298

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

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

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

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

git revert -m 1 HEAD

git cat-file -p [MERGE_COMMIT_ID]親ブランチを順番に表示します。最初にリストされるのは -m 1 で、2 番目は -m 2 です。

于 2011-05-11T21:48:44.530 に答える
56

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

$ git ローラ
* 2582152 (HEAD、マスター) マージ ブランチ 'otherguy'
|\  
| | * c7256de (otherguy) バー
* | | b7e7176 バズ
|/  
* 9968f79 フー

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

サイコロなしgit revert:

$ git revert HEAD
致命的: コミット 2582152... はマージですが、-m オプションが指定されていません。

チャールズ・ベイリーはいつものように素晴らしい答えを出しました。のように使用git revertする

$ git revert --no-edit -m 1 HEAD
[マスター e900aad] 「マージ ブランチ 'otherguy'」を元に戻す
 0 ファイルの変更、0 挿入 (+)、0 削除 (-)
 削除モード 100644 バー

barの履歴を効果的に削除して生成します

$ git ローラ
* e900aad (HEAD、マスター) 「マージ ブランチ 'otherguy'」を元に戻す
* 2582152 マージ ブランチ 'otherguy'
|\  
| | * c7256de (otherguy) バー
* | | b7e7176 バズ
|/  
* 9968f79 フー

しかし、あなたはマージコミットを捨てたいと思っていると思います:

$ git reset --hard HEAD^
HEAD は現在 b7e7176 baz にあります

$ git ローラ
* b7e7176 (HEAD、マスター) baz
| | * c7256de (otherguy) バー
|/  
* 9968f79 フー

マニュアルに記載されているようにgit rev-parse

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

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

git reset --hard作品を破壊する可能性があるので注意してください。

于 2011-05-11T22:20:08.293 に答える
9

私はこの問題を抱えていました。解決策は、(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

これは、ブランチ y に基づいてマージ-m 1する共通の親に基づいてマージするためです。これは-m 2、チェリーピックしたいものです。

于 2014-10-24T12:56:49.493 に答える