GitHubをリモートリポジトリとして使用しています。
すでに5つのコミットをサーバーにプッシュしており、それらのコミット前の状態に戻したいと思っています。
コミットハッシュが3425661dba2aadccdbab
の場合、ローカル/リモート全体をそのコミットに戻すにはどうすればよいですか?私は試した
$ reset --hard 3425661dba2aadccdbab
しかし、それは作業ヘッドをそのブランチにリセットするだけで、git pull
を再度実行する必要があります。私はチェックアウトを試みましたが、これにより「分離ヘッド」ブランチに着陸しました。
基本的に、変更を元に戻すには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など)に強制プッシュします。上書きされます。
再び警告のメモ:自分が何をしているのか本当に分からない場合は、このオプションを使用しないでください。正しく行わないと、データ損失につながる可能性があります。最初の透過的に変更を削除しますが、履歴書き換えの厄介な副作用はありません。
git Push -f
。同じレポを使用している他の人がいる場合は、良い考えではありません。
Git checkoutを実行して、目的のブランチにコミットします。これにより、古いコードで新しいコミットが作成されます(したがって、6つのコミットがあります)。
git checkout HEAD~3
、ここで3は元に戻すコミットの数です。
さらに良いことに、単一のファイルを現在のHEADにチェックアウトできます。
git checkout 3425661dba2aadccdbab:path/to/file/from/base
これにより、他の人があなたを怒らせ、その下からことわざのラグを引き抜く可能性が低くなります。
編集:
同様の質問がここにあります:
できるよ git revert <commit>
必要な状態の後に行われたすべてのコミットに対して。 (競合を避けるため、逆の順序で。)
リポジトリを共有している他の人がいる場合、これはクリーンな方法ですが、少し努力が必要です。 (ただし、自動化できます...?)