質問: --soft オプションは、HEADを動かすだけであり、indexやworking treeは変更しないと説明されています。 でも実際はそれと違う動きをしています。 質問1) 未ステージング状態で `git reset --soft HEAD~` を実行してみると、indexに何やらファイルが現れます。 `git status` 未ステージング状態だったのなら、未ステージング状態のまま維持する動作となるべきと思うのですが、これはどう理解すればいいのでしょうか? 質問2) 色々試した限りでは、 `git reset --soft HEAD~` でindexに現れるファイルは、HEADをコミットした時の内容、では無く、 HEADとHEAD~の差分のように思われます。 例えば、数コミット前に分岐した別ブランチmasterにresetした場合、 `git checkout develop` `git reset --soft master` indexに出現する内容は、develop(commit+index)とmasterの差分になっているようです。 (masterから分岐した以降にdevelopにコミットした内容では無さそう) この「移動先と移動元の差分が現れる」仕様になっているとの理解で合ってるでしょうか? * 確認したバージョン Git for Windows git version 2.12.0.windows.1
回答: git status ではHEADと比較した作業ディレクトリ内の状態を示しているので、HEADだけを変更した場合は作業ディレクトとHEADの内容に差分ができるため、git statusでその差分が表示されるようになります。 ステージングはHEADとインデックスの差分表示になるので、--softでHEADのみが移動した場合は全てステージングされた状態でUnstagingファイル無しの状態になるのが正しいです。 作業ディレクトリを丸ごとコピーしておいて、git reset --soft実行前後のディレクトリの内容を比較して、変更されたファイルの内容を確認してみるとよいと思います。 **【参考】** * git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法 - Qiita * **【おまけ】** * xディレクトリをgitリポジトリにしてファイル登録 * xディレクトリをx.orgにコピー * xディレクトリでgit reset実行 * xディレクトリの状態確認 ![イメージ説明 * xディレクトリとx.orgディレクトリを比較(`WinMergeU -r x.org x`) !イメージ説明 * HEADの内容確認(`refs/heads/master`ファイル) !イメージ説明