最後のgit addを元に戻すにはどうすればよいですか?


193

gitで最後にステージングされた(コミットされていない)変更をアンステージングすることは可能ですか?現在のブランチにステージングされているファイルとされていないファイルが多数あるとします。ある時点で、愚かなプログラマーが誤って実行しました。

git add -- .

...の代わりに:

git checkout -- .

このプログラマーは、いくつかの魔法のgitコマンドを使用して、最後の変更のステージを解除できますか?それとも、最初に実験する前に彼はコミットすべきだったのでしょうか?


へえ。私たちはこれからも役に立つ質問と回答を得ました。
steveha


私はそれが複製ではないと信じています。他の質問のOPは、これを元に戻す方法またはこれらのファイルをコミットから削除する方法を求めています。私は正確に、最後のgit addコマンドで追加された変更を元に戻したいと思っています。特に、すでにステージングされた変更があり、ステージングではなく元に戻す必要のある変更があったファイルについてです。ただし、他の質問は関連性がないとは言えません。
Septagram 2015年

1
おそらく、彼は最初に実験する前に/ been /をコミットしておくべきでしょう。
android.weasel

@ android.weaselはい、それは何年も前
でした

回答:


299

使用できますgit reset。これにより、最後のコミット後に追加したすべてのファイルが「ステージング解除」されます。

一部のファイルのみをアンステージする場合は、を使用しますgit reset -- <file 1> <file 2> <file n>

また、を使用して、ファイルの変更の一部をステージング解除することもできますgit reset -p


3
なんて悲しい。結局のところ、私のコミットメントに何か問題があると思います。-pスイッチについて言及したので、この回答を受け入れます。ありがとう!:)
Septagram 2012

(私にとって)エラーを生成します:致命的: 'HEAD'を有効な参照として解決できませんでした。私はまだ何もコミットしていません(新しいリポジトリ)git addを実行しました。そしてそれを後悔した。追加全体をリセットするのではなく、1つのディレクトリだけをリセットします。git reset-dir /*.*は上記のエラーを生成します。
Francis Davey

...ああ、私には何が起こっているのかわかります。HEADがポイントするものはまだなかったため、git resetは失敗しました(HEADで動作するため)。
Francis Davey

42

最新の git addを取り消すことはできませんがadd、最後のコミット以降のすべてのを取り消すことができます。git resetcommit引数を指定しないと、インデックスがリセットされます(段階的な変更のステージングが解除されます)。

git reset

2
最新の git addを元に戻すことはできません」:うわー、これは驚くべきことであり、痛みを伴う可能性があります。これの決定的な情報源はありますか?また、そうすべきである正当な理由はありますか?ありがとう!
Andrew Moylan 2016年

@AndrewMoylan:まあ、それを自動的に行う方法はありません。常にreset単一のファイルを使用するreset -pことも、特定のハンクをアンステージするために使用することもできます。
knittl 2016年

15

だから本当の答えは

このプログラマーは、いくつかの魔法のgitコマンドを使用して、最後の変更のステージを解除できますか?

実際には:いいえ、最後のステージだけをアンステージすることはできませんgit add

これは、次のような状況で質問を解釈した場合です。

初期ファイル:

void foo() {

}

main() {
    foo();
}

最初の変更とそれに続くgit add

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

次の変更git add

void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337, "h4x0r");
}

この場合、git reset -p最小の細分性は行であるため、役に立ちません。gitの中間状態については知らない:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

もう。


私がプラスしたのは、新しいgitユーザーとして、これは友達が「チェックインの衛生状態が良い」と説明していることを強調する非常に重要な区別であるということです。
2018年


3

日付でgitプロンプト:

  1. use "git rm --cached <file>..." to unstageファイルがリポジトリになかった場合。ファイルをアンステージングして、そこに保持します。
  2. use "git reset HEAD <file>..." to unstageファイルがリポジトリ内にあり、変更されたものとして追加する場合。ファイルをそのまま保持し、ステージングを解除します。

私の知る限りでは、元に戻すことはできませんgit add --が、上記のようにファイルのリストをアンステージすることはできます。


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

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

    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>
    

2

あなたがしたい場合は、すべての追加のファイルを削除コミットするためにはgitから

git reset

個別のファイル削除したい場合

git rm <file>

1

使用できます

git reset

最近追加されたローカルファイルを元に戻すには

 git reset file_name

特定のファイルの変更を元に戻すには


0

難しいサイズとスケールに応じて、スクラッチ(一時)ブランチを作成し、そこに現在の作業をコミットできます。

次に、元のブランチに切り替えてチェックアウトし、スクラッチコミットから適切なファイルを選択します。

少なくとも、そのスクラッチブランチを削除するまで、現在と以前の状態の永続的な記録が作成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.