だから私はかなり大きな間違いを犯しました。私はコミットを行い、プルし、マージしました(しかし、そうしている間にコードを台無しにしました)、そしてプッシュしました。そのマージをやり直して、コードを正しくしたいと思います。これを行う方法はありますか?
私はbitbucketを使用しています。
だから私はかなり大きな間違いを犯しました。私はコミットを行い、プルし、マージしました(しかし、そうしている間にコードを台無しにしました)、そしてプッシュしました。そのマージをやり直して、コードを正しくしたいと思います。これを行う方法はありますか?
私はbitbucketを使用しています。
回答:
これが「祝福された」方法であるかどうかはわかりませんが、「プッシュを強制する」などの重大なことをせずに同じ問題を解決するために私がやったことです。
履歴が次のようなものであると仮定しましょう(そして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にmasterに加えられた変更を無視し、変更がマージ結果になるように強制します: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
そして、あなたはそれを持っています!履歴を無効にすることなく、マージを再実行できました!
次のようにできます:
あれは:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
git push --force
リモートブランチで持っていたものは何でも書き換えられることに注意してください。そのブランチを使用している他の人もこの影響を受けます。(通常、これを行うべきではありません。)
git push --force
安全ではない
git merge --abort
そして、あなたは再びマージすることができます
あなたに役立つこの希望を確認してください
https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html