
かなり大きなミスを犯してしまいました。コミットし、プルし、マージし (ただし、その際にコードを台無しにしました)、プッシュしました。そのマージをやり直して、コードを正しくしたいと思います。これを行う方法はありますか?
私はbitbucketを使います。
答え1
これが「祝福された」方法であるかどうかはわかりませんが、「強制的にプッシュ」したり、そのようなひどいことをしたりせずに同じ問題を解決するために私が行ったことは次のとおりです。
履歴が次のようになっていると仮定します (M は失敗したマージです)。
-A--B--C--M (master points here)
\ /
D----E
実行git checkout -b merge_fix <commit ID E>
すると、間違いが発生する前にブランチが作成されます。
-A--B--C--M (master points here)
\ /
D----E (HEAD and merge_fix point here)
さて、新しいブランチでマージをやり直しましょう。 をそのままマージすることはできないmaster
ので、間違ったマージの前のコミットを手動で選択する必要があります。git merge <commit ID C>
前回と同じ間違いをしないようにしてください。
-A--B--C--M (master points here)
\ X
D----E-G (HEAD and merge_fix point here)
コミットがG
問題ないと仮定すると、今度はブランチのトップと同期したいと思いますmaster
。このコマンドは、git に、マスターに加えられた変更を無視し、変更をマージ結果に強制するように指示します。git merge -s ours master
-A--B--C--M (master points here)
\ X \
D----E-G--H (HEAD and merge_fix point here)
最後に、(再びコミットが適切であると仮定して)修正したマージを含めるようにH
早送りします。master
git checkout master
git merge merge_fix
これは実際にはmaster
分岐ポインタを に移動するだけですH
が、この機会に ASCII アートを少し整理してみましょう。
-A--B--C--M--H (HEAD, master, and merge_fix all point here)
\ X /
D----E--G
これで完了です。履歴を無効にすることなく、マージを正常にやり直すことができました。
答え2
次のように実行できます。
- マージ前のコミットにリセットします。
- マージを再度実行する
- 強制プッシュ
あれは:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
git push --force
リモート ブランチにあったものはすべて書き換えられるため、そのブランチを使用している他のユーザーも影響を受ける可能性があることに注意してください。(通常はこれを行わないでください。)
答え3
git merge --abort
そして再び合流できる
答え4
私の場合は、少し複雑な別の設定をしていました。
基本的に3つの出発点があります。(他の解決策はすべて1または2を前提としています)
redo-branch
完全に統合される必要があり、
統合後にredo-branch
は他の合併はないredo-branch
完全に統合される必要があり、
統合後にredo-branch
は既にその他の合併、それは維持されるべきであるredo-branch
は長寿の枝繰り返しマージされ、
修正範囲のみだった合併の一部そして
、マスター上の他のコミット/マージ失敗したマージ後(痛い)
(3)の設定は
---A--B--C--M (master points here)
/ /
-X--D-----E--Y (that's the long-living redo-branch)
- 解決策は大丈夫でしょうhttps://superuser.com/a/691497/308385
- 1と同じ解決策が機能する可能性がある
- 始めましょう :-)
# let's start on the last commit before the failed merge
git checkout redo-branch
git checkout -b D^1 new-branch-for-merge
# now let's pick all the revisions D through E
git cherry-pick D^1..E
# go to the target branch (master) and merge
git checkout master
git merge new-branch-for-merge