すでにリモート サーバーにプッシュしている場合 (そして、同じリモート ブランチで作業している他の開発者がいる場合) に留意すべき重要なことは、履歴を書き換えたくないということです。
git reset --hard を使用しないでください
変更を元に戻す必要があります。そうしないと、削除されたコミットが履歴にあるチェックアウトは、次回のプッシュ時にそれらをリモート リポジトリに追加してしまいます。他のチェックアウトは、その後の次のプルでそれらをプルします。
変更をリモートにプッシュしていない場合は、次を使用できます
git reset --hard <hash>
変更をプッシュしたが、誰もそれらをプルしていないことが確実な場合は、使用できます
git reset --hard
git push -f
あなたが変更をプッシュし、誰かがそれらをチェックアウトにプルした場合、あなたはそれを行うことができますが、他のチームメンバー/チェックアウトは協力する必要があります:
(you) git reset --hard <hash>
(you) git push -f
(them) git fetch
(them) git reset --hard origin/branch
しかし、一般的に言えば、それは混乱に変わりつつあります。したがって、元に戻す:
削除するコミットは最新のものです
これはおそらく最も一般的なケースです。あなたは何かをしてしまったのです。
最初に、戻りたいコミットを特定する必要があります。これは次の方法で実行できます。
git log
変更前のコミットを探し、コミット ハッシュに注意してください。-n
フラグを使用して、ログを最新のコミットに制限できます。git log -n 5
次に、他の開発者に見せたい状態にブランチをリセットします。
git revert <hash of first borked commit>..HEAD
最後のステップは、元に戻した変更を再適用する独自のローカル ブランチを作成することです。
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
完了するまで作業を続けてmy-new-branch
から、メインの開発ブランチにマージします。
削除するコミットが他のコミットと混在しています
元に戻したいコミットがすべて揃っていない場合は、おそらく個別に元に戻すのが最も簡単です。もう一度使用しgit log
て、削除するコミットを見つけてから、次のようにします。
git revert <hash>
git revert <another hash>
..
次に、作業を継続するためのブランチを作成します。
git branch my-new-branch
git checkout my-new-branch
git revert <hash of each revert commit> .
もう一度、ハックして、完了したらマージします。
次のようなコミット履歴になるはずですmy-new-branch
2012-05-28 10:11 AD7six o [my-new-branch] Revert "Revert "another mistake""
2012-05-28 10:11 AD7six o Revert "Revert "committing a mistake""
2012-05-28 10:09 AD7six o [master] Revert "committing a mistake"
2012-05-28 10:09 AD7six o Revert "another mistake"
2012-05-28 10:08 AD7six o another mistake
2012-05-28 10:08 AD7six o committing a mistake
2012-05-28 10:05 Bob I XYZ nearly works
ベターウェイ®
特に、複数の開発者が同じブランチで作業することの危険性を認識したので、常に機能ブランチを使用することを検討してください。つまり、何かが完了するまでブランチで作業し、それをメイン ブランチにマージするだけです。また、 git-flowなどのツールを使用して、ブランチの作成を一貫した方法で自動化することも検討してください。