1. ホーム
  2. git

[解決済み] 「git rm --cached x" vs "git reset head -- x"?

2022-04-29 01:52:18

質問

GitRef.org - 基本 :

git rm からエントリを削除します。 ステージング・エリア これは から git reset HEAD のように、quot;unstages" のファイルです。ステージを解除することで ステージング・エリアを元の状態に戻す を、修正する前の状態です。 git rm 一方 は、ファイルをステージから完全に削除するため に含まれないようにする。 コミットスナップショット、それによって効果的に を削除します。

デフォルトでは git rm file は、ステージング・エリアからファイルを完全に削除し、ディスク> (作業ディレクトリ)からも削除します。作業ディレクトリにファイルを残すには git rm --cached .

しかし、具体的にどのような違いがあるかというと git rm --cached asdgit reset head -- asd ?

解決方法は?

例えば、あるファイルがある場所は、(コミットされた)ツリー、インデックス、作業コピーの3つです。ファイルをフォルダに追加するだけでは、作業コピーに追加していることになります。

のようにした場合 git add file を使用すると、それをインデックスに追加します。そして、それをコミットすると、ツリーにも追加されます。

の3つの一般的なフラグを知っておくと、きっと役に立ちます。 git reset :

<ブロッククオート

git reset [--]です。 <mode> ] [ <commit> ]

このフォームは、現在のブランチヘッドを <commit> そして場合によっては のツリーにリセットする)。 <commit> と に依存する作業ツリー <mode> のいずれかでなければならない。 のようなものです。

--ソフト

インデックスファイルや作業ツリーには全く触れません。 になります。 <commit> 他のモードと同じように)。この場合、すべての 変更されたファイルは、git status にあるように "コミットされる変更" となります。

--ミックス

インデックスをリセットするが、作業ツリーはリセットしない(つまり、変更されたファイル は保存されますが、コミットのマークは付きません)、未対応のものを報告します。 更新されます。これはデフォルトの動作です。

--hard

インデックスと作業ツリーをリセットします。インデックスと作業木をリセットします。 からの作業ツリー <commit> は破棄されます。

さて、次のようなことをすると git reset HEAD 実際にやっていることは git reset HEAD --mixed を実行すると、インデックスをリセットして、 ファイルを追加したりインデックスに変更を加えたりする前の状態にします (via. git add ). この場合、作業コピーの状態がどうであれ、あなたはそれを少しも変更していませんが、ツリーのHEADと同期するようにインデックスを変更したのです。 かどうか git add は、以前にコミットしたが変更されたファイルをステージングするため、または新しい (以前は追跡されていなかった) ファイルを追加するために使用されました。 git reset HEAD とは正反対です。 git add .

git rm 一方、Commit を実行すると、作業ディレクトリとインデックスからファイルが削除され、ツリーからもファイルが削除されます。 git rm --cached しかし、インデックスだけからファイルを削除し、作業コピーには残します。この場合 は、そのファイルが以前にコミットされていた場合。 にしたのであれば、インデックスを 異なる ツリーの HEAD と作業コピーから、HEAD には前にコミットしたバージョンのファイルがあり、インデックスには いいえ ファイルには全く存在せず、作業コピーにはその最終更新があります。今コミットすると、インデックスとツリーが同期され、ファイルはツリーから削除されます (作業コピーには追跡されないままです)。 いつ git add は、新しい(それまで追跡されていなかった)ファイルを追加するために使用された場合 git rm --cached とは正反対です。 git add (とほぼ同じです)。 git reset HEAD ).

Git 2.25 では、このようなケースに対応する新しいコマンドを導入しました。 git restore しかし Git 2.28 では、動作が変わる可能性があるという意味で、man ページで "experimental" と説明されています。