22

と の 2 つのブランチがmasterありopenglます。私は最近、ブランチの実装を終了しました (または、少なくとも私はそう思っていました)openglにマージすることにしましたmaster:

git checkout master
git merge opengl
git push

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

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

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

4

2 に答える 2

4

編集:これはOPが要求したものではないことが判明しましたが、誰かたまたま履歴の書き換えを伴う解決策を探した場合に備えて、ここに保持します.


まず、移動後にコミットが「消え」ないように、マージコミットをローカルに保持する場合は、新しいブランチを作成しますmaster

git branch erroneousMerge master

誤ったマージの後に他の開発者もコミットを行った場合は、これも行う必要があります。

master次に、マージ前の最後のコミットを参照するようにリセットします。commit だとしましょうe498b2...:

git checkout e498b2
git branch -f master

これで、修正したものをプッシュできますmaster(このコミットは、リポジトリ内で指しているコミットの先祖であるにもかかわらず-f、サーバーが指しているコミットにブランチをリセットすることを示します):master

git push -f origin master

masterこれで、他の開発者は、サーバーのものと一致するように更新できます (-fブランチが後方に移動したことを受け入れることを示します)。

git fetch -f origin master:master

誤ったマージの後に他の開発者が変更を行った場合 (たとえば、マージ コミットが であるとしましょう。変更を修正済みの に移動するためにabc123使用できます。rebasemaster

git rebase --onto master abc123 oldMaster

ある時点で失敗し、それらを指しているブランチがなくなったために「失われた」コミットになってしまった場合は、 を使用git fsck --lost-foundしてそれらを回復できます。

于 2011-03-21T21:10:58.467 に答える