コミットする前に「git add」を元に戻すにはどうすればよいですか?


8964

次のコマンドを使用して、誤ってGitにファイルを追加しました。

git add myfile.txt

まだ走っていませんgit commit。これを元に戻す方法はあるので、これらのファイルはコミットに含まれませんか?


22
、Gitのv1.8.4とその使用の下にすべての答えを開始するHEADか、head今すぐ使用することができます@の代わりにHEAD代わりに。なぜそうできるのかについては、この回答(最後のセクション)を参照してください。

3
:私は、ファイルをunstageするすべての方法を示して少し夏らしい作らstackoverflow.com/questions/6919121/...
ダニエル・アルダー

5
なぜgit checkoutをしないのですか?
Erik Reppen、2016

13
@ErikReppen git checkoutは、段階的な変更をコミットインデックスから削除しません。ステージングされていない変更を最後にコミットされたリビジョンに戻すだけです-ちなみに、これも私が望んでいるものではありません。それらの変更が必要です。後でコミットしたいだけです。
paxos1977

4
Eclipseを使用する場合、コミットダイアログボックスでファイルの
チェックを外すだけの

回答:


10372

git addコミットする前に元に戻すことができます

git reset <file>

何も変更せずに現在のインデックス(「コミットされる」リスト)から削除されます。

使用できます

git reset

すべての変更をステージング解除するためのファイル名なし。これは、妥当な時間内に1つずつリストするにはファイルが多すぎる場合に便利です。

Gitの古いバージョンでは、上記のコマンドはgit reset HEAD <file>およびと同等です。git reset HEADそれぞれ、HEADが未定義の場合(リポジトリでまだコミットを行っていないため)、またはあいまいな場合(というブランチを作成したためHEAD、愚かなことです)あなたがすべきではないこと)。ただし、これはGit 1.8.2変更されたため、最新バージョンのGitでは、最初のコミットを行う前でも上記のコマンドを使用できます。

「git reset」(オプションまたはパラメーターなし)は、履歴にコミットがない場合にエラーを出力するために使用されていましたが、空のインデックスを提供します(存在しないコミットと一致させるために、あなたも偶然ではありません)。


92
もちろん、これは本当の取り消しではありません。なぜなら、間違っgit addて以前のステージングされたコミットされていないバージョンを上書きした場合、それを回復することができないからです。私は以下の私の答えでこれを明確にしようとしました。
レオンブロイ、2013年

7
git reset HEAD *.extここextで、指定した拡張子のファイルを削除します。私にとってそれはだった*.bmp*.zip
boulder_ruby

18
@Jonny、インデックス(別名ステージング領域)には、変更されたファイルだけでなく、すべてのファイルが含まれます。HEADが指すコミット内のすべてのファイルのコピーとして、「ライフを開始」します(コミットをチェックアウトするか、リポジトリを複製するとき)。したがって、インデックス()からファイルを削除すると、そのファイルgit rm --cached削除するコミットを行う準備ができていることになります。 git reset HEAD <filename>一方、HEADからインデックスにファイルをコピーするため、次のコミットでは、そのファイルに加えられた変更は表示されません。
ワイルドカード2016年

11
私はgit reset -pちょうどのようなものがあることを発見しましたgit add -p。これはすごい!
ドンキホーテ2016

10
あなたが実際に以前overwriten回復上演ことができますが、コミットされていない変更ではなく、ユーザーフレンドリーな方法でと(少なくともなしで、私が発見した)ではない100%安全な:後藤.git /オブジェクトの時点で作成されたファイルを検索git add(あなたが復元したいです61/3AF3...- >オブジェクトID 613AF3...)、次にgit cat-file -p <object-id>(数時間の作業を回復するために価値があるかもしれませんが、より頻繁にコミットするためのレッスンも...)
Peter Schneider

2151

あなたが欲しい:

git rm --cached <added_file_to_undo>

推論:

私はこれが初めてだったとき、私は最初に試しました

git reset .

(私の最初の追加全体を元に戻すため)、これだけではない(そうではない)有用なメッセージを取得する:

fatal: Failed to resolve 'HEAD' as a valid ref.

これは、最初のコミットが完了するまでHEAD ref(branch?)が存在しないためです。つまり、私のようなワークフローが次のようなものだった場合、私と同じ初心者の問題が発生します。

  1. 新しいプロジェクトディレクトリにcdして、新しいホットなGitを試す
  2. git init
  3. git add .
  4. git status

    ...がらくたがたくさんスクロール...

    =>くそー、私はそれをすべて追加したくありませんでした。

  5. google「元に戻すgit追加」

    =>スタックオーバーフローを検索-はい

  6. git reset .

    =>致命的: 'HEAD'を有効な参照として解決できませんでした。

さらに、ログに記録されたバグがあることがわかりました、これの役に立たないことに対してメーリングリストにわかりました。

そして、正しい解決策がGitステータス出力にあることを確認しました(はい、私は「がらくた」と書き直しました)

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...

そして解決策は実際に使用することです git rm --cached FILEです。

ここの他の場所の警告に注意してください- git rmローカルのファイルの作業コピーを削除しますが、-- cachedを使用する場合は削除しません。これが結果です:git help rm

--cachedこのオプションを使用して、ステージングを解除し、インデックスからのみパスを削除します。変更されたかどうかに関係なく、作業ツリーファイルは残されます。

使い続ける

git rm --cached .

すべてを削除してやり直します。しかし、add .再帰的ではあるが再帰するrm必要があることが判明したため、機能しませんでした-r。はぁ。

git rm -r --cached .

さて、今は始めたところに戻りました。次回-nは、予行演習を行い、何が追加されるかを確認するために使用します。

git add -n .

何も破壊git help rm--cachedないこと(そしてスペルを間違えた場合)について信頼する前に、すべてを安全な場所に圧縮しました。


15
ああ。私はこれと同じプロセスに従いました。ただし、作業コピーを保持することを信頼していなかったためrm -rf .git、あきらめて言いました。一部の場所でgitがいかに複雑すぎるかについては、少し述べています。標準の標準コマンドである必要があります。エイリアスとして追加できるかどうかは関係ありません。git initgit rm --cachedgit unstage
Adrian Macneil、2011年

5
私にとってgitは言っていますgit reset HEAD <File>...
drahnr

16
<file>をリポジトリに最初にインポートする場合は、git rm --cached <file>が実際の答えです。ファイルへの変更をステージング解除しようとしている場合は、git resetが正解です。この答えが間違っていると言う人々は別の質問を考えています。
バリーケリー

14
これは実際に作業しますが、唯一のファイルが以前に存在しなかった、あるいはどこ最初のコミット時に、git addコマンドは、新しいファイルを追加して、ではなく、既存のファイルに変更します。
naught101 2013

4
直感的で複雑なgitがどれほど直感的であるかを示しに行きます。並列の「元に戻す」コマンドを使用する代わりに、元に戻す方法を見つける必要があります。砂の中で足を自由にして、腕を動かさずに、他の腕を動かさないように...すべてのコマンドは、オプションのドロップダウンメニュー項目を備えたGUIを介して実行する必要があります...すべてのUIについて考えてください。生産性は向上しましたが、これはレトロなコマンドラインインターフェイスの混乱です。git GUIプログラムがこれをより直感的にするようなものではありません。
ahnbizcad 2014年

532

入力した場合:

git status

Gitは、ステージングを解除する方法など、ステージングされているものなどを通知します。

use "git reset HEAD <file>..." to unstage

Gitは、このような状況で正しいことをするように私を微調整するかなり良い仕事をしています。

注:最近のGitバージョン(1.8.4.x)では、このメッセージが変更されています。

(use "git rm --cached <file>..." to unstage)

19
メッセージは、addedファイルが既に追跡されているかどうかによって異なります(add新しいバージョンをキャッシュに保存した唯一の場所-ここにメッセージが表示されます)。それ以外の場合、ファイルが以前にステージングされていなかった場合は表示されますuse "git rm --cached <file>..." to unstage
leonbloy 2013年

すごい!git reset HEAD <file>ファイルの削除をステージング解除したい場合に機能するのは、この1つだけです
skerit

2
私のgitバージョン2.14.3はステージを解除するように言っgit reset HEADています。
SilverWolf-モニカの復活

246

明確にするために:git add現在の作業ディレクトリからステージング領域に変更を移動します(インデックス)に。

このプロセスはステージングと呼ばれます。したがって、変更(変更されたファイル)をステージングする最も自然なコマンドは明白なものです。

git stage

git add タイプしやすいエイリアスです git stage

残念ながら、コマンドもありませgit unstagegit unadd。関連するものを推測したり覚えたりするのは困難ですが、それはかなり明白です:

git reset HEAD --

これのエイリアスは簡単に作成できます。

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

そして最後に、新しいコマンドがあります。

git add file1
git stage file2
git unadd file2
git unstage file1

個人的に私はさらに短いエイリアスを使用しています:

git a # For staging
git u # For unstaging

3
「動く」?これは、作業ディレクトリから移動したことを示します。そうではありません。
トーマスウェラー2017年

4
なぜそれが明白なのですか?
Lenar Hoyt 2017

実際、git stageはのエイリアスですgit add。これは、Gitと他のSCMの両方での歴史的なコマンドです。私が言うことができるなら、それは「Gitのgitリポジトリ」のコミット11920d28daで2008年12月に追加されました。
黒曜石、

1
これは無関係かもしれませんが、check-command filename && git add filenameのようなものを追加する前にファイルを検証すると便利です。マシンではgitをより短いgに置き換えましたが、これまでのところ機能しています私にとっては大丈夫です: github.com/dataf3l/g、これが誰かに役立つかどうかはわかりませんが、一部の人の時間を節約できることを願ってここに配置します。
フェリペバルデス

167

受け入れられた回答への追加、誤って追加されたファイルが巨大な場合、 ' git reset'を使用してインデックスから削除した後でも、それがまだスペースを占有しているように見えることにおそらく気付くでしょう.gitディレクトリの。

これは心配する必要はありません。ファイルは確かにまだリポジトリにありますが、「ルーズオブジェクト」としてのみ存在します。それは(クローン、プッシュを介して)他のリポジトリーにコピーされず、スペースは最終的に再利用されます。気になる場合は、次のコマンドを実行できます。

git gc --prune=now

更新(以下は、最も投票された回答から生じる可能性のある混乱を解消するための私の試みです):

だから、それは本当の元に戻すですgit addどれですか?

git reset HEAD <file>

または

git rm --cached <file>

厳密に言えば、そして私が誤っていないのであれば、なし

git add 元に戻すことはできません -安全に、一般的に。

まずgit add <file>実際に何をするかを思い出してみましょう:

  1. 場合<file>された以前に追跡されていないgit add キャッシュに追加され、現在の内容で、。

  2. <file>すでに追跡されている場合git add 、現在のコンテンツ(スナップショット、バージョン)をキャッシュに保存します。Gitでは、ファイルの2つの異なるバージョン(スナップショット)が2つの異なるアイテムと見なされるため、このアクションは引き続きaddと呼ばれます(単なる更新ではありません)。したがって、最終的に、新しいアイテムをキャッシュに追加しています後でコミット。

これを踏まえると、質問は少し曖昧です。

コマンドを使用して誤ってファイルを追加しました...

OPのシナリオは最初のシナリオ(追跡されていないファイル)のようです。「元に戻す」で、追跡されているアイテムからファイル(現在のコンテンツだけでなく)を削除します。この場合は、実行しても問題ありません。 git rm --cached <file>

そして、私たちは git reset HEAD <file>。これは、両方のシナリオで機能するため、一般的に推奨されます。既に追跡されているアイテムのバージョンを誤って追加した場合にも、元に戻すことができます。

ただし、注意点が2つあります。

最初:(答えで指摘されているように)git reset HEAD機能しないシナリオは1つだけですが、git rm --cached機能します:新しいリポジトリー(コミットなし)。しかし、実際には、これは実際には無関係なケースです。

第二にgit reset HEAD 、以前にキャッシュされたファイルの内容を魔法のように回復することはできません。HEADから再同期するだけです。見当違いの場合git addが以前のステージングされたコミットされていないバージョンを上書きした、それを回復することはできません。そのため、厳密に言えば、元に戻すことはできません[*]。

例:

$ git init
$ echo "version 1" > file.txt
$ git add file.txt   # First add of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add  file.txt   # Stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt
$ git diff  file.txt
-version 2
+version 3
$ git add  file.txt    # Oops we didn't mean this
$ git reset HEAD file.txt  # Undo?
$ git diff --cached file.txt  # No dif, of course. stage == HEAD
$ git diff file.txt   # We have irrevocably lost "version 2"
-version 1
+version 3

もちろん、新しいファイルを追加するためだけに「git add」を実行する通常の遅延ワークフロー(ケース1)に従い、commit、git commit -aコマンドを使用して新しいコンテンツを更新する場合、これはそれほど重要ではありません。


*(編集:上記は実質的に正しいですが、ステージングされたがコミットされずに上書きされた変更を回復するための少しハック/複雑な方法がまだある可能性があります-Johannes Matokicとiolsmitによるコメントを参照してください)


4
厳密に言うと、git addで置き換えられたすでにステージングされたファイルを回復する方法があります。あなたが言及したように、git addはそのファイルのgitオブジェクトを作成します。これは、ファイルを完全に削除するときだけでなく、新しいコンテンツで上書きされるときにもルーズオブジェクトになります。ただし、自動的に回復するコマンドはありません。代わりに、ファイルを手動で、またはこの場合にのみ記述されたツールを使用して識別および抽出する必要があります(libgit2ではこれが可能です)。しかし、これは、ファイルが非常に重要で大きく、以前のバージョンを編集して再構築できなかった場合にのみ効果があります。
Johannes Matokic

2
自分を修正するには:緩やかなオブジェクトファイルが見つかったら(作成日時などのメタデータを使用)git cat-file、その内容を回復するために使用できます。
Johannes Matokic

2
する別の方法を約束してから上書き上演された変更を回復ではなく、例えば、他ではgit add介しているgit fsck --unreachableことは、あなたがそれまでに検査することができ、すべての到達不能OBJ、一覧表示されますgit show SHA-1_IDまたはgit fsck --lost-foundその意志>の書き込みにオブジェクトをぶら下がっ.git/lost-found/commit/たり.git/lost-found/other/、種類に応じて。参照git fsck --help
iolsmit 2018

110

すでに追加されているファイルを元に戻すのは、Gitを使用すると非常に簡単です。myfile.txt既に追加されているをリセットするには、次を使用します。

git reset HEAD myfile.txt

説明:

不要なファイルをステージングした後、元に戻すことができますgit resetHeadローカルのファイルの先頭であり、最後のパラメータはファイルの名前です。

これらの場合に発生する可能性のあるすべてのステップを含め、以下の画像のステップをより詳細に作成しました。

gitリセットHEADファイル


画像:「コマンドの追加...」「コマンドの追加...」現在の単純時制、3人称
Peter Mortensen

画像:したい →したい(ここではスラングを使用する必要はありません)
Peter Mortensen

92
git rm --cached . -r

現在のディレクトリから追加したものすべてを再帰的に「追加解除」します


3
追加をすべて解除するのではなく、特定のファイルを1つだけ追加しました。
paxos1977 2009

3
以前のコミットがない場合にも役立ちます。以前のコミットがない場合、次のようにgit reset HEAD <file>なりますfatal: Failed to resolve 'HEAD' as a valid ref.
Priya Ranjan Singh

6
いいえ、これにより、現在のディレクトリのすべてが削除されます。ステージングされていない変更とは非常に異なります。
Mark Amery 2015年

88

走る

git gui

手動ですべてのファイルを削除するか、すべてのファイルを選択して[ ステージングからコミット解除 ]ボタンクリックします。


1
はい、わかりました。私は暗黙のうちに「あなたはgit-gui... を使うことができる」のようなあなたの答えにあなたが示すことを暗示的に提案したかっただけです:)
Alexander Suraphel 14

1
「git-gui:コマンドが見つかりません」と表示されます。これが機能するかどうかはわかりません。
Parinda Rajapaksha 2017

うわー、これはあなたが理解していないコマンドラインを実行するよりもはるかに簡単です。これは私のような初心者には絶対にお勧めです。これを書いてくれてありがとう!
Irfandy Jip、

ありがとう。危険を冒したくなかったので、GUIを使用する必要がありました。
Sagar Khatri

83

Gitには考えられるすべてのアクションのコマンドがありますが、物事を正しく行うには広範な知識が必要です。そのため、せいぜい直感に反しています...

以前に行ったこと:

  • ファイルを変更して使用したgit add .、またはgit add <file>

あなたが欲しいもの:

  • インデックスからファイルを削除しますが、バージョン管理を行い、コミットされていない変更を作業コピーに残します。

    git reset head <file>
    
  • ファイルをHEADから最後の状態にリセットし、変更を取り消してインデックスから削除します。

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    git reset --hard HEAD単一のファイルでは機能しないため、これが必要です。

  • <file>インデックスとバージョニングから削除し、バージョン管理されていないファイルを作業コピーの変更とともに保持します。

    git rm --cached <file>
    
  • <file>作業コピーとバージョン管理から完全に削除します。

    git rm <file>
    

1
「git reset head <file>」と「git rm --cached <file>」の違いを理解できません。説明していただけますか?
jeswang 2013

6
@jeswangファイルはgitに「認識」されている(変更が追跡されている)か、「バージョン管理」されていません。reset head現在の変更を元に戻しますが、ファイルはまだgitによって監視されています。rm --cachedファイルのバージョン管理を解除するため、gitはファイルの変更をチェックしなくなります(また、最終的にインデックス付けされた現在の変更を削除し、前のによってgitに通知さaddれます)が、変更されたファイルはファイルフォルダー内の作業コピーに保持されますHDDに。
sjas 2013

3
違いはgit reset HEAD <file>一時的なものです。コマンドは次のコミットにのみ適用されますが、でgit rm --cached <file>再度追加されるまでステージングが解除されgit add <file>ます。また、git rm --cached <file>そのブランチをリモートにプッシュした場合、ブランチをプルしたユーザーは、ファイルがフォルダーから実際に削除されます。
DrewT 2014

80

質問は明確に提起されていません。その理由は、git add2つの意味があります。

  1. ステージング領域に新しいファイルを追加し、次に元に戻すgit rm --cached fileます。
  2. 変更されたファイルをステージング領域に追加してから、で元に戻しgit reset HEAD fileます。

疑わしい場合は、

git reset HEAD file

それはどちらの場合でも期待されることをするからです。

警告:あなたがしなければgit rm --cached fileされたファイルに変更(リポジトリ内の前に存在していたファイル)、ファイルが上削除されますgit commit!それはまだファイルシステムに存在しますが、他の誰かがコミットをプルした場合、ファイルは作業ツリーから削除されます。

git statusファイルが新しいファイルであるか、変更されたかを通知します。

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

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

7
+1。このページの非常に支持されている回答やコメントの数が異常に多いのは、の動作についてはまったく間違っていますgit rm --cached somefile。この答えがページを目立たせて、初心者がすべての誤った主張に惑わされるのを防ぐことができる目立つ位置に進むことを願っています。
Mark Amery

ここで最良の回答の1つですが、残念ながらリストにはかなり載っていません
Creos

64

最初のコミット時にを使用できない場合はgit reset、「Git破産」を宣言して.gitフォルダーを削除し、最初からやり直してください


5
1つのヒントは、フォルダーを削除する前に、リモートオリジンを追加している場合は.git / configファイルをコピーすることです。
ティアゴ

4
@ChrisJohnsenのコメントがスポットです。場合によっては、1つを除くすべてのファイルをコミットしたいことがあります git add -A && git rm --cached EXCLUDEFILE && git commit -m 'awesome commit' (これは、以前のコミットがない場合にも機能し、Failed to resolve 'HEAD'問題が再度発生します)

57

他の多くの答えに従って、あなたは使うことができます git reset

だが:

私は実際にGitコマンド(まあ、エイリアス)を追加するこの素晴らしい小さな投稿を見つけました。詳細git unaddについてはgit unaddを参照してください。

単に、

git config --global alias.unadd "reset HEAD"

今できる

git unadd foo.txt bar.txt

45

git add -i追加したファイルを次のコミットから削除するために使用します。例:

不要なファイルを追加する:

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

インタラクティブな追加を開始して、追加を元に戻します(ここでgitに入力したコマンドは、「r」(元に戻す)、「1」(リストの最初のエントリは元に戻す表示)、「return」で元に戻すモードから抜け、「q」 (終了する):

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

それでおしまい!ここにあなたの証明があります、「foo」が追跡されていないリストに戻ったことを示しています:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

42

git removeまたはgit rm--cachedフラグを使用してこれに使用できます。試してください:

git help rm

9
これでファイルが完全に削除されませんか?
ウィラ

8
git rm --cached ...gitリポジトリからファイルを削除します。それらはまだコンピューターに存在しますが、これはファイルへの変更のステージング解除とはかなり異なります。これに偶然出くわす人にとって、それは質問に対する有効な答えではありません。
Addison

38

新しいプロジェクトを開始するときにこの厄介な問題を回避する方法は次のとおりです。

  • 新しいプロジェクトのメインディレクトリを作成します。
  • を実行しますgit init
  • .gitignoreファイルを作成します(ファイルが空であっても)。
  • .gitignoreファイルをコミットします。

git resetコミットがない場合、Gitを使用することは非常に困難になります。あなたが作成した場合、あなたができることをした後、小さな初期には、ちょうど1つを有するのためにコミットgit add -Aし、git resetあなたはすべての権利を取得するために必要な回数だけ。

この方法のもう1つの利点は、後で行末の問題が発生し、すべてのファイルを更新する必要がある場合に、簡単に実行できることです。

  • 最初のコミットを確認してください。これにより、すべてのファイルが削除されます。
  • 次に、最新のコミットをもう一度確認してください。これにより、現在の行末設定を使用して、ファイルの新しいコピーが取得されます。

1
確認しました!git addの後にgit resetを試してみました。そしてgitは破損したHEADについて不平を言っていました。あなたのアドバイスに従って、問題なくgit add&resetを
やり直す

1
2番目の部分は機能しますが、少し不格好です。行末の処理方法はautocrlf値によって異なります...設定によっては、これがすべてのプロジェクトで機能するわけではありません。
sjas 2013年

1
この回答は投稿された時点では妥当でしたが、現在は使用されていません。git reset somefileそしてgit reset最初の今、コミットすることの両方の作業前に。これは、いくつかのGitリリースがリリースされて以来当てはまります。
Mark Amery 2015年

@MarkAmery、あなたは正しいかもしれません(アサーションのソースを投稿した方がいいでしょう)が、クリーンなコミットでリポジトリを開始することにはまだ価値があります。
Ryan Lundy

34

質問を投稿してからGitが進化したのかもしれません。

$> git --version
git version 1.6.2.1

今、あなたは試すことができます:

git reset HEAD .

これはあなたが探しているものでなければなりません。


2
もちろん、追加された2つ(またはそれ以上)のファイルの1つをどのようにして削除するかというフォローアップの質問があります。「git reset」マニュアルには、「git reset <paths>」は「git add <paths>」の反対であると記載されています。
Alex North-Keys

34

リビジョンの指定に失敗した場合は、セパレータを含める必要があることに注意してください。私のコンソールからの例:

git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

git reset -- <path_to_file>
Unstaged changes after reset:
M    <path_to_file>

(Gitバージョン1.7.5.4)


2
私が試したところgit reset <path>、セパレータなしでうまく機能しました。私もgit 1.9.0を使用しています。たぶんそれは古いバージョンでは動作しませんか?

31

上記のように、ステージング領域から新しいファイルを削除するには(新しいファイルの場合のみ):

git rm --cached FILE

誤って追加された新しいファイルに対してのみrm --cachedを使用してください。


4
--cachedここが本当に重要な部分だということを覚えておいてください。
takeshin 2013

1
-1; いいえ、これはファイルのステージングを解除しません。ファイルの削除をステージングします(実際には作業ツリーから削除しません)。
Mark Amery、2015年

25

特定のフォルダー(およびそのサブフォルダー)内のすべてのファイルをリセットするには、次のコマンドを使用できます。

git reset *

4
*はシェル拡張を使用し、ドットファイル(およびドットディレクトリ)を無視するため、実際にはすべてのファイルがリセットされるわけではありません。
Luc

実行git statusして残りを確認し、手動でリセットできますgit reset file
Zorayr、2014年

25

*コマンドを使用して、一度に複数のファイルを処理します。

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*


3
あなたが明示的に指定しない限り、*は通常、ドットファイルや「ドット・ディレクトリ」を含まないことを心.*.*.prj
リュック

23

入力git resetするだけで元に戻りgit add .、最後のコミット以降に入力したことがないようです。以前にコミットしたことを確認してください。


たまたま、最後のコミットがありました...しかし、コミットからすべてのファイルを削除するのではなく、1つのファイルをコミットから削除することを具体的に求めていました。
paxos1977 2013年

20

新しいファイルを作成するとしますnewFile.txt

ここに画像の説明を入力してください

誤ってファイルを追加したとしますgit add newFile.txt

ここに画像の説明を入力してください

コミットする前に、この追加を元に戻したいgit reset newFile.txt

ここに画像の説明を入力してください


私が最初のpicにいるとします。これは、「git.add」も実行していないという意味です。また、私はこのすべての変更を望んでいません。git statusを実行すると、赤いファイルが表示されないはずです。つまり、前回のgitプッシュ以降に変更された単一のファイルがないかのように同期している必要があります。それを達成する方法。
アンブレイカブル2017年

あなたが最初のステップにいるとしましょう。そして、「newFile.txt」を赤くするために行ったすべての変更を削除したいとします。
アンブレイカブル2017年

git statusを実行すると、何の変化もないはずです。赤いファイルはすべて元に戻ります。
アンブレイカブル2017年

こんにちは、あなたの質問は現在のツリーから追跡されていないファイルを削除する方法だと思います。そのためには、「git clean -f -d」を使用できます。これにより、追跡されていないディレクトリも削除されます。
Vidura Mudalige

追跡されていないファイルを削除したくない場合は、「-f」フラグを無視してください。
Vidura Mudalige 2017年

19

特定のファイルの場合:

  • git reset my_file.txt
  • git checkout my_file.txt

追加されたすべてのファイル:

  • git reset。
  • git checkout。

注:チェックアウトにより、ファイル内のコードが変更され、最後に更新された(コミットされた)状態に移行します。リセットはコードを変更しません。ヘッダーをリセットするだけです。


3
git reset <file>との違いを説明してくださいgit checkout <file>
トレント

1
resetはファイルを変更せず、ステージ(=インデックス、それはgit addによって配置された場所)から離れた場所に配置するだけ
franc

チェックアウトはファイル内のコードを変更し、最後に更新された状態に移動します。リセットはコードを変更せず、ヘッダーをリセットするだけです。例として、追加またはコミットされたファイルのリセット使用は、プッシュの前にリセットし、チェックアウトは、git addの前の最後の更新/コミットされたステージに戻るために使用します。
Hasib Kamal

1
リセット=ファイルをステージから削除しますが、変更はまだ残っています。checkout =リポジトリから更新されたファイルを取得し、現在のファイルを上書きします
Imam Bux

14

このコマンドはあなたの変更をアンスタッシュします:

git reset HEAD filename.txt

あなたも使うことができます

git add -p 

ファイルの一部を追加します。


14

インタラクティブモードもあります。

git add -i

ファイルの追加を解除するには、オプション3を選択します。私の場合、私はしばしば複数のファイルを追加したいのですが、インタラクティブモードでは、このような数字を使用してファイルを追加できます。これには、4、1、2、3、および5以外のすべてが必要です。

シーケンスを選択するには、1-5と入力して、1から5までのすべてを取得します。

Gitステージングファイル


「誰もインタラクティブモードについて言及していないことに驚いています」 -彼らはそうしました:stackoverflow.com/a/10209776/1709587
Mark Amery


10
git reset filename.txt

現在のインデックスである「コミットされようとしている」領域から、filename.txtという名前のファイルを削除します。他には何も変更しません。


10

git add myfile.txt #これにより、ファイルがコミットされるリストに追加されます

このコマンドとは正反対ですが、

git reset HEAD myfile.txt  # This will undo it.

したがって、以前の状態になります。指定されたものは、追跡されていないリストに再び表示されます(以前の状態)。

指定したファイルで頭をリセットします。したがって、頭に意味がない場合は、単にリセットされます。


9

Sourcetreeでは、GUIを使用して簡単にこれを行うことができます。Sourcetreeがファイルのステージング解除に使用するコマンドを確認できます。

新しいファイルを作成してGitに追加しました。次に、Sourcetree GUIを使用してステージングを解除しました。これが結果です:

ファイルのステージング解除[08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q-path / to / file / filename.java

Sourcetreeはreset新しいファイルをステージング解除するために使用します。


はい、同じ手法をTortoiseGitで使用して、一般的な使用例のGitコマンドを取得できます。
Peter Mortensen

8
git reset filename.txt  

現在のインデックスである「コミットされようとしている」領域から、filename.txtという名前のファイルを削除します。他には何も変更しません。


git reset [ファイル名] ex:git reset src / main / java / com / dao / ImportCsvDataDaoImpl.java
Rohit Chaurasiya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.