web-dev-qa-db-ja.com

GitHub-変更を以前の状態に戻す方法

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

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

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

$ reset --hard 3425661dba2aadccdbab

しかし、それは作業ヘッドをそのブランチにリセットするだけで、git pullを再度実行する必要があります。私はチェックアウトを試みましたが、これにより「分離ヘッド」ブランチに着陸しました。

39
Zhen

基本的に、変更を元に戻すには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など)に強制プッシュします。上書きされます。

再び警告のメモ:自分が何をしているのか本当に分からない場合は、このオプションを使用しないでください。正しく行わないと、データ損失につながる可能性があります。最初の透過的に変更を削除しますが、履歴書き換えの厄介な副作用はありません。

61
Holger Just

git Push -f。同じレポを使用している他の人がいる場合は、良い考えではありません。

3
Chandra Sekar

Git checkoutを実行して、目的のブランチにコミットします。これにより、古いコードで新しいコミットが作成されます(したがって、6つのコミットがあります)。

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

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

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

これにより、他の人があなたを怒らせ、その下からことわざのラグを引き抜く可能性が低くなります。

編集:

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

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

2
beatgammit

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

リポジトリを共有している他の人がいる場合、これはクリーンな方法ですが、少し努力が必要です。 (ただし、自動化できます...?)

2
Sailesh