ステージング領域から1つのファイルを削除するにはどうすればよいですか(git addを元に戻します)?


1231

状況:インデックスにファイルが既にあるGitリポジトリがあります。私はいくつかのファイルに変更を加え、Gitを開いて、これらのファイルを "git add。"でステージング領域に追加します。

質問:これらのファイルの1つをステージング領域から削除し、インデックスから削除したり、ファイル自体への変更を元に戻したりするにはどうすればよいですか?


40
ステージング領域インデックスなので、多分あなたはあなたが何を意味するのか正確に明確にすることができますか?
CBベイリー


回答:


1903

質問を正しく理解できればgit add、そのファイルに対して行われた処理を「取り消す」だけです。

ステージング領域から単一のファイルを削除する必要がある場合は、

git reset HEAD -- <file>

ステージング領域からディレクトリ全体(フォルダー)を削除する必要がある場合は、

git reset HEAD -- <directoryName>

変更は保持されます。実行するとgit status、ファイルは再び変更済みとして表示されますが、まだステージングされていません。

詳細については、git resetmanページを参照してください。


41
ありがとうございます。ステージファイルのすぐ上に記載されていることに気づきました。その画面をずっと見てきたので、見たいものを選択して選びました。
PHLAK、2009年

2
これは、私がどこでも得たすべてのアドバイス(manページ、ここ、友達など)とは対照的に、私のすべての変更のステージングを解除します。私はいつかそれが宣伝されていることをするつもりだと考え続けていますが、そうではありません。
rektide 2013年

6
リポジトリへのコミットが行われていないときに、ステージングからファイルを削除する方法はありますか?
Jared Forsyth 2013年

3
私はこの質問に何度も行ったり来たりしています。なぜもっと賛成できないのですか?:)
Puce

3
@Jared Forsythステージからコミットされていないファイルを削除するにgit rm --cached FILEは、別の回答で提案されているコマンドを使用します。
chmike

151
git rm --cached FILE

git rm -r --cached CVS */CVS

28
true、しかしgit reset--chachedオプションを省略して、git rmコマンドを使用してすぐに悲しむかもしれないので、ここで使用する方が良いと思います:-) git reset安全な側にいるので、「いくつかのオプション」を追加し忘れた場合は、変更を保存して、毎日の使用に対して「安全」になるようにします(私が話しているのはgit reset --hard
Konrad「ktoso」Malawski、2011

20
この方法は、以前のコミットがない場合に便利です。
SomeKittens 2013

2
git rm --cached FILE作業ツリーからファイルを削除せずに、ファイルの削除を段階的に行います。これは、元に戻すことに関する質問とは異なりgit addます。
Sampo Smolander 2015

1
作業ツリーからファイルを削除した場合、この回答はエラーをスローします。
Samuel Robert、

3
git rm --cachedファイルがインデックスから削除されます。つまり、ファイルは追跡されないファイルになります。これはOPが望んでいることではないと思います。ここでは、関連するスレッドを参照してください。stackoverflow.com/questions/45047810/...
smwikipedia

88

git reset <file>

以前のコミットがあるかどうかに関係なく動作します。


53

したがって、Tim Heniganの答えを少し調整します。ファイル名の前に-を使用する必要があります。次のようになります。

git reset HEAD -- <file>

6
何をして--、なぜそれを追加するのですか?私はそうしましたgit reset HEAD <file>、そしてそれはうまくいきました。
Paolo

15
--仕切りのようなものです。ファイル名が従来と異なる場合、eg(-fまたはmaster)git は、ファイル名ではなく、コマンドライン引数またはブランチ名として解釈します。こちらをご覧ください
Andrew

3
これは、コマンドなしでコマンドを実行した場合、-そのファイルに対する以前のコミットがないためではありませんでした。ありがとう。
Matt

17
git reset filename.txt

filename.txtに変更がある場合、誤ってステージングに追加し、ステージングからファイルを削除したいが、変更を失わないようにする必要があります。


6

ファイルへの変更のサブセットを削除したいだけの場合は、以下を使用できます。

git reset -p

または

git reset -p <file_name>

このコマンドは基本的には逆ですgit add -p。ステージング領域から選択した変更のみを削除します。誤って追加したものを「外す」のに非常に役立ちます。


4

特定のパターンに従ってファイルを削除する必要がありgit rm --cached、を使用している場合は、file-globパターンも使用できます。

こちらをご覧ください


2

あなたが欲しい:

  • 単一ファイルに影響

  • ステージング領域からファイルを削除する

  • インデックスから単一のファイルを削除しない

  • 変更自体を元に戻さないでください

そして解決策は

git reset HEAD file_name.ext

または

git reset HEAD path/to/file/file_name.ext

2

実行するとgit status、Gitがステージングを解除する方法を指示します。

Changes to be committed: (use "git reset HEAD <file>..." to unstage).

だからgit reset HEAD <file>私のために働いて、変更はそのままでした。


2

@CB Baileyがコメントしたように、おそらくindexの概念に混乱したと思います

ステージング領域はインデックスです。

単にステージングディレクトリインデックスを同じものと見なすことができます。
つまり、@ Tim Heniganの回答と同じように、

git addそのファイルに対して行われた処理を「取り消す」だけです。



これが私の答えです:

一般的に、ステージ操作を元に戻す方法は2つありますが、他の回答はすでに述べています。

git reset HEAD <file>

そして

git rm --cached <file>

しかし、違いは何ですか?

ファイルがステージング作業ディレクトリにも存在すると想定し、ステージングディレクトリgit rm --cached <file>から削除する場合に使用し、ファイルを作業ディレクトリに保持します。しかし、この操作はのみからファイルを削除しないであろうことを予告ステージングディレクトリのファイルをとしてもマークでディレクトリをステージングあなたが使用している場合、deleted

git status

この操作の後、これが表示されます:

        deleted:    <file>

ステージングディレクトリからファイルを削除した記録です。その記録を保持せず、単にファイルの前の段階の操作を取り消すだけの場合は、git reset HEAD <file>代わりにを使用してください。


--------回答の終わり--------

PS:私は言及されたいくつかの回答に気づきました:

git checkout -- <file>

このコマンドは、ファイルがステージングれたが、ステージング後に作業ディレクトリでファイルが変更された場合に使用します。この操作を使用しステージングディレクトリから作業ディレクトリにファイルを復元します。つまり、この操作の後、変更はステージングディレクトリではなく、作業ディレクトリで行われます。


2

バージョンの後2.23、Gitはgit restoreそれを行うために使用できるコマンドを導入しました。公式ドキュメントを引用:

復元ソースの一部のコンテンツを使用して、作業ツリー内の指定されたパスを復元します。パスが追跡されているが、復元ソースに存在しない場合は、ソースと一致するように削除されます。

このコマンドを使用して、を使用してインデックスのコンテンツを復元したり、を使用し--stagedて作業ツリーとインデックスの両方を復元したりすることもでき --staged --worktreeます。

したがってgit restore --staged <path>、ファイルを呼び出してステージングを解除するだけでなく、加えた変更を保持することもできます。ファイルがステージングされなかった場合、ファイルに加えたすべての変更が失われることに注意してください。


1

追跡されている多くのファイルに変更を加えたが、それらのいくつかのみをステージングしたい場合は、

git add .

追跡されたすべてのファイルをステージングするため、常に好ましい(または推奨される)とは限りません(変更を自分だけに保持し、リモートリポジトリにステージングしたくない場合もあります)。

たくさんのことをするのも理想的ではありません

git add path/to/file1 path/to/file2

ネストされたディレクトリがたくさんある場合(ほとんどのプロジェクトの場合)-迷惑になります

そのとき、Git GUIが役立ちます(おそらく私が使用するときだけです)。Git GUIを開くだけで、ステージングされたファイルセクションとステージングされていないファイルセクションが表示されます。ステージ解除するステージセクションからファイルを選択して押します

Ctrl+U (Windows用)

それらをアンステージングします。


1

新しいバージョンのGitにはがありgit restore --staged <file>ます。

私が行うとgit statusGitのバージョンで2.26.2.windows.1それはまたunstagingのために推奨されます。

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)

この投稿は、以前のバージョンでgit reset HEADは現時点で推奨されていたことを示しています)

私は非常にお勧めすることができ、この間の違いを説明する記事をgit revertgit restoregit resetしてものための追加パラメータgit restore


0

私のサンプル:

$ git status
On branch feature/wildfire/VNL-425-update-wrong-translation
Your branch and 'origin/feature/wildfire/VNL-425-update-wrong-translation' have diverged,
and have 4 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   ShopBack/Source/Date+Extension.swift
    modified:   ShopBack/Source/InboxData.swift
    modified:   ShopBack/en.lproj/Localizable.strings

お気づきかもしれませんが

> Changes to be committed:
>       (use "git reset HEAD <file>..." to unstage)

-1

ファイルのディレクトリにいる必要があり、端末に次のように入力します

git reset HEAD .

前提として、1つのファイルのみをリセットする必要があります。



-10

git checkout -- <file>

ステージング領域からファイルを削除するために完全に機能します


4
後述するように、これはファイルへの変更を元に戻します。これは、OPが希望するよりもさらに進んでいます。
stolli 2015

git rm flie.txt --cached
Juan Ramirez

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.