Git でマージをやり直す方法はありますか?

Git でマージをやり直す方法はありますか?

かなり大きなミスを犯してしまいました。コミットし、プルし、マージし (ただし、その際にコードを台無しにしました)、プッシュしました。そのマージをやり直して、コードを正しくしたいと思います。これを行う方法はありますか?

私は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

次のように実行できます。

  1. マージ前のコミットにリセットします。
  2. マージを再度実行する
  3. 強制プッシュ

あれは:

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を前提としています)

  1. redo-branch完全に統合される必要があり、
    統合後にredo-branch他の合併はない
  2. redo-branch完全に統合される必要があり、
    統合後にredo-branchは既にその他の合併、それは維持されるべきである
  3. redo-branch長寿の枝繰り返しマージされ、
    修正範囲のみだった合併の一部そして
    マスター上の他のコミット/マージ失敗したマージ後(痛い

(3)の設定は

---A--B--C--M   (master points here)
  /        /
-X--D-----E--Y  (that's the long-living redo-branch)
  1. 解決策は大丈夫でしょうhttps://superuser.com/a/691497/308385
  2. 1と同じ解決策が機能する可能性がある
  3. 始めましょう :-)
# 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

関連情報