追加したファイルを強制的にgit stashで上書きする


223

gitで追跡されなかったファイルがいくつかあります。変更を加えてコミットしたかったのですが、変更前のファイルを最初にチェックインするのを忘れていたことがわかりました。そのため、ファイルを隠しておき、未変更のバージョンを追加しました。

次に、スタッシュをリポジトリに適用すると、ファイルがすでに追加されているために競合が発生します。

スタッシュを適用し、スタッシュ内のバージョンをリポジトリ内の元のバージョンよりも優先して使用するにはどうすればよいですか?

ありがとう


7
誰かがより良いものを思いつくまでの醜い解決策:git rm行う前にを使って新しいファイルを削除してgit stash applyください
トム

それは歴史を失うのではないでしょうか?変更されていないバージョンを追加する理由は、履歴を保持するためでした。
ステファン

1
いいえ、履歴は失われません。ファイルを削除し、小さな変更を加えて追加し、コミットすると、ファイルは小さな変更gitとして扱われます。
トム2013年

回答:


365

git checkout代わりに使用git stash apply

$ git checkout stash -- .
$ git commit

これにより、現在のディレクトリにあるすべてのファイルが隠されたバージョンに復元されます。


保持する必要のある作業ディレクトリ内の他のファイルへの変更がある場合は、次の方法を使用します。

$ git merge --squash --strategy-option=theirs stash

インデックスに変更がある場合、またはマージがローカルの変更を含むファイルに影響を与える場合、gitはマージを拒否します。個々のファイルは、以下を使用してstashからチェックアウトできます

$ git checkout stash -- <paths...>

またはインタラクティブに

$ git checkout -p stash

これらのどれも私のユースケースでは機能しませんでした。調査結果と私の解決策はここにあるstackoverflow.com/a/26685296/496046 -これは、あまりにも@AlexanderBirdを自分の状況を解決する必要があります
tremby

2
git checkout stash -- .このコマンドを実行したとき、文字通り何もしませんでした。
Rotsiser Mho

3
@RotsiserMho Gitは確認メッセージを提供することについてはあまり良くありません。本当に何もしなかったの?私にとってはうまくいきました。
シンジャイ

5
git checkout stash -- .変更を含む最上位の親フォルダーで実行する必要がありました。それ以外の場合は、コマンドを実行したフォルダーへの変更のみを適用しました。
レオ

1
@Leo:そうです、それ.は現在のディレクトリを指定しているためです(ディレクトリを変更する代わりに、別のパスに置き換えることができます)。わかりやすくするために回答を更新しました。
トム

13

git stash show -p | git apply

そして、git stash dropあなたが隠しておいたアイテムを落としたいなら。


2
注:これが正しく機能するには、リポジトリのルートにいる必要があります。そうしないと、これが表示されます。
ルスラン

@PengheGengご覧のとおり、NetEmmanuelの1年ほど前に回答しました
Hasan TBT

@Ruslan私は取得していますその中に私のレポ🤔のルートに
レオ

6

git stash popこのコマンドを強制的に実行するには

git stash show -p | git apply && git stash drop

1

TL; DR:

git checkout HEAD path/to/file
git stash apply

ロングバージョン:

上書きするコミットされていない変更が原因で、このエラーが発生します。これらの変更をで元に戻しますgit checkout HEAD。特定のファイルへの変更をで取り消すことができますgit checkout HEAD path/to/file。競合の原因を取り除いた後は、通常通りお申し込みいただけます。

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