たとえば、ファイルが存在する可能性のある場所は3つあります。(コミットされた)ツリー、インデックス、および作業コピーです。ファイルをフォルダに追加するだけで、それを作業コピーに追加することになります。
あなたが何かをするとき、あなたはgit add file
それをインデックスに追加します。そして、それをコミットすると、それもツリーに追加されます。
おそらく、次の3つの一般的なフラグを知るのに役立ちますgit reset
。
git reset [- <mode>
] [ <commit>
]
このフォームは、現在のブランチヘッドをにリセットし<commit>
、場合によってはインデックス(のツリーにリセット<commit>
)と、に応じて作業ツリーを更新します<mode>
。これは、次のいずれかである必要があります
。--soft
インデックスファイルにも作業ツリーにもまったく触れません(ただし、<commit>
すべてのモードと同様に、ヘッドをにリセットします)。これにより、git statusが示すように、変更されたすべてのファイルが「コミットされる変更」のままになります。
-混合
インデックスをリセットしますが、作業ツリーはリセットしません(つまり、変更されたファイルは保持されますが、コミットのマークは付けられません)。更新されていないものを報告します。これがデフォルトのアクションです。
- 難しい
インデックスと作業ツリーをリセットします。作業ツリー内の追跡されたファイルへの変更はすべて<commit>
破棄されます。
さて、のようなgit reset HEAD
ことをすると、実際に行っているのはgit reset HEAD --mixed
、ファイルの追加/インデックスへの変更の追加を開始する前の状態にインデックスを「リセット」することです(を介してgit add
)。この場合、作業コピーの状態に関係なく、それを1ビット変更しませんでしたが、ツリーのHEADと同期するようにインデックスを変更しました。以前にコミットされたが変更されたファイルをステージングするために使用されたかgit add
、新しい(以前は追跡されていない)ファイルを追加するために使用されたかはgit reset HEAD
、の正反対ですgit add
。
git rm
一方、作業ディレクトリとインデックスからファイルを削除し、コミットすると、ファイルもツリーから削除されます。git rm --cached
ただし、ファイルはインデックスのみから削除され、作業コピーに保持されます。この場合、ファイルが以前にコミットされていれば、インデックスをツリーのHEADおよび作業コピーとは異なるものにしたため、HEADには以前にコミットされたバージョンのファイルがあり、インデックスにはファイルがありません。すべてであり、作業コピーには最後の変更が含まれています。コミットすると、インデックスとツリーが同期され、ファイルがツリーから削除されます(作業コピーでは追跡されないままになります)。新しい(以前は追跡されていなかった)ファイルを追加するために使用された場合、git add
git rm --cached
は正反対ですgit add
(そして)とほとんど同じですgit reset HEAD
。
Git 2.25では、これらのケースに新しいコマンドが導入されましたgit restore
が、Git 2.28の時点では、動作が変わる可能性があるという意味で、マニュアルページに「実験的」と記載されています。