Git でステージングされていない変更を破棄するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/52704

  •  09-06-2019
  •  | 
  •  

質問

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

役に立ちましたか?

解決

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

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

含める必要はありません --include-untracked 徹底的にやりたくないなら。

その後、その隠し場所を次のコマンドで削除できます。 git stash drop 必要に応じてコマンドを実行します。

他のヒント

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

git checkout -- .

特定のファイルの場合は次を使用します。

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

-- ここで削除します 引数の曖昧さ.

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

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 マニュアルを見るには

私のお気に入りは

git checkout -p

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

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

git add -p

私が使用する正確なオプションの組み合わせを示唆する答えはないので、それは次のとおりです。

git clean -dfx
git checkout .

これは中古のオンライン ヘルプ テキストです。 git clean オプション:

-d

追跡されていないファイルに加えて、追跡されていないディレクトリも削除します。追跡されていないディレクトリが別の Git リポジトリによって管理されている場合、デフォルトでは削除されません。使用 -f 本当にそのようなディレクトリを削除したい場合は、オプションを 2 回実行してください。

-f

Git 構成変数の場合 clean.requireForce に設定されていません false, Git clean は、指定されない限りファイルまたはディレクトリの削除を拒否します。 -f, -n, 、 または -i. 。Git は、ディレクトリ内のディレクトリの削除を拒否します。 .git サブディレクトリまたはファイル(2 番目の場合を除く) -f が与えられる。

-x

以下の無視ルールを使用しないでください。 .gitignore (ディレクトリごと) および $GIT_DIR/info/exclude, 、ただし、で指定された無視ルールは引き続き使用します。 -e オプション。これにより、ビルド製品を含むすべての追跡されていないファイルを削除できます。これは使用できます(おそらく併用可能) git reset) クリーンなビルドをテストするための元の作業ディレクトリを作成します。

また、 git checkout . リポジトリのルートで行う必要があります。

この記事は、どのコマンドをいつ使用するかを説明するのに非常に役立ちます。 http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

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

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

    git checkout -- foo.txt

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

    git reset -- foo.txt

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

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

これを行う最も簡単な方法は、次のコマンドを使用することです。

このコマンドは、作業ディレクトリ内の変更を破棄するために使用されます。

git checkout -- .

https://git-scm.com/docs/git-checkout

git コマンドでは、追跡されていないファイルの隠し場所は以下を使用して実現されます。

git stash -u

http://git-scm.com/docs/git-stash

ただ望むなら 既存のファイルへの変更を削除するには, 、 使用 checkout (ここに文書化されています).

git checkout -- .
  • ブランチが指定されていないため、現在のブランチをチェックアウトします。
  • 二重ハイフン (--) は、その後に続くものを 2 番目の引数 (パス) として取得し、ブランチの指定をスキップしたことを Git に伝えます。
  • 期間 (.) はすべてのパスを示します。

あなたが望むなら 追加されたファイルを削除するには 最後のコミット以降、使用します clean (ここに文書化されています):

git clean -i 
  • -i オプションはインタラクティブを開始します clean, 、誤削除を防ぐため。
  • より迅速に実行するために、他にもいくつかのオプションが利用可能です。ドキュメントを参照してください。

ご希望の場合 後でアクセスできるように変更を保持スペースに移動します, 、 使用 stash (ここに文書化されています):

git stash
  • すべての変更は、後でアクセスできるように、Git のスタッシュに移動されます。
  • より微妙な隠し方をするために、いくつかのオプションが利用可能です。ドキュメントを参照してください。

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

git diff | git apply --reverse

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

例えば git checkout -- .

git checkout -f


man git-checkout:

-f, --force

ブランチを切り替える場合は、インデックスや作業ツリーが HEAD と異なっていても続行します。これはローカルの変更を破棄するために使用されます。

インデックスからパスをチェックアウトするときは、マージされていないエントリを必ずチェックしてください。代わりに、マージされていないエントリは無視されます。

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

git add .
git stash

すべてが正常であることを確認したら、隠し場所を捨てます。

git stash drop

Bilal Maqsood からの回答 git clean これも私にとってはうまくいきましたが、stash を使用するとより詳細に制御できます。誤って sth を実行した場合でも、変更を取り戻すことができます。

アップデート

さらに 1 つ変更があると思います (なぜこれが以前に機能したのかわかりません)。

git add . -A の代わりに git add .

なしで -A 削除されたファイルはステージングされません

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

したがって、gitリセット時にそれらがそこに残らないようにするためにこれを行います(後で - オリジン/ブランチ名のgitignoreを除外します)。

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

git add --all

その後私は

git fetch --all

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

git reset --hard origin/branchname

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

以下のユーザーのコメントごとに更新されます。ユーザーが現在いるブランチにリセットするバリエーション。

git reset --hard @{u}

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

使用 git clean -f それらの新しいファイルを削除するには - ただし注意してください! 強制オプションに注意してください。

単純に言う

git stash

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

git stash apply 

またはGit Stash Pop

使用するだけです:

git stash -u

終わり。簡単。

もし、あんたが 本当に 隠しスタックを気にするなら、次のようにすることができます git stash drop. 。ただし、その時点では、(Mariusz Nowak より) を使用する方が良いでしょう。

git checkout -- .
git clean -df

それでも、私は好きです git stash -u 追跡された変更と追跡されていない変更をすべて「破棄」するだけで最高です。 1つのコマンド. 。まだ git checkout -- . 追跡された変更のみを破棄します git clean -df 追跡されていない変更のみを破棄します...両方のコマンドを入力すると、 遠い 働き過ぎ :)

これは次のようなディレクトリでも機能します。通常の 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 reset --hard <commit hash>

これにより、そのコミット後に行われたすべての変更が破棄されます。

git clean -df よりも具体的に新しいファイルを削除するもう 1 つの方法 (すべてではなく一部のファイルを削除できます)。まず、新しいファイルをインデックスに追加し、次にスタッシュし、次にファイルを削除します。隠し場所。

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

私の意見では、

git clean -df

トリックを実行する必要があります。とおり git clean に関する Git ドキュメント

git-clean - 追跡されていないファイルを作業ツリーから削除します

説明

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

通常、gitに不明なファイルのみが削除されますが、-xオプションが指定されている場合、無視されたファイルも削除されます。これは、たとえば、すべてのビルド製品を削除するのに役立ちます。

オプションがあれば...引数が与えられますが、それらのパスのみが影響を受けます。

オプション

-d 追跡されていないファイルに加えて、追跡されていないディレクトリも削除します。トラックされていないディレクトリが別のGitリポジトリによって管理されている場合、デフォルトでは削除されません。このようなディレクトリを削除する場合は、-fオプションを2回使用します。

-f -force git configuration variable clean.requireforceがfalseに設定されていない場合、git cleanは-f、-nまたは-iが与えられない限り実行を拒否します。

以下は、定期的に同期するリポジトリのフォークを使用している場合の唯一の解決策です (例:プルリクエスト) を別のリポジトリで実行します。短い答え:フォークを削除して再フォークしますが、 github の警告を読んでください.

私も同様の問題を抱えていましたが、おそらく同じではありませんでした。残念ながら私の解決策は理想的ではありませんでしたが、最終的には効果的でした。

多くの場合、次のような git ステータス メッセージが表示されます (少なくとも 2/4 のファイルが含まれます)。

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

鋭い観察者であれば、これらのファイルには大文字と小文字が 1 文字であるドッペルゲンガーがあることに気づくでしょう。どういうわけか、そもそも何が私をこの道に導いたのかはわかりませんが(私は上流のリポジトリからこれらのファイルを自分で操作していなかったので)、これらのファイルを切り替えました。このページ (および他のページ) にリストされている多くの解決策を試しても役に立ちませんでした。

フォークしたリポジトリとすべてのローカル リポジトリを削除し、再フォークすることで問題を解決できました。これだけでは十分ではありませんでした。アップストリームは問題のファイルの名前を新しいファイル名に変更する必要がありました。 コミットされていない作業、Wiki、上流のリポジトリから分岐する問題がない限り、問題はないはずです。控えめに言っても、上流側はあなたにあまり満足していないかもしれません。私の問題に関しては、私は git にそれほど熟練していないので、間違いなくユーザー エラーですが、修正するのが決して簡単ではないという事実は、git にも問題があることを示しています。

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

# 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

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

その方法を説明的に説明する独自のエイリアスを作成することもできます。

次のエイリアスを使用して変更を破棄します。


作業ツリー内のファイル(のリスト)の変更を破棄します

discard = checkout --

次に、次のように使用して、すべての変更を破棄できます。

discard .

または単なるファイル:

discard filename

それ以外の場合、すべての変更と追跡されていないファイルを破棄したい場合は、チェックアウトとクリーンを組み合わせて使用​​します。

作業ツリー内の変更と追跡されていないファイルをクリーンアップして破棄します

cleanout = !git clean -df && git checkout -- .

したがって、使用方法は次のように簡単です。

cleanout

多くのエイリアスが含まれる次の Github リポジトリで利用できるようになりました。

すべてのステージングされたファイルが実際にコミットされた場合、ブランチは単純にリセットできます。GUI からマウスを 3 回ほどクリックするだけで、次のようになります。 支店, リセット, はい!

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

適切な内容が 1 回のコミットでコミットされた場合、最終的に少し異なる方法でコミットしたい場合は、「最後のコミットを修正」を使用してステージングまたはステージング解除の状態に戻すことができます。

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

要約すると、私は単にそうします 専念, ブランチリセット, 、 そして 最後のコミットを修正する.

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

  • 問題が何であるかを確認するには (おそらく「ダーティ」ケース)、次を使用します。

    git diff

  • 隠し場所を削除するには

    git submodule update

ファイルが常にステージングされていないという奇妙な状況が発生しましたが、これは解決に役立ちます。

git rm .gitattributes
git add -A
gitリセット --ハード

ファイルの変更を排除することがほぼ不可能な場合、それらを無視することを検討しましたか?この記述が正しく、開発中にこれらのファイルに触らない場合は、次のコマンドが役立つ可能性があります。

git update-index --assume-unchanged file_to_ignore

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top