gitのインデックスからファイルを削除するにはどうすればよいですか?


355

ファイルシステムから削除せずに、インデックスからファイルを削除する方法(=ステージング領域=キャッシュ)?


5
「以前の状態にリセットする」または「そのファイルがもう必要ないので削除する」という意味ですか?
Andrew Aylett、2010

私の場合、以前にファイルが存在しなかったので同じです...
hcs42

回答:


504

あなたが欲しい:

git rm --cached [file]

--cachedオプションを省略すると、作業ツリーからも削除されます。ステージングされたコンテンツがブランチの先端またはディスク上のファイルのいずれとも一致しない場合は警告が表示されるため、git rmは少し安全git resetです。(そうでない場合は、を追加する必要があります--force。)


8
これは、たとえば、.gitignoreに組み込まれなかったいくつかのビルド中間ファイルまたはローカル構成ファイルを誤ってチェックインした場合にもうまく機能します。使用しgit rm --cached、レポからそれらを削除する.gitignore、ステージに関連するファイルやディレクトリを追加し、通常どおりコミット。これらはリポジトリから削除されますが、ローカルツリーにはそのまま残り、誤って再度チェックインすることはありません。
Ionoclast Brigham 2014

22
これにより、コミットしてプッシュした後、リポジトリ(リモート)からファイルも削除されます。
powder366

6
これはインデックスから削除しませんが、インデックスで削除済みとしてマークします。
JotaBe

4
この回答は、(@ powder366で既に述べたように)意図した結果ではないファイルをリポジトリから削除するため、おそらく誤りです。
otomo

1
この解決策は私にはうまくいきませんでした。指定されたファイルを削除済みとしてマークし、ローカルリポジトリから削除します。
パイエゴ

134

これにより、<file>のステージが解除されます(ファイルを削除したり変更したりする必要はありません)。

git reset <file>

6
これにより、特定のファイルの最新の変更が削除されますが、コミットしてプッシュした後、それはリポジトリ(リモート)に保持されます。
powder366

1
これが私が探していた答えです。を指定する必要がないことに注意してくださいHEAD
Michael Dorst

良い点@MichaelDorst。省略するために答えを更新しましたHEAD
David Underhill

3
git reset HEAD <file> 

インデックスから特定のファイルを削除します。

そして

git reset HEAD

すべてのインデックス付きファイルを削除するため。


1

ワークフローによっては、コマンドラインソリューションを理解しようとしてもほとんど意味がない場合があります(何らかの理由でグラフィカルインターフェイスなしで作業している場合を除きます)。

たとえば、インデックス管理をサポートするGUIベースのツールの1つを使用するだけです。

  • git gui <-Tkウィンドウフレームワークを使用します-に類似したスタイル gitk
  • git cola <-よりモダンなスタイルのGUIインターフェイス

これらを使用すると、ポイントアンドクリックでファイルをインデックスの内外に移動できます。ファイルの一部(個々の変更)を選択し、インデックスから移動することもできます。


別の見方はどうですか:提案された、かなり不可解なコマンドの1つを使用しているときに混乱した場合:

  • git rm --cached [file]
  • git reset HEAD <file>

...あなたはデータを失う可能性があります-または少なくとも見つけるのを難しくします。これを非常に高い頻度で行う必要がない限り、GUIツールを使用する方が安全です。


インデックスなしで作業する

コメントや投票に基づいて、多くの人が常にインデックスを使用していることに気付きました。私はしません。方法は次のとおりです。

  • 作業コピー全体をコミットします(一般的なケース): git commit -a
  • いくつかのファイルのみをコミットします。 git commit (list of files)
  • すべてが、いくつか変更されたファイルをコミットします。git commit -aその後、改正を経てgit gui
  • 作業コピーへのすべての変更をグラフィックで確認します。 git difftool --dir-diff --tool=meld

@Martin:ワークフローに依存すると思います。私のアプローチでは、インデックスを直接使用することはありません。自分の作業を保存したいときは、で完全なコミットを行いgit commit -aます。私がこの質問に答えていたのは、ファイルをインデックスに入れる(エキゾチックな)「インバースチェリーピック」を実行したためですが、コミットする前にファイルを編集したかったのです。編集中にファイルをインデックスから取り出して、差分が以前と同じように機能するようにしました。
nobar

私の使用例は非常に狭く、実際には役に立たなかった。ブランチを作成する。ブランチのみのファイルで満たされたフォルダを追加します。マスターに切り替えます。マージ; ops、間違ったフォルダーをマスターに追加、それをgitignoreに追加。ファイルはコミットから削除されません-確かに、より良い解決策はすぐに使用することrmですが、ブランチを切り替えても無視されたフォルダーは削除されないだろうと最初に思いました。しかし ...私はgithubの「GUIベースの」ツールを使用してます。これは私にとって十分なツールであり、これをサポートしていない場合を除いて、いくつかのインデックス管理をサポートしています。だから、私は2つのGUIを使用する必要がありますか?まだ答えに同意できません。
cregox 2016

3
これは明らかに人気のない答えです。しかし、私が提案するアプローチは、一部の人々(自分も含む)にとって正しいアプローチであると確信しています。私はこれらのツールの1つを使用して、年に数回インデックスを操作します。
nobar

1
今日、プログラミングエディタとIDEは、グラフィカルなインデックス操作をサポートする可能性があります。少なくともGitHubのAtomはそうです。
nobar 2018

1
私は、GUIの方が危険であるにもかかわらず、GUIよりもCLIインターフェイスを好んでいます。これにより、快適なGUIがなくてもgitを使用できます(たとえば、リモートサーバーにそのようなツールをインストールできないときに失われることはありません)。この回答は完全に有効であり、「cliエリート主義」の反対投票に値しないと述べたことはすべて、優れたgui-alternativeを提供するための+1です。
SidOfc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.