43

リモートリポジトリとして GitHub を使用しています。

すでに 5 つのコミットをサーバーにプッシュしており、それらのコミット前の状態に戻したいと考えています。

コミット ハッシュが の場合、3425661dba2aadccdbabローカル/リモート全体をそのコミットに戻すにはどうすればよいですか? 私は試した

$ reset --hard 3425661dba2aadccdbab

しかし、それは私の作業頭をそのブランチにリセットしただけで、git pullもう一度やり直す必要があります。チェックアウトを試みましたが、これにより「切り離されたヘッド」ブランチに着陸しました。

4

4 に答える 4

67

変更を元に戻すには、基本的に次の 2 つのオプションがあります。

  1. 逆の変更を適用する新しいコミットを作成します。これは、パブリック リポジトリの履歴を変更しないため、推奨されるオプションです。
  2. コミットを削除し、それらを強制的にプッシュします。

最初のオプションは、次を使用して実現できますgit revert

git-revert - 既存のコミットを元に戻す

1 つまたは複数の既存のコミットがある場合、関連するパッチによって導入された変更を元に戻し、それらを記録するいくつかの新しいコミットを記録します。

例は次のようになりますgit revert -n HEAD~5..HEAD。このコマンドは 5 つの新しいコミットを作成し、それぞれが現在チェックアウトされているブランチの最後の 5 つのコミットの 1 つを取り消します。

2 番目のオプションは、実際にコミットを削除することです。これにより、リポジトリ内の履歴が変更されることに注意してください。そのため、すでに変更を行っている人はおそらくかなり驚かれることでしょう。そうは言っても、あなたはできる

git reset --hard HEAD~5
git push --force

最初のコマンドは、現在の作業コピー内のコミットされていない変更を消去します。ローカル リポジトリを現在の HEAD - 5 コミットの状態にリセットします。2 番目のコマンドは、デフォルトのリモート (つまり GitHub) に強制的にプッシュします。現在のローカル リポジトリから分岐した変更はすべて上書きされます。

もう一度警告します。何をしているのかよくわからない場合は、このオプションを使用しないでください。正しく行わないと、自分や他の人のデータが失われる可能性があります。変更を透過的に削除しますが、履歴書き換えの厄介な副作用がないため、代わりに最初のオプションを使用してください。

于 2011-08-07T09:05:23.930 に答える
4

git revert <commit>必要な状態の後に行われたすべてのコミットに対して実行できます。(競合を避けるために逆の順序で。)

レポを共有している他の人がいる場合、これはクリーンな方法ですが、少し面倒です。(自動化はできますが...?)

于 2011-08-07T09:05:41.133 に答える
3

を行いますgit push -f。同じレポを使用している他の人がいる場合は、お勧めできません。

于 2011-08-07T08:59:29.340 に答える
2

git checkout を実行してから、必要なブランチにコミットします。これにより、古いコードで新しいコミットが作成されます (つまり、6 つのコミットがあります)。

git checkout HEAD~3、ここで 3 は、元に戻したいコミットの数です。

さらに良いことに、単一のファイルを現在の HEAD にチェックアウトできます。

git checkout 3425661dba2aadccdbab:path/to/file/from/base

これにより、他の人が、ことわざの敷物を足元から引き抜くことに腹を立てる可能性が低くなります。

編集:

ここに同様の質問があります:

古いコミットをチェックアウトして新しいコミットにする

于 2011-08-07T09:02:45.657 に答える