5616

インデックスにない作業コピーの変更を破棄するにはどうすればよいですか?

4

37 に答える 37

6376

現在の作業ディレクトリにあるステージングされていないすべてのファイルについては、次を使用します。

git checkout -- .

特定のファイルを使用する場合:

git checkout -- path/to/file/to/revert

--ここであいまいさを取り除きます (これは 引数の曖昧さの解消と呼ばれます)。

Git 2.23 以降では、より具体的な

git restore .

それぞれ

git restore path/to/file/to/revert

それは一緒にgit switchオーバーロードされたものを置き換えますgit checkouthere を参照)。したがって、引数の曖昧さを取り除きます。

于 2008-09-09T19:37:40.467 に答える
3045

別のより迅速な方法は次のとおりです。

git stash save --keep-index --include-untracked

--include-untracked徹底したくない場合は、含める必要はありません。

その後、必要にgit stash drop応じてコマンドでそのスタッシュをドロップできます。

于 2008-09-09T19:39:24.970 に答える
2129

完全な解決策は次のようです。

git clean -df
git checkout -- .

git clean追跡されていないすべてのファイルを削除し (警告: .gitignore に直接記載されている無視されたファイルは削除しませんが、フォルダーに存在する無視されたファイルを削除する可能性があります) 、ステージングされていgit checkoutないすべての変更をクリアします。

于 2012-08-29T18:28:04.550 に答える
374

これにより、現在のディレクトリの現在のインデックスがチェックアウトされ、現在のディレクトリから下に向かってファイル内のすべての変更が破棄されます。

git checkout .

または、インデックスからすべてのファイルをチェックアウトし、作業ツリーファイルを上書きします。

git checkout-index -a -f
于 2009-06-20T10:28:04.730 に答える
276
git clean -df

現在のディレクトリから開始して、バージョン管理下にないファイルを再帰的に削除することにより、作業ツリーをクリーンアップします。

-d: 追跡されていないファイルに加えて、追跡されていないディレクトリを削除します

-f:力(設定によっては必要ない場合もある clean.requireForce

実行git help cleanしてマニュアルを見る

于 2011-12-07T13:09:52.033 に答える
177

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.
于 2019-09-11T01:30:29.573 に答える
121

私のお気に入りは

git checkout -p

これにより、チャンクを選択的に元に戻すことができます。

以下も参照してください。

git add -p
于 2014-10-10T12:31:28.063 に答える
119

私が使用する正確なオプションの組み合わせを示唆する答えはないので、ここにあります:

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

于 2016-04-28T19:46:06.557 に答える
63

どのコマンドをいつ使用するかを説明するのに、この記事が本当に役に立ちました

いくつかの異なるケースがあります:

  1. ファイルをステージングしていない場合は、git checkout. チェックアウトは、「インデックス内のバージョンと一致するように作業ツリー内のファイルを更新します」。ファイルがステージングされていない (インデックスに追加されている) 場合...このコマンドは、基本的にファイルを最後のコミットの状態に戻します。

    git checkout -- foo.txt

  2. ファイルをステージングした場合は、git reset を使用します。Reset は、コミットに一致するようにインデックスを変更します。

    git reset -- foo.txt

git stash危険性が少し低いため、を使用するのが一般的な選択肢であると思います。git reset を使用しているときに誤って吹き飛ばしすぎた場合は、いつでも元に戻すことができます。デフォルトでは、リセットは再帰的です。

詳しいアドバイスについては、上記の記事をご覧ください。

于 2012-08-13T21:31:04.630 に答える
50

ステージングされていない変更を保持することに興味がない場合 (特に、ステージングされた変更が新しいファイルである場合)、これが便利であることがわかりました。

git diff | git apply --reverse
于 2011-07-28T05:27:18.057 に答える
45

git status と入力すると、 (「git checkout -- ...」を使用して作業ディレクトリの変更を破棄します) が表示されます。

例えばgit checkout -- .

于 2016-05-17T11:27:17.517 に答える
43

git stash を使用できます。問題が発生した場合でも、stash から元に戻すことができます。ここでの他の回答と同様ですが、これはステージングされていないすべてのファイルとステージングされていないすべての削除も削除します。

git add .
git stash

すべてが問題ないことを確認したら、スタッシュを破棄します。

git stash drop

Bilal Maqsood からの回答git cleanも私にとってはうまくいきましたが、スタッシュを使用すると、より制御できます-誤って sth を実行した場合でも、変更を元に戻すことができます

アップデート

もう1つ変更があると思います(なぜこれが以前にうまくいったのかわかりません):

git add . -Aそれ以外のgit add .

-A削除されたファイルがないとステージングされません

于 2015-09-11T11:59:41.843 に答える
38

変更を破棄する代わりに、リモートを原点にリセットしました。注 - この方法は、フォルダーをリポジトリのフォルダーに完全に復元することです。

だから私はこれを行って、git reset 時にそれらがそこに座っていないことを確認します (後で - Origin/branchname の gitignores を除外します)

注:まだ追跡されていないファイルを保持したいが、GITIGNOREにはない場合は、リモートリポジトリで見つからないこれらの追跡されていないファイルをワイプするため、この手順をスキップすることをお勧めします(@XtrmJoshに感謝します)。

git add --all

その後私は

git fetch --all

それから私は原点にリセットします

git reset --hard origin/branchname

それはそれを振り出しに戻します。ブランチを再クローンするのと同じように、すべての gitignored ファイルをローカルで適切な場所に保持しながら。

以下のユーザー コメントごとに更新: をユーザーが現在のブランチにリセットするためのバリエーション。

git reset --hard @{u}
于 2015-08-07T21:15:47.867 に答える
33

上記の解決策をすべて試しましたが、ステージングされていない新しいファイルを削除できませんでした。

git clean -fこれらの新しいファイルを削除するために使用しますが、注意が必要です! force オプションに注意してください。

于 2011-10-14T21:07:27.213 に答える
23

使用するだけです:

git stash -u

終わり。簡単。

スタッシュ スタックを本当に気にする場合は、 git stash drop. しかし、その時点で、(Mariusz Nowak から) を使用する方が良いでしょう:

git checkout -- .
git clean -df

git stash -uそれにもかかわらず、追跡された変更と追跡されていないすべての変更を1 つのコマンドで「破棄」するので、私は最高に気に入っています。それでもgit checkout -- .、追跡された変更のみを破棄し、追跡されてgit clean -dfない変更のみを破棄します...両方のコマンドを入力するのは非常に面倒です:)

于 2016-09-08T06:19:32.203 に答える
22

簡単に言うと

git stash

ローカルのすべての変更が削除されます。と言って後で使うこともできます

git stash apply 

または git stash pop

于 2015-04-24T12:19:34.237 に答える
19

あなたは非常に単純な git コマンドを持っていますgit checkout .

于 2019-08-27T07:58:23.397 に答える
16

これは、次のディレクトリでも機能します。通常の git 権限の範囲外。

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

最近私に起こったこと

于 2013-09-05T09:38:10.853 に答える
15
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
于 2014-05-30T09:26:00.053 に答える
12

私の意見では、

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 は実行を拒否します。

于 2016-07-14T07:03:45.053 に答える
10

git clean -df よりも具体的な新しいファイルを削除する別の方法 (必ずしもすべてではなく一部のファイルを削除できるようになります) は、最初に新しいファイルをインデックスに追加し、次に stash してから削除することです。隠します。

この手法は、何らかの理由で、追跡されていないすべてのファイルを通常のメカニズム (rm など) で簡単に削除できない場合に役立ちます。

于 2012-06-15T08:55:35.303 に答える
8

スタッシュを他の人に譲渡したい場合:

# 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

[編集] コメントしたように、隠し場所に名前を付けることができます。隠し場所を共有したい場合は、これを使用してください ;)

于 2013-07-08T15:07:46.213 に答える
7

サブモジュールの場合で、他の解決策が機能しない場合は、次を試してください。

  • 何が問題なのかを確認するには (おそらく「汚い」ケース)、次を使用します。

    git diff

  • スタッシュを削除するには

    git submodule update

于 2015-10-01T21:32:42.513 に答える
6

ステージングされたすべてのファイルが実際にコミットされた場合、たとえば GUI から約 3 回のマウス クリックでブランチを簡単にリセットできます: BranchResetYes !

したがって、私が実際に不要なローカル変更を元に戻すためによく行うことは、すべての適切なものをコミットしてから、ブランチをリセットすることです。

良いものが単一のコミットでコミットされている場合、最終的に少し異なるコミットをしたい場合は、「最後のコミットを修正する」を使用してステージングまたはステージング解除に戻すことができます。

これは、問題に対して探している技術的な解決策ではないかもしれませんが、非常に実用的な解決策だと思います。ステージングされていない変更を選択的に破棄し、気に入らない変更をリセットして、行った変更を保持することができます。

要約すると、単純にcommitbranch resetamend last commit を実行します。

于 2015-03-20T15:38:49.457 に答える
5

念のため、新しいバージョンの git には restore コマンドがあります。これは、ファイルを変更したときに git status と入力する際の推奨事項でもあります。

(コミットされる内容を更新するには、「git add ...」を使用します)

(「git restore ...」を使用して、作業ディレクトリの変更を破棄します)

したがって、git 'restore' はこれに対する最新のソリューションです。「git status」と入力した後、git からの提案を読むことは常に良い考えです :-)

于 2020-09-18T06:03:21.137 に答える
1

使用するだけです:

git stash -k -u

これにより、ステージングされていない変更追跡されていないファイル (新しいファイル)が隠され、ステージングされたファイルが保持されます。

reset/ checkout/よりも優れてcleanいます。後で ( までに) 戻したい場合があるからですgit stash pop。それらを隠し場所に保管することは、それらを破棄するよりも優れています.

于 2016-12-23T17:33:37.223 に答える