7

うーん...何をしているのか(またはGitが何をしているのか)を本当に知らずに、かなり複雑な変更(サブディレクトリとファイルの名前変更を含む)を誤ってコミットしました。

私は今、次のようなすべてを元に戻したいと思っています:

  1. commit は完全に取り消されます (コミットが一度も行われていないかのように、おそらく履歴からも削除されます)
  2. 現在の作業ディレクトリ (場所.git) を特定のブランチに復元します (今のところ、最後のブランチで十分です)。

git reset --softおよびgit reset --hard への参照を見つけましたが、コマンドを完全に理解せずに時期尚早に使用すると、実際に損害を与える可能性があることをすでに証明しています。:)

git reset の man ページを見つけましたが、次の点についてまだ混乱しています。

  1. とはHEAD?
  2. HEADとはどう違い * masterますか?
  3. 私の状況 (上記参照)--softでは、--hardまたはその他 (さらに 3 つのオプション) を使用する必要がありますか?
  4. git reset反転を「確定」するために別のコマンドを (実行後に) 実行する必要がありますか?

更新:以下の回答を読んだ後:

  1. 私の状況で行う必要があるのは、単一のコマンドを発行することだけであることを正しく理解していgit reset --hard HEAD^ますか?
  2. リバースが正しく実行されたことを確認するにはどうすればよいですか?
4

2 に答える 2

7
  1. HEADチェックアウトされたブランチの最新のコミットです。
  2. masterはブランチ (慣例によりメイン ブランチ)HEADですが、 はチェックアウトされたブランチの履歴内の場所です。HEADあなたがいるブランチに関連しています。
  3. git reset --soft変更を作業ツリーに残し、好きなことを何でもできるようにコミットしません。git reset --hard作業ツリーを、リセット先のコミット時の状態に復元します。
  4. 他のコマンドは必要ありません。

まず、後で調べたい場合に備えてコミットを保持するために、ブランチを作成します。

git checkout -b my_bad_commit

(またはgit branch my_bad_commit、larsman のコメントに記載されているように実行します。)

master次に、またはあなたがいたブランチに戻り、リセットします:

git checkout branch_with_bad_commit
git reset --hard HEAD^

HEAD^ は「HEAD の親」に変換され、HEAD^^ = 2 コミット分スタックすることもできます。このトピックの詳細については、git での取り消しに関する git コミュニティ ブックの章を確認してください。

于 2011-07-08T13:21:41.517 に答える
1
  1. HEAD現在のブランチの先端です
  2. HEADとの違いはmasterHEADブランチをチェックアウト(またはコミット)すると変化することです。
  3. --soft変更をそのままにしておくので、変更したファイルを再追加/コミットしたり、元に戻したりgit checkoutできます。--hard作業領域をリセット先のコミットの状態にリセットします。
  4. あなたの場合ではありませんreset --hard。リモートリポジトリを作成する必要がある場合がありますgit push --force(ただし、行った変更がすでにリモートにある場合は、履歴を書き換えることは強くお勧めしません)。
于 2011-07-08T13:08:33.980 に答える