web-dev-qa-db-ja.com

Git:履歴を上書きせずにブランチのマージを元に戻すには?

masteropenglの2つのブランチがあります。私は最近openglブランチの実装を完了し(または少なくともそう考えました)、それをmasterにマージすることを決定しました:

git checkout master
git merge opengl
git Push

私がこれを行った後、masterブランチで作業している何人かの開発者が私の変更をプルし、私の実装がいくつかのコードと競合することがわかりました。したがって、masterブランチのマージ操作を元に戻したいのですが、履歴を上書きしません。

openglブランチをmasterにマージできるようにしたいことに注意してください(すべてのバグを修正した後)。したがって、古いバージョンのmasterをチェックアウトしてコミットするだけでは機能しません。新しく作成したコミットでは、マージしようとしたときにopenglからの変更がキャンセルされます。

ありがとうございました。

17

文書「 誤ったマージを元に戻す方法cebewee が言及」は、マージを元に戻すときにgit revertが難しい理由を説明しています。

したがって、マージは引き続き存在し、2つのブランチを結合していると見なされ、今後のマージでは、そのマージが最後の共有状態として表示されます-持ち込まれたマージを元に戻しても、影響はありません。
「元に戻す」を「元に戻す」と考えると、この部分の復帰を常に見逃すことになります。
はい、データを元に戻しますが、いいえ、履歴を元に戻しません。

git revertはここでの正しい解決策ですが、そのブランチを再度マージしたいときに将来的に重要になります。
次に、次のマージでは、最初に「復帰を元に戻す」必要があり、次にブランチをマージする必要があります。

18
VonC

編集:これは、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を使用してそれらを回復できます。

4