2011-07-08 18 views
7

Uh oh ...私がやっていることを本当に知らなくても(間違いなくサブディレクトリとファイルの名前変更を含む) 。私は今、このようなことをすべて元に戻したいGit:コミットを元に戻す方法と最後のブランチに戻す

  1. は(それが行われていなかった かのようにも歴史からそれを削除し、おそらく を)完全に逆転されたコミットを
  2. は、現在の作業ディレクトリ を復元します(.git)を特定の ブランチに変更します(最後は現在)。

私はgit reset --softgit reset --hardへの参照が見つかりましたが、私はすでに私が途中で完全にそれを理解せずにコマンドを使用して、実際の被害を行うことができますことを自分自身に証明されています。 :)

私はgit reset man pageを見つけましたが、私はのようまだ混乱しています:HEADは何

  1. HEAD* masterの違いは何ですか?
  2. 私は が--soft--hardまたは (他のオプションが3個あります)を使用する必要がありますか?
  3. 別のコマンドを実行する必要がありますか (git resetを実行した後) は「終了」しますか?

UPDATE:は、下の答えを読んだ後:

  1. 私は私が私の状況で実行する必要があり すべてが単一のコマンドgit reset --hard HEAD^問題 であることを正しく理解していますか?
  2. 逆転が が正しく実行されたことを確認するにはどうすればよいですか?
+2

gitを学んでいるので、2冊の本をお勧めします:[git community book](http://book.git-scm.com/index .html)と[pro git](http://progit.org/book/)があり、どちらも完全にオンラインです。 – shelhamer

+0

@Shelhamerありがとう! – WinWin

答えて

7
  1. HEAD最新のチェックアウトブランチのコミットです。
  2. masterはブランチ(慣例によりメインブランチ)であるのに対し、HEADはチェックアウトされたブランチの履歴内のロケーションです。 HEADは、現在のブランチを基準にしています。
  3. git reset --softあなたの好きなことをやりなおすためにコミットされていない作業ツリーに変更を残します。 git reset --hardは、作業ツリーをリセットしたコミット時の状態に復元します。
  4. 他のコマンドは必要ありません。

まず、枝作り、あなたが後でそれを点検したい場合にコミットを維持する:(または代わりlarsmanさんのコメントで述べたようにgit branch my_bad_commitを行う)

git checkout -b my_bad_commit 

その後復帰masterにまたはあなたが上だったものは何でもブランチとリセット:

git checkout branch_with_bad_commit 
git reset --hard HEAD^ 

HEAD ^「Pに変換しますあなたはHEADのためにスタックすることもできます^^ = 2はコミットします。このトピックの詳細については、gitコミュニティブックの章を参照してください。undo in git

+1

'checkout -b; checkout'シーケンスは、単一の 'branch'コマンドを使って行うことができます。 –

+0

言及しておくとよい点があります。私はたくさんのエイリアスを持っています。私は 'git cob new_branch_name'を実行するだけで、時には本当のものを忘れてしまいます。 – shelhamer

+0

@Shelhamer 'git checkout master' **と** git reset --hard HEAD ^'の両方を実行すると、2つのコミットが返されます。これは私が望んでいたものではありません。私は後ろに行く必要があっただけです。私の質問では何かが明らかではないはずです。 – WinWin

1
  1. HEADtip of the current branchです。
  2. HEADmasterの違いは、ブランチ(またはコミット)をチェックアウトするとHEADが変更されることです。
  3. --softは変更を残しますので、変更したファイルに対してgit checkoutを実行して、それらを再追加/コミットしたり元に戻したりすることができます。 --hardは、作業領域をリセットするコミットの状態にリセットします。
  4. あなたはreset --hardではありません。リモートリポジトリにはgit push --forceが必要かもしれません(しかし、変更が既にリモートにある場合は、書き換え履歴は絶対に避けてください)。
+0

ありがとう+1。幸いにも、私はまだ何もプッシュしていません。ですから、 'git reset -hard HEAD ^'だけで私のトリックができますか? – WinWin

+2

最後のコミットだけを元に戻したい場合は、「はい」を選択します。 'git reset --hard'の前に' git branch mistake'を実行することもできます。何かがうまくいかない場合は、誤ってマージして誤ったコミットを取り戻すことができます。 –

+0

非常に長い間CVSを使ってきたOMG、私はgitのこの世界では新人のような気がします。 :) – WinWin

関連する問題