次のコマンドを使用して、誤ってファイルをGitに追加しました。
git add myfile.txt
私はまだ実行していませんgit commit
。これを元に戻す方法はありますか?そうすれば、これらのファイルはコミットに含まれませんか?
次のコマンドを使用して、誤ってファイルをGitに追加しました。
git add myfile.txt
私はまだ実行していませんgit commit
。これを元に戻す方法はありますか?そうすれば、これらのファイルはコミットに含まれませんか?
git add
コミットする前に元に戻すことができます
git reset <file>
これにより、他に何も変更せずに、現在のインデックス(「コミットしようとしている」リスト)から削除されます。
使用できます
git reset
すべての変更をアンステージするためのファイル名なし。これは、ファイルが多すぎて妥当な時間内に1つずつリストできない場合に便利です。
古いバージョンのGitでは、上記のコマンドはそれぞれとと同等でgit reset HEAD <file>
あり、が未定義の場合(リポジトリでコミットを行っていないため)またはあいまいな場合(と呼ばれるブランチを作成したため)は失敗します。これは愚かなことです。あなたがすべきではないこと)。ただし、これはGit 1.8.2で変更されたため、Gitの最新バージョンでは、最初のコミットを行う前でも上記のコマンドを使用できます。git reset HEAD
HEAD
HEAD
「gitreset」(オプションまたはパラメーターなし)は、履歴にコミットがない場合にエラーを出すために使用されていましたが、現在は空のインデックスを提供します(存在しないコミットと一致させるため)。
ドキュメント:git reset
あなたがしたい:
git rm --cached <added_file_to_undo>
理由:
私がこれに慣れていないとき、私は最初に試しました
git reset .
(最初の追加全体を元に戻すため)、次の(そうではない)役立つメッセージが表示されるだけです:
fatal: Failed to resolve 'HEAD' as a valid ref.
これは、最初のコミット後まで HEAD ref (ブランチ?) が存在しないためであることが判明しました。つまり、私のようなワークフローが次のようなものである場合、私と同じ初心者の問題に遭遇することになります。
git init
git add .
git status
...たくさんのがらくたスクロール...
=>くそー、私はそれをすべて追加したくありませんでした。
グーグル「git addを元に戻す」
=>スタックオーバーフローを見つける - やった
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
(そして、スペルを間違えた場合はどうなりますか)。
次のように入力します。
git status
Git は、ステージングを解除する方法の説明を含め、ステージングされているものなどを通知します。
use "git reset HEAD <file>..." to unstage
Git は、このような状況で正しいことを行うように後押ししてくれます。
注: 最近の Git バージョン (1.8.4.x) では、このメッセージが変更されました。
(use "git rm --cached <file>..." to unstage)
明確にするために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
受け入れられた回答に加えて、誤って追加されたファイルが巨大な場合、「 」でインデックスから削除した後でも、ディレクトリgit reset
内のスペースを占有しているように見えることに気付くでしょう。.git
これは心配する必要はありません。ファイルは確かにまだリポジトリにありますが、「ルースオブジェクト」としてのみです。他のリポジトリに (クローンやプッシュによって) コピーされることはなく、スペースは最終的に再利用されますが、すぐにはそうではありません。心配な場合は、次を実行できます。
git gc --prune=now
更新(以下は、最も支持された回答から生じる可能性のある混乱を解消するための私の試みです):
では、 の本当の元に戻すのはgit add
どれですか?
git reset HEAD <file>
?
また
git rm --cached <file>
?
厳密に言えば、私が間違っていなければ、none .
git add
元に戻すことはできません- 一般的に安全です。
git add <file>
最初に実際に何をするかを思い出しましょう:
が以前に追跡されていない場合<file>
は、現在のコンテンツとともにキャッシュに追加します。git add
<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 によるコメントを参照してください)
git rm --cached . -r
現在のディレクトリから追加したすべてのものを再帰的に「追加解除」します
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>
走る
git gui
すべてのファイルを手動で削除するか、すべてを選択してコミットからステージング解除ボタンをクリックして削除します。
質問は明確に提起されていません。その理由には、次のgit add
2 つの意味があります。
git rm --cached file
ます。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
他の多くの回答に従って、使用できます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
最初のコミットで が使えない場合はgit reset
、「Git 破産」を宣言し、.git
フォルダーを削除して最初からやり直してください
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)
$
新しいプロジェクトを開始するときにこの厄介な問題を回避する方法は次のとおりです。
git init
。git reset
コミットがない場合、Gitを使用すると非常に困難になります。小さな初期コミットを作成するためだけに作成した場合は、その後、すべてを正しく行うために、何度でも実行できgit add -A
ますgit reset
。
この方法のもう1つの利点は、後で行末の問題が発生し、すべてのファイルを更新する必要がある場合に、簡単にできることです。
リビジョンを指定しない場合は、セパレータを含める必要があることに注意してください。私のコンソールからの例:
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)
質問を投稿してから Git が進化したのかもしれません。
$> git --version
git version 1.6.2.1
今、あなたは試すことができます:
git reset HEAD .
これはあなたが探しているものでなければなりません。
上記のように、ステージング領域から新しいファイルを削除するには (新しいファイルの場合のみ):
git rm --cached FILE
rm --cached は、誤って追加された新しいファイルに対してのみ使用してください。
特定のフォルダー (およびそのサブフォルダー) 内のすべてのファイルをリセットするには、次のコマンドを使用できます。
git reset *
コマンドを使用*
して、一度に複数のファイルを処理します。
git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*
等
入力するだけgit reset
で元に戻りgit add .
、最後のコミット以降、まったく入力しなかったかのようになります。以前にコミットしたことを確認してください。
元に戻すgit add
には、次を使用します。
git reset filename
インタラクティブモードもあります:
git add -i
ファイルの追加を取り消すには、オプション 3 を選択します。私の場合、複数のファイルを追加したいことがよくあります。対話モードでは、このような番号を使用してファイルを追加できます。これは、1、2、3、および 5 の 4 を除くすべてを使用します。
シーケンスを選択するには、1-5 と入力して 1 から 5 まですべて取得します。
このコマンドは、変更を破棄します。
git reset HEAD filename.txt
使用することもできます
git add -p
ファイルの一部を追加します。
git restore --staged .
または使用しますgit restore --staged <filename>
を使用することもできますがgit rm --cached
、このgit rm
コマンドは、既に追跡されているファイルに対して使用するのが理想的です。