状況:インデックスにファイルが既にあるGitリポジトリがあります。私はいくつかのファイルに変更を加え、Gitを開いて、これらのファイルを "git add。"でステージング領域に追加します。
質問:これらのファイルの1つをステージング領域から削除し、インデックスから削除したり、ファイル自体への変更を元に戻したりするにはどうすればよいですか?
状況:インデックスにファイルが既にあるGitリポジトリがあります。私はいくつかのファイルに変更を加え、Gitを開いて、これらのファイルを "git add。"でステージング領域に追加します。
質問:これらのファイルの1つをステージング領域から削除し、インデックスから削除したり、ファイル自体への変更を元に戻したりするにはどうすればよいですか?
回答:
質問を正しく理解できればgit add
、そのファイルに対して行われた処理を「取り消す」だけです。
ステージング領域から単一のファイルを削除する必要がある場合は、
git reset HEAD -- <file>
ステージング領域からディレクトリ全体(フォルダー)を削除する必要がある場合は、
git reset HEAD -- <directoryName>
変更は保持されます。実行するとgit status
、ファイルは再び変更済みとして表示されますが、まだステージングされていません。
詳細については、git reset
manページを参照してください。
git rm --cached FILE
は、別の回答で提案されているコマンドを使用します。
git rm --cached FILE
、
git rm -r --cached CVS */CVS
git reset
--chachedオプションを省略して、git rm
コマンドを使用してすぐに悲しむかもしれないので、ここで使用する方が良いと思います:-) git reset
安全な側にいるので、「いくつかのオプション」を追加し忘れた場合は、変更を保存して、毎日の使用に対して「安全」になるようにします(私が話しているのはgit reset --hard
)
git rm --cached FILE
作業ツリーからファイルを削除せずに、ファイルの削除を段階的に行います。これは、元に戻すことに関する質問とは異なりgit add
ます。
git rm --cached
ファイルがインデックスから削除されます。つまり、ファイルは追跡されないファイルになります。これはOPが望んでいることではないと思います。ここでは、関連するスレッドを参照してください。stackoverflow.com/questions/45047810/...
特定のパターンに従ってファイルを削除する必要がありgit rm --cached
、を使用している場合は、file-globパターンも使用できます。
こちらをご覧ください。
実行するとgit status
、Gitがステージングを解除する方法を指示します。
Changes to be committed: (use "git reset HEAD <file>..." to unstage).
だからgit reset HEAD <file>
私のために働いて、変更はそのままでした。
@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.23
、Gitはgit restore
それを行うために使用できるコマンドを導入しました。公式ドキュメントを引用:
復元ソースの一部のコンテンツを使用して、作業ツリー内の指定されたパスを復元します。パスが追跡されているが、復元ソースに存在しない場合は、ソースと一致するように削除されます。
このコマンドを使用して、を使用してインデックスのコンテンツを復元したり、を使用し
--staged
て作業ツリーとインデックスの両方を復元したりすることもでき--staged --worktree
ます。
したがってgit restore --staged <path>
、ファイルを呼び出してステージングを解除するだけでなく、加えた変更を保持することもできます。ファイルがステージングされなかった場合、ファイルに加えたすべての変更が失われることに注意してください。
追跡されている多くのファイルに変更を加えたが、それらのいくつかのみをステージングしたい場合は、
git add .
追跡されたすべてのファイルをステージングするため、常に好ましい(または推奨される)とは限りません(変更を自分だけに保持し、リモートリポジトリにステージングしたくない場合もあります)。
たくさんのことをするのも理想的ではありません
git add path/to/file1 path/to/file2
ネストされたディレクトリがたくさんある場合(ほとんどのプロジェクトの場合)-迷惑になります
そのとき、Git GUIが役立ちます(おそらく私が使用するときだけです)。Git GUIを開くだけで、ステージングされたファイルセクションとステージングされていないファイルセクションが表示されます。ステージ解除するステージセクションからファイルを選択して押します
Ctrl+U
(Windows用)
それらをアンステージングします。
新しいバージョンのGitにはがありgit restore --staged <file>
ます。
私が行うとgit status
Gitのバージョンで2.26.2.windows.1
それはまたunstagingのために推奨されます。
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
(この投稿は、以前のバージョンでgit reset HEAD
は現時点で推奨されていたことを示しています)
私は非常にお勧めすることができ、この間の違いを説明する記事をgit revert
、git restore
とgit reset
してものための追加パラメータgit restore
。
私のサンプル:
$ 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)
git checkout -- <file>
ステージング領域からファイルを削除するために完全に機能します