10374

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

git add myfile.txt

私はまだ実行していませんgit commit。これを元に戻す方法はありますか?そうすれば、これらのファイルはコミットに含まれませんか?

4

37 に答える 37

12286

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

git reset <file>

これにより、他に何も変更せずに、現在のインデックス(「コミットしようとしている」リスト)から削除されます。

使用できます

git reset

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

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

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

ドキュメント:git reset

于 2008-12-07T22:30:48.340 に答える
2336

あなたがしたい:

git rm --cached <added_file_to_undo>

理由:

私がこれに慣れていないとき、私は最初に試しました

git reset .

(最初の追加全体を元に戻すため)、次の(そうではない)役立つメッセージが表示されるだけです:

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

これは、最初のコミット後まで HEAD ref (ブランチ?) が存在しないためであることが判明しました。つまり、私のようなワークフローが次のようなものである場合、私と同じ初心者の問題に遭遇することになります。

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

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

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

  5. グーグル「git addを元に戻す」

    =>スタックオーバーフローを見つける - やった

  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 .

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

git rm -r --cached .

さて、これで元の場所に戻りました。次回-nは、ドライランを実行して、何が追加されるかを確認します。

git add -n .

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

于 2009-03-25T16:20:04.247 に答える
595

次のように入力します。

git status

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

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

Git は、このような状況で正しいことを行うように後押ししてくれます。

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

(use "git rm --cached <file>..." to unstage)
于 2008-12-07T23:22:56.287 に答える
284

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

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

git stage

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

残念ながらコマンドもありませgit unstageん。git 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
于 2010-09-10T20:28:15.510 に答える
198

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

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

git gc --prune=now

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

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

git reset HEAD <file>?

また

git rm --cached <file>?

厳密に言えば、私が間違っていなければ、none .

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機能します:新しいリポジトリ(コミットなし)。しかし、実際には、これは実質的に無関係なケースです。

2 番目: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) に従うだけで、commitgit commit -aコマンドを使用して新しいコンテンツを更新する場合、これはそれほど重要ではありません。


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

于 2011-05-18T18:05:27.090 に答える
112
git rm --cached . -r

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

于 2009-12-09T21:19:09.213 に答える
107

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>
    
于 2013-03-29T11:14:28.343 に答える
101

走る

git gui

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

于 2011-10-12T01:12:51.567 に答える
100

質問は明確に提起されていません。その理由には、次の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
于 2014-01-16T19:54:07.207 に答える
81

他の多くの回答に従って、使用できますgit reset

しかし:

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

単に、

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

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

git unadd foo.txt bar.txt

代わりに / 直接:

git reset HEAD foo.txt bar.txt
于 2010-10-01T14:54:06.217 に答える
73

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

于 2009-11-19T16:39:50.597 に答える
54

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)
$
于 2012-04-18T12:53:38.330 に答える
46

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

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

git resetコミットがない場合、Gitを使用すると非常に困難になります。小さな初期コミットを作成するためだけに作成した場合は、その後、すべてを正しく行うために、何度でも実行できgit add -Aますgit reset

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

  • その最初のコミットをチェックしてください。これにより、すべてのファイルが削除されます。
  • 次に、最新のコミットをもう一度確認してください。これにより、現在の行末設定を使用して、ファイルの新しいコピーが取得されます。
于 2011-09-24T23:34:39.967 に答える
43

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

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)

于 2012-01-23T16:57:24.810 に答える
42

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

$> git --version
git version 1.6.2.1

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

git reset HEAD .

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

于 2009-11-19T16:38:03.453 に答える
37

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

git rm --cached FILE

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

于 2009-06-22T11:58:33.203 に答える
31

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

git reset *
于 2012-07-26T07:50:36.173 に答える
30

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

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

于 2013-08-27T21:15:05.513 に答える
28

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

于 2010-05-19T03:49:06.597 に答える
28

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

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

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

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

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

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

于 2016-10-04T11:02:48.643 に答える
19

元に戻すgit addには、次を使用します。

git reset filename
于 2016-10-02T15:54:48.710 に答える
18

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

git add -i

ファイルの追加を取り消すには、オプション 3 を選択します。私の場合、複数のファイルを追加したいことがよくあります。対話モードでは、このような番号を使用してファイルを追加できます。これは、1、2、3、および 5 の 4 を除くすべてを使用します。

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

Git ステージング ファイル

于 2015-10-22T13:03:38.953 に答える
17

このコマンドは、変更を破棄します。

git reset HEAD filename.txt

使用することもできます

git add -p 

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

于 2013-01-31T15:43:53.650 に答える
3

git restore --staged .または使用しますgit restore --staged <filename>

を使用することもできますがgit rm --cached、このgit rmコマンドは、既に追跡されているファイルに対して使用するのが理想的です。

于 2021-09-18T20:54:22.157 に答える