記事ディレクトリ
序文
本記事は、前回の記事「【Git】git resetコマンドの詳細解説(1)」に続き、具体的な例とGitの基になるコマンドを組み合わせて、git resetの基本的な使い方をグラフィックとテキストで詳しく解説します。
git reset commit – ファイル
git reset [<commit>] [--] <file>
このコマンドは、一時保存領域内の <file> で指定されたファイルを、<commit> で指定されたコミット オブジェクトの状態に復元します。注意する必要があるのは次のとおりです。
- <commit> が指定されていない場合、デフォルトで HEAD が指すコミット オブジェクトになります。
- 一時記憶域の <file> で指定されたファイルのみが影響を受けます (git reset [–soft | --mixed [-N] | --hard ] [<commit>] は、一時記憶域のすべてのファイルに影響します)。 .
- –soft および –hard モードは設定できません。そうしないと、エラーが報告されます。
- HEAD のポインティングは変更されません (git reset [–soft | --mixed [-N] | --hard ] [<commit>] は HEAD のポインティングを変更します)。
このコマンドを手で試してみましょう。
作業ディレクトリ (learngit ディレクトリ) の下に newfile.txtx ファイルを作成します。内容は次のとおりです。
This is a new file.
そして、作業ディレクトリの readme.txt ファイルの内容を次のように変更します。
Git is a distributed version control system.
Git is a free software.
Git has a mutable index called stage.
修正した readme.txt ファイルと新しく作成した newfile.txtx ファイルを一時保管場所に追加し、一緒に倉庫に提出します。
コミット履歴は次のとおりです。
最初に git cat-file コマンドを使用して、現在の HEAD が指す送信オブジェクト d4ac459791ee1411bf771cc312092c89de13a1d0 を見てみましょう。
上の図からわかるように、コミット オブジェクト d4ac459791ee1411bf771cc312092c89de13a1d0 は、ツリー オブジェクト f90c81e6736a257d5aad417426cff9c01d135919 を指しています。また、送信オブジェクト d4ac459791ee1411bf771cc312092c89de13a1d0 の親送信オブジェクト、つまり最後の送信の送信オブジェクトは 7b674f020f76a168dbe4bbdec11b1fd137d0b291 です。
引き続き git cat-file コマンドを使用して、ツリー オブジェクト f90c81e6736a257d5aad417426cff9c01d135919 を調べます。
上の図からわかるように、ツリー オブジェクト f90c81e6736a257d5aad417426cff9c01d135919 は、データ オブジェクト 67668a2400494229c8f9dd64ec07ee302378a4cb とデータ オブジェクト 85c4f2db496bd7c17f558258f30474c を指しています。
データ オブジェクト 67668a2400494229c8f9dd64ec07ee302378a4cb とデータ オブジェクト 85c4f2db496bd7c17f558258f354744c3075c6a9 は、前回提出した newfile.txt ファイルと readme.txt ファイルの内容に対応しています。
git ls-files コマンドを使用して、現在の一時ストレージ領域のステータスを確認してみましょう。
上の図からわかるように、一時記憶領域によって現在格納またはポイントされているデータ オブジェクトは、HEAD と一致しています。
ステージング領域を 2 番目のコミットの状態に復元したいとします。
コミット履歴を見てみましょう:
上の図からわかるように、HEAD は 2 番目のコミットのコミット オブジェクト 68b21576f6d85e1a9eb8121e92a31fd87cdafa65 を指しています。
ステージング領域のステータスをもう一度確認しましょう。
上の図のように、仮置き場は2回目の提出時の状態に戻っています。
これは【Git】git resetコマンドの詳細解説(1)で示したものと同じです。
続行する前に、リポジトリを最後のコミットの状態に復元しましょう。
一時ストレージ領域の readme.txt ファイルを 2 回目の送信時の状態に復元したいとします。次のように、git reset コマンドを使用して送信オブジェクトとファイル名を指定できます。
コミット履歴を見てみましょう:
上の図からわかるように、HEAD が指すコミット オブジェクトは変更されていません。
ステージング領域のステータスをもう一度確認しましょう。
上の図からわかるように、一時保存領域の newfile.txt ファイルは、前回の送信時の一時保存領域の newfile.txt ファイルと一致していますが、一時保存領域の readme.txt ファイルは一致しています。エリアは 2 回目の送信時に一時ストレージにフォールバックしました ゾーンの newfile.txt ファイルのバージョン。
作業ディレクトリにある readme.txtx ファイルを開きます。内容は次のとおりです。
Git is a distributed version control system.
Git is a free software.
Git has a mutable index called stage.
上記の試行から、git reset [<commit>] [–] <file> は、一時保存領域内の <file> で指定されたファイルを、<commit> で指定された送信オブジェクトの状態に復元すると結論付けることができます。一時記憶域内の他のファイルに影響を与えたり、HEAD のポインティングを変更したりすることはありません。
作業ディレクトリにあるファイルを復元したい場合はどうすればよいでしょうか? 作業ディレクトリの readme.txt ファイルを 2 回目の送信時の状態に復元するとします。
結果はダメでした!
--soft でもう一度試してみましょう:
同じエラーが報告されました!
要約する
git reset [<コミット>] [–] <ファイル>:
- <commit> が指定されていない場合、デフォルトで HEAD が指すコミット オブジェクトになります。
- 一時記憶域の <file> で指定されたファイルのみが影響を受けます (git reset [–soft | --mixed [-N] | --hard ] [<commit>] は、一時記憶域のすべてのファイルに影響します)。 .
- –soft および –hard モードは設定できません。そうしないと、エラーが報告されます。
- HEAD のポインティングは変更されません (git reset [–soft | --mixed [-N] | --hard ] [<commit>] は HEAD のポインティングを変更します)。