だから私は他の人とプロジェクトに取り組んでおり、複数のgithubフォークに取り組んでいます。誰かが問題を修正したばかりで、私は彼のフォークと合併しましたが、より良い解決策を見つけることができることに気付きました。作成したコミットを元に戻したい。私はgit revert HEAD
でこれをやろうとしましたが、このエラーが発生しました:
致命的:コミット<SHA1>はマージですが、-mオプションが指定されていません。
どういう意味ですか?マージしてコミットしたときに、-mオプションを使用して「<username>とマージされました」と言いました。
ここで何が間違っていますか?
デフォルトでは、git revert
は実際には意味があいまいであるため、マージコミットの復帰を拒否します。あなたのHEAD
は実際にはマージコミットであると思います。
マージコミットを元に戻したい場合は、メイントランクと見なすマージの親、つまり元に戻すものを指定する必要があります。
多くの場合、これは親番号1になります。たとえば、master
でgit merge unwanted
を実行し、unwanted
のマージを元に戻すことにした場合です。最初の親はマージ前のmaster
ブランチで、2番目の親はunwanted
の先端になります。
この場合、次のことができます。
git revert -m 1 HEAD
他の男が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
は作業を破壊する可能性があるため注意してください。
私はこの問題を抱えていましたが、解決策はコミットグラフ(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に基づいてマージするためです。