インデックスにない作業コピーの変更を破棄するにはどうすればよいですか?
37 に答える
現在の作業ディレクトリにあるステージングされていないすべてのファイルについては、次を使用します。
git checkout -- .
特定のファイルを使用する場合:
git checkout -- path/to/file/to/revert
--
ここであいまいさを取り除きます (これは 引数の曖昧さの解消と呼ばれます)。
Git 2.23 以降では、より具体的な
git restore .
それぞれ
git restore path/to/file/to/revert
それは一緒にgit switch
オーバーロードされたものを置き換えますgit checkout
(here を参照)。したがって、引数の曖昧さを取り除きます。
別のより迅速な方法は次のとおりです。
git stash save --keep-index --include-untracked
--include-untracked
徹底したくない場合は、含める必要はありません。
その後、必要にgit stash drop
応じてコマンドでそのスタッシュをドロップできます。
完全な解決策は次のようです。
git clean -df
git checkout -- .
git clean
追跡されていないすべてのファイルを削除し (警告: .gitignore に直接記載されている無視されたファイルは削除しませんが、フォルダーに存在する無視されたファイルを削除する可能性があります) 、ステージングされていgit checkout
ないすべての変更をクリアします。
これにより、現在のディレクトリの現在のインデックスがチェックアウトされ、現在のディレクトリから下に向かってファイル内のすべての変更が破棄されます。
git checkout .
または、インデックスからすべてのファイルをチェックアウトし、作業ツリーファイルを上書きします。
git checkout-index -a -f
git clean -df
現在のディレクトリから開始して、バージョン管理下にないファイルを再帰的に削除することにより、作業ツリーをクリーンアップします。
-d
: 追跡されていないファイルに加えて、追跡されていないディレクトリを削除します
-f
:力(設定によっては必要ない場合もある clean.requireForce
)
実行git help clean
してマニュアルを見る
2019年更新
次の方法で、 1 つの追跡ファイルのステージングされていない変更を破棄できるようになりました。
git restore <file>
そして、現在のディレクトリ内のすべての追跡されたファイルで (再帰的に):
git restore .
後者をリポジトリのルートから実行すると、プロジェクト内のすべての追跡ファイルのステージングされていない変更が破棄されます。
ノート
git restore
は2019 年 7 月に導入され、バージョン 2.23 でgit checkout
コマンドgit restore
のファイルgit switch
用とブランチ用の分割の一部としてリリースされました。git checkout
以前と同じように動作し、古い回答は完全に有効なままです。- 作業ツリーでステージングされていない変更を実行
git status
している場合、これは Git がそれらを破棄するために使用することを提案するものになりました (git checkout -- <file>
v2.23 より前に使用されていたのではなく)。 - と同様に
git checkout -- .
、これは追跡されたファイルの変更のみを破棄します。したがって、Mariusz Nowak の回答は引き続き適用されます。追跡されていないファイルを含む、ステージングされていないすべての変更を破棄する場合は、彼が提案するように、追加のgit clean -df
.
私のお気に入りは
git checkout -p
これにより、チャンクを選択的に元に戻すことができます。
以下も参照してください。
git add -p
私が使用する正確なオプションの組み合わせを示唆する答えはないので、ここにあります:
git clean -dxn . # dry-run to inspect the list of files-to-be-removed
git clean -dxf . # REMOVE ignored/untracked files (in the current directory)
git checkout -- . # ERASE changes in tracked files (in the current directory)
git clean
これは、使用されるオプションのオンライン ヘルプ テキストです。
-d
追跡されていないファイルに加えて、追跡されていないディレクトリを削除します。追跡されていないディレクトリが別の Git リポジトリによって管理されている場合、デフォルトでは削除されません。-f
そのようなディレクトリを本当に削除したい場合は、オプションを 2 回使用してください。
-x
.gitignore
(ディレクトリごとに) およびから読み取られる標準の無視ルールを使用しないでください$GIT_DIR/info/exclude
。ただし、オプションで指定された無視ルールを引き続き使用し-e
ます。これにより、ビルド プロダクトを含む、追跡されていないすべてのファイルを削除できます。これを (おそらく と組み合わせてgit reset
) 使用して、元の作業ディレクトリを作成し、クリーン ビルドをテストできます。
-n
実際には何も削除せず、何が行われるかを示すだけです。
-f
Git 構成変数clean.requireForce
が に設定されていない場合、Git clean は、、、または が指定されていない限り、ファイルまたはfalse
ディレクトリの削除を拒否します。Git は、秒が指定されない限り、サブディレクトリまたはファイル内のディレクトリの削除を拒否します。-f
-n
-i
.git
-f
どのコマンドをいつ使用するかを説明するのに、この記事が本当に役に立ちました。
いくつかの異なるケースがあります:
ファイルをステージングしていない場合は、
git checkout
. チェックアウトは、「インデックス内のバージョンと一致するように作業ツリー内のファイルを更新します」。ファイルがステージングされていない (インデックスに追加されている) 場合...このコマンドは、基本的にファイルを最後のコミットの状態に戻します。git checkout -- foo.txt
ファイルをステージングした場合は、git reset を使用します。Reset は、コミットに一致するようにインデックスを変更します。
git reset -- foo.txt
git stash
危険性が少し低いため、を使用するのが一般的な選択肢であると思います。git reset を使用しているときに誤って吹き飛ばしすぎた場合は、いつでも元に戻すことができます。デフォルトでは、リセットは再帰的です。
詳しいアドバイスについては、上記の記事をご覧ください。
ステージングされていない変更を保持することに興味がない場合 (特に、ステージングされた変更が新しいファイルである場合)、これが便利であることがわかりました。
git diff | git apply --reverse
git status と入力すると、 (「git checkout -- ...」を使用して作業ディレクトリの変更を破棄します) が表示されます。
例えばgit checkout -- .
git stash を使用できます。問題が発生した場合でも、stash から元に戻すことができます。ここでの他の回答と同様ですが、これはステージングされていないすべてのファイルとステージングされていないすべての削除も削除します。
git add .
git stash
すべてが問題ないことを確認したら、スタッシュを破棄します。
git stash drop
Bilal Maqsood からの回答git clean
も私にとってはうまくいきましたが、スタッシュを使用すると、より制御できます-誤って sth を実行した場合でも、変更を元に戻すことができます
アップデート
もう1つ変更があると思います(なぜこれが以前にうまくいったのかわかりません):
git add . -A
それ以外のgit add .
-A
削除されたファイルがないとステージングされません
変更を破棄する代わりに、リモートを原点にリセットしました。注 - この方法は、フォルダーをリポジトリのフォルダーに完全に復元することです。
だから私はこれを行って、git reset 時にそれらがそこに座っていないことを確認します (後で - Origin/branchname の gitignores を除外します)
注:まだ追跡されていないファイルを保持したいが、GITIGNOREにはない場合は、リモートリポジトリで見つからないこれらの追跡されていないファイルをワイプするため、この手順をスキップすることをお勧めします(@XtrmJoshに感謝します)。
git add --all
その後私は
git fetch --all
それから私は原点にリセットします
git reset --hard origin/branchname
それはそれを振り出しに戻します。ブランチを再クローンするのと同じように、すべての gitignored ファイルをローカルで適切な場所に保持しながら。
以下のユーザー コメントごとに更新: をユーザーが現在のブランチにリセットするためのバリエーション。
git reset --hard @{u}
上記の解決策をすべて試しましたが、ステージングされていない新しいファイルを削除できませんでした。
git clean -f
これらの新しいファイルを削除するために使用しますが、注意が必要です! force オプションに注意してください。
使用するだけです:
git stash -u
終わり。簡単。
スタッシュ スタックを本当に気にする場合は、 git stash drop
. しかし、その時点で、(Mariusz Nowak から) を使用する方が良いでしょう:
git checkout -- .
git clean -df
git stash -u
それにもかかわらず、追跡された変更と追跡されていないすべての変更を1 つのコマンドで「破棄」するので、私は最高に気に入っています。それでもgit checkout -- .
、追跡された変更のみを破棄し、追跡されていgit clean -df
ない変更のみを破棄します...両方のコマンドを入力するのは非常に面倒です:)
簡単に言うと
git stash
ローカルのすべての変更が削除されます。と言って後で使うこともできます
git stash apply
または git stash pop
あなたは非常に単純な git コマンドを持っていますgit checkout .
これは、次のディレクトリでも機能します。通常の git 権限の範囲外。
sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx
最近私に起こったこと
cd path_to_project_folder # take you to your project folder/working directory
git checkout . # removes all unstaged changes in working directory
私の意見では、
git clean -df
トリックを行う必要があります。git clean に関する Git ドキュメントに従って
git-clean - 作業ツリーから追跡されていないファイルを削除します
説明
現在のディレクトリから開始して、バージョン管理下にないファイルを再帰的に削除することにより、作業ツリーをクリーンアップします。
通常は Git に認識されていないファイルのみが削除されますが、-x オプションを指定すると、無視されたファイルも削除されます。これは、たとえば、すべてのビルド プロダクトを削除するのに役立ちます。
オプションの ... 引数が指定されている場合、それらのパスのみが影響を受けます。
オプション
-d 追跡されていないファイルに加えて、追跡されていないディレクトリを削除します。追跡されていないディレクトリが別の Git リポジトリによって管理されている場合、デフォルトでは削除されません。そのようなディレクトリを本当に削除したい場合は、-f オプションを 2 回使用してください。
-f --force Git 構成変数 clean.requireForce が false に設定されていない場合、-f、-n、または -i を指定しない限り、git clean は実行を拒否します。
git clean -df よりも具体的な新しいファイルを削除する別の方法 (必ずしもすべてではなく一部のファイルを削除できるようになります) は、最初に新しいファイルをインデックスに追加し、次に stash してから削除することです。隠します。
この手法は、何らかの理由で、追跡されていないすべてのファイルを通常のメカニズム (rm など) で簡単に削除できない場合に役立ちます。
スタッシュを他の人に譲渡したい場合:
# add files
git add .
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff
[編集] コメントしたように、隠し場所に名前を付けることができます。隠し場所を共有したい場合は、これを使用してください ;)
サブモジュールの場合で、他の解決策が機能しない場合は、次を試してください。
何が問題なのかを確認するには (おそらく「汚い」ケース)、次を使用します。
git diff
スタッシュを削除するには
git submodule update
ステージングされたすべてのファイルが実際にコミットされた場合、たとえば GUI から約 3 回のマウス クリックでブランチを簡単にリセットできます: Branch、Reset、Yes !
したがって、私が実際に不要なローカル変更を元に戻すためによく行うことは、すべての適切なものをコミットしてから、ブランチをリセットすることです。
良いものが単一のコミットでコミットされている場合、最終的に少し異なるコミットをしたい場合は、「最後のコミットを修正する」を使用してステージングまたはステージング解除に戻すことができます。
これは、問題に対して探している技術的な解決策ではないかもしれませんが、非常に実用的な解決策だと思います。ステージングされていない変更を選択的に破棄し、気に入らない変更をリセットして、行った変更を保持することができます。
要約すると、単純にcommit、branch reset、amend last commit を実行します。
念のため、新しいバージョンの git には restore コマンドがあります。これは、ファイルを変更したときに git status と入力する際の推奨事項でもあります。
(コミットされる内容を更新するには、「git add ...」を使用します)
(「git restore ...」を使用して、作業ディレクトリの変更を破棄します)
したがって、git 'restore' はこれに対する最新のソリューションです。「git status」と入力した後、git からの提案を読むことは常に良い考えです :-)
使用するだけです:
git stash -k -u
これにより、ステージングされていない変更と追跡されていないファイル (新しいファイル)が隠され、ステージングされたファイルが保持されます。
reset
/ checkout
/よりも優れてclean
います。後で ( までに) 戻したい場合があるからですgit stash pop
。それらを隠し場所に保管することは、それらを破棄するよりも優れています.