「git rm --cached x」対「git reset head-x」?


163

GitRef.org-基本

git rmステージング領域からエントリを削除します。これは、git reset HEADファイルの「ステージング解除」とは少し異なります。「アンステージ」とは、ステージング領域を、変更を加える前の状態に戻すことを意味します。 git rm一方、ファイルを完全にステージから外し、次のコミットスナップショットに含まれないようにすることで、ファイルを効果的に削除します。

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

しかし、違いを正確に何であるgit rm --cached asdとはgit reset head -- asd

回答:


219

たとえば、ファイルを配置できる場所は、ツリー、インデックス、作業コピーの3つです。ファイルをフォルダーに追加するだけで、作業コピーに追加されます。

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

おそらく、git resetの3つの一般的なフラグを知るのに役立ちます。

git reset [- <mode>] [ <commit>]

このフォームは、現在のブランチヘッドをにリセットし<commit>、場合によってはインデックス(のツリーにリセットする<commit>)と作業ツリーを更新します<mode>。これは、次のいずれかにする必要があります
。--soft

インデックスファイルや作業ツリーにはまったく触れません(ただし<commit>、すべてのモードと同様に、ヘッドをにリセットします)。これにより、変更されたすべてのファイルが「コミットされる変更」のままになります。

-混合

インデックスをリセットしますが、作業ツリーはリセットしません(つまり、変更されたファイルは保持されますが、コミットのマークは付けられません)。更新されていないものを報告します。これがデフォルトのアクションです。

- ハード

インデックスと作業ツリーをリセットします。以降の作業ツリーで追跡されているファイルへの変更<commit>は破棄されます。

さて、あなたのような何かをするときgit reset HEAD-あなたが実際にやっていることでgit reset HEAD --mixedあり、それはあなたが(を経由してインデックスに変更を加える/ファイルの追加を開始する前にそれがあった状態にインデックス「リセット」されますgit addこの場合、作業コピーとではインデックス(またはステージング)は同期していましたが、リセット後にHEADとインデックスを同期させました。

git rm一方、作業ディレクトリとインデックスからファイルを削除し、コミットすると、ファイルもツリーから削除されます。git rm --cachedただし、ファイルはインデックスからのみ削除され、作業コピーに保持されます。これは、この場合とは正反対ですgit add file 。この場合、HEADおよび作業中とは異なるインデックスを作成し、HEADには以前にコミットされたバージョンのファイルがあり、作業コピーには、HEADのコンテンツまたはファイルとインデックスからファイルを削除した。コミットすると、インデックスとツリーが同期され、ファイルが削除されます。


私は後ことがわかりコマンド任意の差分を表示しませんが、それがまだキャッシュされているかのように、ショーデフ。しかしあるとしてファイルを示しています。一貫性がないようです。git rm --cachedgit diffgit diff --cachedgit statusUntracked
haridsv

7
気にしないで...私が使用している必要がありますgit reset --mixed。とはgit rm --cached正反対の発言に少し戸惑いましたgit add。文字通りにとると、それは正しくなく、損傷を引き起こす可能性があります。私の場合、git add変更されたファイルをステージング領域に追加していて、ファイルの最初の追加ではなく、「その追加」の反対を望んでいました。+グレッグヒューギルの答えは私がより明確な絵を得るのに役立ちました。
haridsv

12
作業コピー、ツリー、および作業ツリーの使用は少し混乱しています。作業ツリーは作業コピーですか、それともツリーですか?
Nealv 2013

3
@haridsvが述べたように、git rm --cached「とは正反対ですgit add file」と言っても誤解を招きます。git reset fileの反対に近いですgit add file
マットブラウン

@Nealvは遅れていますが、このスレッドを見つけた他の人にとっては:作業コピー、ツリー、作業ツリーはすべて同じものを(gitのコンテキストでは)参照します。
De Novo

83

おそらく例が役立つでしょう:

git rm --cached asd
git commit -m "the file asd is gone from the repository"

git reset HEAD -- asd
git commit -m "the file asd remains in the repository"

に何変更していない場合、2番目のコミットは実際には何もしません。


3
HEADの後の二重ハイフンが何を意味するか教えていただけますか?
yuva 2014年

30
@yuva:--コマンドオプションとファイル名を区切るために使用されます。ブランチとという名前のファイルが両方ある場合asdgit reset HEAD asdあいまいになります。--「この次のすべてがファイル名である」と言います。
グレッグ・ヒューギル2014年

git reset HEAD <file>正確に同じgit rm --cached <file>当時とgit add --intent-to-add <file>
アルコールは悪

1
@alcoholisevilいいえ、特別な場合を除きます。この優れた簡潔な答えをご覧ください。
De Novo

45

git rm --cached fileステージからファイルが削除されます。つまり、コミットするとファイルが削除されます。git reset HEAD -- fileステージング領域のファイルを単にHEADコミット時の状態にリセットします。つまり、前回のコミット以降に行った変更を元に戻します。その変更がたまたまファイルを新しく追加している場合、それらは同等です。


7
(他の回答で述べたように)とgit rm --cached fileは正反対の概念と併せてgit add、この回答は私には非常に理にかなっており、かなり簡潔でした。このコメントとほぼ同じです;)
rbatt

2
@rbattは、ここにもコメントを付けて明確にするためのものでgit rm --cached file、の反対ではありませんgit add file。この動作はgit add file、新しい、以前に追跡されていないファイルを追加した特定の場合とは逆になります。他のすべての場合では、の逆git add fileですgit reset HEAD filegit reset HEAD fileまたgit add file、最初のケース(追跡されていないファイルを追加する場合)で反転します。これがgit addを反転したい場合にgitが推奨する理由です。
デ・ノボ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.