2017-03-17 15 views
0

かいつまん:私は最後のコミットの前に行われたマージを元に戻す方法は?

  1. 私は新しい変更をコミット
  2. を吸収合併。

私はマージを取り消したいが、新しい変更を保ちたい。私はgit reset --hard <hash>がコミットを元に戻すことを認識しています.2回実行すると、マージを元に戻します。しかし、新しい変化はどうですか?前もって感謝します。

答えて

0

あなたはそのためrebaseを使用することができます。

git rebase -i HEAD~3 

あなたが例えば2つのコミット#hash1#hash2を削除したい場合は、単に行う、

pick #hash3 Your commit 1 title 
pick #hash2 Your commit 1 title 
pick #hash1 Your commit 1 title 

のようなものがあるでしょう:

pick #hash3 Your commit 1 title 
drop #hash2 Your commit 1 title 
drop #hash1 Your commit 1 title 

保存します。

WARNING
ます(ここでは最古である)コミット#hash3前にリベースとすでにプッシュした場合は、強制フラグをpushする必要があります場合:git push -f。他の人が同じリモートブランチで作業している場合、これは非常に危険です。

+0

マージされたブランチからのすべてのコミットがリベースに表示されます。私はこのアプローチで1つ1つずつ「ドロップ」しなければならないでしょう –

+0

ああ、あなたはマージからたくさんのコミットを持っていますか?さて、あなたはgit reflogを見てみたいかもしれませんが、マージ前に戻ってくるかもしれませんが、私はここであなたを導くことができません – Maxime

1

あなたはgit revert <<sha hash of merge commit>> -m 1

1は残したいマージのメインライン(または親)コミットオブジェクトを示して使用することができます);あなたはレポや枝の少なくとも一人であれば、先に行きます。親2によってもたらされたファイルの変更は、元に戻った結果削除されます。メインライン支店で他のコミットによって行われた変更は影響を受けません。

git cat-file -p <<sha hash of merge commit>>

これは、あなたの両親が表示されます。 git revertコマンドで1オプションが使用されている場合、出力にリストされている最初の親が使用されます。

リバースアプローチの場合のように、このアプローチを使用しても履歴は削除/書き換えられません。

コードを既に共有している場合は、この方法をとってください。そうしないと、将来のコミットで不要なコードを再導入するリスクを他の開発者が負う可能性があります。

共有コードをリベースすると、他の開発者に重複コミットオブジェクトも導入されます。これは非常に怒っています。

元に戻すことの注意点は、後で元のマージから変更を導入したい場合は、元に戻す必要があります。

関連する問題