この投稿を改善したいですか?引用や回答が正しい理由の説明など、この質問に対する詳細な回答を提供してください。詳細が不十分な回答は、編集または削除される場合があります。 次のコマンドを使用して、誤ってファイルをGitに追加しました。 git add myfile.txt 私はまだgitcommitを実行していません。これを元に戻す方法はありますか?そうすれば、これらのファイルはコミットに含まれませんか?
1 2 次 コミットする前にgitaddを元に戻すことができます git reset <ファイル> これにより、他に何も変更せずに、現在のインデックス(「コミットしようとしている」リスト)から削除されます。 使用できます gitリセット 予定されているすべての変更をステージング解除するためのファイル名なし。これは、ファイルが多すぎて妥当な時間内に1つずつリストできない場合に便利です。 古いバージョンのGitでは、上記のコマンドはそれぞれgit reset HEADおよびgitreset HEADと同等であり、HEADが未定義(リポジトリでコミットを行っていないため)またはあいまいな場合( HEADというブランチを作成しました。これはあなたがすべきではない愚かなことです)。ただし、これはGit 1.8.2で変更されたため、Gitの最新バージョンでは、最初のコミットを行う前でも上記のコマンドを使用できます。 「gitreset」(オプションまたはパラメーターなし)は、次の場合にエラーアウトするために使用されます 履歴にコミットはありませんが、今では 空のインデックス(存在しないコミットと一致させるために)。 ドキュメント:git reset | あなたが欲しい: git rm --cached 理由: 私がこれに不慣れだったとき、私は最初に試しました gitreset。 (最初の追加全体を元に戻すため)、これ(そうではない)の役立つメッセージを取得するためだけに: 致命的:「HEAD」を有効な参照として解決できませんでした。 これは、最初のコミットが完了するまでHEAD ref(ブランチ?)が存在しないためであることが判明しました。つまり、私のようなワークフローが次のようなものである場合、私と同じ初心者の問題に遭遇します。 新しいホットさであるGitを試すために、私のすばらしい新しいプロジェクトディレクトリにCDを挿入してください git init gitadd。 gitステータス ...たくさんのがらくた巻物... =>くそー、私はそのすべてを追加したくありませんでした。 google "undo git add" =>スタックオーバーフローを見つける-イェーイ gitreset。 =>致命的:「HEAD」を有効な参照として解決できませんでした。 さらに、メーリングリストにこれが役に立たないことに対してログに記録されたバグがあることが判明しました。 そして、正しい解決策がGitステータス出力にありました(はい、私は 'がらくたとしてグロスオーバーしました) ..。 #コミットする変更: #( "git rm --cached ..."を使用してステージングを解除します) ..。 そして、解決策は確かにgit rm --cachedFILEを使用することです。 ここの他の場所での警告に注意してください-gitrmはファイルのローカル作業コピーを削除しますが、-cachedを使用する場合は削除しません。 git helprmの結果は次のとおりです。 -キャッシュ このオプションを使用して、パスをステージング解除し、インデックスからのみ削除します。 変更されているかどうかに関係なく、作業ツリーファイルは残されます。 使用を続行します git rm--cached。 すべてを削除してやり直します。ただし、追加している間は機能しませんでした。は再帰的であり、再帰するにはrmに-rが必要であることがわかります。はぁ。 git rm -r--cached。 さて、今、私は始めたところに戻っています。次回は、-nを使用してドライランを実行し、何が追加されるかを確認します。 git add-n。 --cachedが何も破壊しないことについてgithelp rmを信頼する前に、すべてを安全な場所に圧縮しました(スペルを間違えた場合はどうなりますか)。 | 入力した場合: gitステータス Gitは、ステージングを解除する方法の説明を含め、ステージングされているものなどを教えてくれます。 「gitresetHEAD ...」を使用してステージングを解除します Gitは、このような状況で正しいことをするように私を促すのにかなり良い仕事をしていると思います。 注:最近のGitバージョン(1.8.4.x)では、次のメッセージが変更されています。 (「gitrm --cached ...」を使用してステージングを解除します) | 明確にするために:git addは、変更を現在の作業ディレクトリからステージング領域(インデックス)に移動します。 このプロセスはステージングと呼ばれます。したがって、変更(変更されたファイル)をステージングする最も自然なコマンドは明らかなものです。 gitステージ git addは、gitステージの入力が簡単なエイリアスです。 残念ながら、gitunstageコマンドもgitunaddコマンドもありません。関連するものを推測したり覚えたりするのは難しいですが、それはかなり明白です: git resetHEAD- このためのエイリアスを簡単に作成できます。 git config --global alias.unadd 'リセットHEAD-' git config --global alias.unstage 'リセットHEAD-' そして最後に、新しいコマンドがあります。 git add file1 gitステージファイル2 git unadd file2 git unstage file1 個人的には、さらに短いエイリアスを使用しています。 git a#ステージング用 git u#ステージング解除用 | 受け入れられた答えに加えて、誤って追加されたファイルが巨大な場合、「git reset」でインデックスから削除した後でも、.gitディレクトリのスペースを占有しているように見えることに気付くでしょう。 これは心配する必要はありません。ファイルは確かにまだリポジトリにありますが、「ルーズオブジェクト」としてのみです。 (クローン、プッシュを介して)他のリポジトリにコピーされることはなく、スペースは最終的に再利用されます-おそらくすぐにはありませんが。心配な場合は、次のコマンドを実行できます。 git gc --prune = now 更新(以下は、最も賛成の回答から生じる可能性のあるいくつかの混乱を解消するための私の試みです): では、git addの本当の取り消しはどれですか? git reset HEAD ? または git rm --cached ? 厳密に言えば、私が間違っていなければ:なし。 git addは元に戻せません-一般的に、安全に。 まず、git add が実際に行うことを思い出してみましょう。 が以前に追跡されていなかった場合、gitaddはそれをに追加します現在のコンテンツを含むキャッシュ。 がすでに追跡されている場合、git addは現在のコンテンツ(スナップショット、バージョン)をキャッシュに保存します。 Gitでは、ファイルの2つの異なるバージョン(スナップショット)が2つの異なるアイテムと見なされるため、このアクションは引き続き追加と呼ばれます(単に更新するだけではありません)。したがって、実際に新しいアイテムをキャッシュに追加し、最終的には後でコミットします。 これに照らして、質問は少し曖昧です: コマンドを使用して誤ってファイルを追加しました... OPのシナリオは最初のもの(追跡されていないファイル)のようです。「元に戻す」で追跡されたアイテムからファイル(現在のコンテンツだけでなく)を削除する必要があります。この場合は、git rm --cached を実行しても問題ありません。 また、git reset HEAD を実行することもできます。これは両方のシナリオで機能するため、一般的には望ましい方法です。すでに追跡されているアイテムのバージョンを誤って追加した場合にも元に戻します。 ただし、2つの注意点があります。 最初:(回答で指摘されているように)git reset HEADが機能しないシナリオは1つだけですが、git rm --cachedは機能します:新しいリポジトリ(コミットなし)。しかし、実際には、これは実質的に無関係なケースです。 2番目:git reset HEADは、以前にキャッシュされたファイルの内容を魔法のように復元することはできず、HEADから再同期するだけであることに注意してください。誤ったガイド付きgitaddが、以前にステージングされたコミットされていないバージョンを上書きした場合、それを回復することはできません。そのため、厳密に言えば、元に戻すことはできません[*]。 例: $ git init $ echo "バージョン1"> file.txt $ git add file.txt#file.txtの最初の追加 $ git commit -m '最初のコミット' $ echo "バージョン2"> file.txt $ git add file.txt#file.txtのステージ(コミットしない)「バージョン2」 $ git diff --cached file.txt -バージョン1 +バージョン2 $ echo "バージョン3"> file.txt $ git diff file.txt -バージョン2 +バージョン3 $ git add file.txt#おっと、これは意味がありませんでした $ git reset HEAD file.txt#元に戻しますか? $ git diff --cached file.txt#もちろん、difはありません。ステージ== HEAD $ git diff file.txt#「バージョン2」が取り返しのつかないほど失われました -バージョン1 +バージョン3 もちろん、新しいファイルを追加するためだけに「git add」を実行する通常の怠惰なワークフロー(ケース1)に従い、commit、git commit -aコマンドを使用して新しいコンテンツを更新する場合、これはそれほど重要ではありません。 *(編集:上記は実質的に正しいですが、ステージングされたがコミットされてから上書きされた変更を回復するための少しハック/複雑な方法がある可能性があります-Johannes Matokicとiolsmitによるコメントを参照してください) | すでに追加されているファイルを元に戻すのは、Gitを使用すると非常に簡単です。すでに追加されているmyfile.txtをリセットするには、次を使用します。 git reset HEAD myfile.txt 説明: 不要なファイルをステージングした後、元に戻すには、gitresetを実行できます。 Headはローカル内のファイルの先頭であり、最後のパラメーターはファイルの名前です。 これらの場合に発生する可能性のあるすべてのステップを含め、以下の画像のステップを詳細に作成しました。 | git rm--cached。 -r 現在のディレクトリから追加したものすべてを再帰的に「追加解除」します | 実行 git gui すべてのファイルを手動で削除するか、すべてを選択して[コミットからアンステージ]ボタンをクリックして削除します。 | 問題は明確に提起されていません。その理由は、gitaddには2つの意味があるためです。 ステージング領域に新しいファイルを追加してから、git rm --cachedfileで元に戻します。 変更したファイルをステージング領域に追加してから、git resetHEADファイルで元に戻します。 疑わしい場合は、 git resetHEADファイル どちらの場合も期待通りのことをするからです。 警告:変更されたファイル(以前にリポジトリに存在していたファイル)に対してgit rm --cached fileを実行すると、ファイルはgitcommitで削除されます。それはファイルシステムにまだ存在しますが、他の誰かがあなたのコミットをプルすると、ファイルは彼らの作業ツリーから削除されます。 git statusは、ファイルが新しいファイルであるか変更されているかを示します。 ブランチマスターについて コミットする変更: (「gitreset HEAD ...」を使用してステージングを解除します) 新しいファイル:my_new_file.txt 変更:my_modified_file.txt | Gitには、考えられるすべてのアクションに対するコマンドがありますが、物事を正しく行うには広範な知識が必要であり、そのため、せいぜい直感に反します... 以前にしたこと: ファイルを変更し、git add。、またはgit add を使用しました。 あなたが欲しいもの: インデックスからファイルを削除しますが、バージョン管理を維持し、作業コピーにコミットされていない変更を残します。 git reset HEAD <ファイル> ファイルをHEADから最後の状態にリセットし、変更を元に戻し、インデックスから削除します。 # `svn revert ` IIRCを考えてください。 git reset HEAD <ファイル> git checkout <ファイル> # ` `のような名前の ` `がある場合は、以下を使用します。 git checkout- git reset --hard HEADは単一のファイルでは機能しないため、これが必要です。 インデックスとバージョン管理から を削除し、バージョン管理されていないファイルを作業コピーの変更とともに保持します。 git rm --cached <ファイル> 作業コピーとバージョン管理から を完全に削除します。 git rm <ファイル> | 最初のコミットを行っていて、gitを使用できない場合リセットし、「Git破産」を宣言し、.gitフォルダーを削除して最初からやり直します | 他の多くの回答と同様に、gitresetを使用できます だが: git unaddのGitコマンド(まあ、エイリアス)を実際に追加するこの素晴らしい小さな投稿を見つけました。詳細については、gitunaddを参照してください。 単に、 git config --global alias.unadd "reset HEAD" 今、あなたはできる git unadd foo.txt bar.txt | git add -iを使用して、追加したばかりのファイルを次のコミットから削除します。例: 不要なファイルを追加する: $ git add foo $ gitステータス #ブランチマスター上 #コミットする変更: #(「gitreset HEAD ...」を使用してステージングを解除します) # #新しいファイル:foo # #追跡されていないファイル: #(「gitadd ...」を使用して、コミットされる内容に含めます) #[...]# インタラクティブな追加に移動して追加を元に戻します(ここでgitで入力したコマンドは、「r」(元に戻す)、「1」(リストの最初のエントリを元に戻す)、「return」で元に戻すモードを終了し、「q」です。 (終了する): $ git add -i ステージングされたステージングされていないパス 1:+ 1 / -0何もfoo ***コマンド*** 1:[s] tatus 2:[u] pdate 3:[r] evert 4:[a] dd追跡されていない 5:[p] atch 6:[d] iff 7:[q] uit 8:[h] elp 今何> r ステージングされたステージングされていないパス 1:+ 1 / -0なし[f] oo 元に戻す>> 1 ステージングされたステージングされていないパス * 1:+ 1 / -0なし[f] oo 元に戻す>> 注:fooは現在追跡されていません。 1つのパスを元に戻しました ***コマンド*** 1:[s] tatus 2:[u] pdate 3:[r] evert 4:[a] dd追跡されていない 5:[p] atch 6:[d] iff 7:[q] uit 8:[h] elp 今何> q さようなら。 $ それでおしまい!これがあなたの証明であり、「foo」が追跡されていないリストに戻ったことを示しています。 $ gitステータス #ブランチマスター上 #追跡されていないファイル: #(「gitadd ...」を使用して、コミットされる内容に含めます) #[...] #foo コミットに何も追加されていませんが、追跡されていないファイルが存在します(追跡するには「gitadd」を使用してください) $ | これには、gitremoveまたはgitrmを--cachedフラグとともに使用できます。試してみてください: git help rm | 新しいプロジェクトを開始するときにこの厄介な問題を回避する方法は次のとおりです。 新しいプロジェクトのメインディレクトリを作成します。 gitinitを実行します。 次に、.gitignoreファイルを作成します(空の場合でも)。 .gitignoreファイルをコミットします。 Gitを使用すると、コミットがない場合にgitresetを実行するのが非常に困難になります。小さな初期コミットを作成するだけの場合は、その後、すべてを正しく行うために、git add-Aとgitresetを何度でも実行できます。 この方法のもう1つの利点は、後で行末の問題が発生し、すべてのファイルを更新する必要がある場合に、簡単にできることです。 その最初のコミットをチェックしてください。これにより、すべてのファイルが削除されます。 次に、最新のコミットをもう一度確認してください。これにより、現在の行末設定を使用して、ファイルの新しいコピーが取得されます。 | 質問を投稿してからGitが進化したのかもしれません。 $> git --version gitバージョン1.6.2.1 今、あなたは試すことができます: git resetHEAD。 これはあなたが探しているものでなければなりません。 | リビジョンを指定しない場合は、区切り文字を含める必要があることに注意してください。私のコンソールからの例: git reset 致命的:あいまいな引数 ' ':不明なリビジョンまたはパスが作業ツリーにありません。 '-'を使用して、パスをリビジョンから分離します git reset- リセット後のステージングされていない変更: M (Gitバージョン1.7.5.4) | 上記のように、ステージング領域から新しいファイルを削除するには(新しいファイルの場合のみ): git rm --cached FILE 誤って追加された新しいファイルに対してのみrm--cachedを使用します。 | 特定のフォルダー(およびそのサブフォルダー)内のすべてのファイルをリセットするには、次のコマンドを使用できます。 git reset * | *コマンドを使用して、一度に複数のファイルを処理します。 git reset HEAD * .prj git reset HEAD * .bmp git reset HEAD * gdb * 等 | git resetと入力するだけで元に戻り、gitaddと入力したことがないようになります。最後のコミット以降。以前にコミットしたことを確認してください。 | 新しいファイルnewFile.txtを作成するとします。 誤ってファイルを追加したとすると、git addnewFile.txt: ここで、コミットする前に、この追加を元に戻したいと思います。gitreset newFile.txt: | 特定のファイルの場合: git reset my_file.txt git checkout my_file.txt 追加されたすべてのファイルの場合: gitreset。 gitcheckout。 注:チェックアウトはファイル内のコードを変更し、最後に更新された(コミットされた)状態に移行します。リセットしてもコードは変更されません。ヘッダーをリセットするだけです。 | git addを元に戻すには、次を使用します。 git resetfilename | このコマンドは、変更を破棄します。 git reset HEAD filename.txt 使用することもできます git add -p ファイルの一部を追加します。 | インタラクティブモードもあります: git add -i オプション3を選択して、ファイルの追加を解除します。私の場合、複数のファイルを追加したいことがよくあります。インタラクティブモードでは、このような番号を使用してファイルを追加できます。これには、4:1、2、3、および5を除くすべてがかかります シーケンスを選択するには、1-5と入力して、1から5まですべてを取得します。 Gitステージングファイル | git add myfile.txt#これにより、ファイルがコミット予定リストに追加されます このコマンドの正反対は、 git reset HEAD myfile.txt#これにより元に戻されますそれ。 したがって、前の状態になります。指定は再び追跡されていないリストになります(前の状態)。 それはその指定されたファイルであなたの頭をリセットします。したがって、頭に意味がない場合は、単にリセットされます。 | git reset filename.txt 何も変更せずに、filename.txtという名前のファイルを現在のインデックスである「コミットしようとしている」領域から削除します。 | git reset filename.txt 何も変更せずに、filename.txtという名前のファイルを現在のインデックスである「コミットしようとしている」領域から削除します。 | Sourcetreeでは、GUIを介してこれを簡単に行うことができます。 Sourcetreeがファイルのステージングを解除するために使用するコマンドを確認できます。 新しいファイルを作成してGitに追加しました。次に、SourcetreeGUIを使用してステージングを解除しました。 結果は次のとおりです。 ファイルのステージング解除[08/12/1510:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q --path / to / file / filename.java Sourcetreeは、resetを使用して新しいファイルのステージングを解除します。 | 1 2 次 非常に活発な質問。この質問に答えるために10の評判を獲得してください。レピュテーション要件は、この質問をスパムや無回答のアクティビティから保護するのに役立ちます。 あなたが探している答えではありませんか? git version-control git-commit git-stageとタグ付けされた他の質問を参照するか、独自の質問をしてください。