master
とopengl
の2つのブランチがあります。私は最近opengl
ブランチの実装を完了し(または少なくともそう考えました)、それをmaster
にマージすることを決定しました:
git checkout master
git merge opengl
git Push
私がこれを行った後、master
ブランチで作業している何人かの開発者が私の変更をプルし、私の実装がいくつかのコードと競合することがわかりました。したがって、master
ブランチのマージ操作を元に戻したいのですが、履歴を上書きしません。
opengl
ブランチをmaster
にマージできるようにしたいことに注意してください(すべてのバグを修正した後)。したがって、古いバージョンのmaster
をチェックアウトしてコミットするだけでは機能しません。新しく作成したコミットでは、マージしようとしたときにopengl
からの変更がキャンセルされます。
ありがとうございました。
文書「 誤ったマージを元に戻す方法cebewee が言及」は、マージを元に戻すときにgit revertが難しい理由を説明しています。
したがって、マージは引き続き存在し、2つのブランチを結合していると見なされ、今後のマージでは、そのマージが最後の共有状態として表示されます-持ち込まれたマージを元に戻しても、影響はありません。
「元に戻す」を「元に戻す」と考えると、この部分の復帰を常に見逃すことになります。
はい、データを元に戻しますが、いいえ、履歴を元に戻しません。
git revert
はここでの正しい解決策ですが、そのブランチを再度マージしたいときに将来的に重要になります。
次に、次のマージでは、最初に「復帰を元に戻す」必要があり、次にブランチをマージする必要があります。
編集:これは、OPが要求したものではないと判明しましたが、誰かがすべき場合に備えて、ここに保持しますたまたまdoesが履歴の書き換えを伴う解決策を探します。
最初に、マージコミットをローカルに保持したい場合は、新しいブランチを作成して、master
を移動した後にコミットが「消えない」ようにします。
git branch erroneousMerge master
他の開発者も、誤ったマージの後にコミットを行った場合は、これも行う必要があります!
次に、master
をリセットして、マージ前の最後のコミットを参照します。コミットだとしましょうe498b2...
:
git checkout e498b2
git branch -f master
これで、修正されたmaster
をプッシュできます(-f
は、サーバーにmaster
ブランチをリセットさせたいことを示します。 commitは、リポジトリ内で指すものの祖先です):
git Push -f Origin master
これで、他の開発者はmaster
をサーバーのそれに一致するように更新できます(-f
は、ブランチが後方に移動したことを受け入れることを示します):
git fetch -f Origin master:master
他の開発者が誤ったマージの後に変更を加えた場合(マージコミットがabc123
であるとしましょう)、彼らはrebase
を使用して変更を修正されたmaster
に移動できます:
git rebase --onto master abc123 oldMaster
ある時点で失敗し、それらを指すブランチがなくなったために「失われた」コミットが発生した場合は、git fsck --lost-found
を使用してそれらを回復できます。