次の追跡されていない作業ツリーファイルはマージによって上書きされますが、私は気にしません


343

私のブランチでは、.gitignoreにいくつかのファイルがありました

別のブランチでは、これらのファイルは違います。

私は別のブランチを私のものにマージしたいのですが、それらのファイルが無視されなくなったかどうかは気にしません。

残念ながら私はこれを手に入れました:

次の追跡されていない作業ツリーファイルは、マージによって上書きされます

これらのファイルを自分で見つけたり、移動したり、削除したりせずに、プルコマンドを変更してこれらのファイルを上書きするにはどうすればよいですか?





1
:これはのみマージからあなたをブロックしているファイルを削除しますよう最善の答えですstackoverflow.com/a/52255219/551045
REDX

回答:


537

問題は、ファイルをローカルで追跡するのではなく、同一のファイルをリモートで追跡するため、システムがバージョン管理されていないローカルファイルを強制的に上書きすることです。

実行してみてください

git add * 
git stash
git pull

これにより、すべてのファイルが追跡され、それらのファイルに対するローカルの変更がすべて削除され、サーバーからファイルが取得されます。


59
git add -A .; git stash私のために働いた。このgit add *亜種は、無視されたパスについて不平を言っていました。
imsky

11
git add。、git stash、git pullを試しました。うまくいきましたが、それでも理由がわかりませんか?
ARK

1
私にとって、追跡されたリモートファイルがあり、追跡されていないローカルリポジトリに同じ名前のファイルがありました。したがって、ローカルファイルを追加して変更を隠してからプルすると、リモートファイルによってローカルファイルが上書きされます。
userFog 2015年

2
興味があれば、これがどのように機能するかを理解するための良いリンクです。 git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//、これは実際にはこのエラーの目的にそれほど深くは入りません。
Nathan Basanese 2015

137

ローカルから追跡されていないファイルをクリアするコマンドを試すことができます

Git 2.11以降のバージョン:

git clean  -d  -f .

古いバージョンのGit:

git clean  -d  -f ""

どこ-dを次のように置き換えることができます:

  • -x 無視されたファイルやGitに認識されていないファイルも削除されます。

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

  • -f 強制的に実行する必要があります。

こちらも参考になるリンクです。


23
-iインタラクティブモードを追加します。不要なディレクトリを削除するだけでなく、プロジェクトのユーザー設定も削除しました:-(
dumbledad

6
コメントをスキャンして、同様の答え-x得ることができます。
dumbledad 2016

10
しかし、これは非常に危険であり、元に戻すことはできません!! あなたはたくさんのファイルを失うかもしれません!注意してください!!
Mohamed Kawsara 2016

16
これにより、Slim Framework上のすべてのベンダーディレクトリが削除されました。このコマンドで非常に慎重になる
RousseauAlexandre

2
回答から「x」を削除する必要があります。とても危険です!
Earl3s 2017

106

私のために働いた唯一のコマンドは:

git fetch --all
git reset --hard origin/{{your branch name}}

5
この回答は、サブモジュールを削除して、元のリポジトリのライブラリとして追加した場合に必要になることに注意してください。私は答えが必要でした、そしてこれはうまくいったすべてでした。
Routhinator 2016

私はサブモジュールを持っていなかったので、他の回答で提案されているようにgit cleanとgit stashを試しましたが、これだけが役に立ちました。
kslstn

さまざまなサブモジュールをクリアした後、これは私にとっても機能した唯一のものでした。特に、ファイルの大文字と小文字の区別に関する問題がありました。例 composerから私のベンダーフォルダー内のXML.phpをXml.phpに。
風上堂

1
それも私のために働いた。何が起こっているのか説明してもらえますか?わかりません。
Dimitris Karamanis

1
これにより2つのローカルコミットが削除されました。これを使用する前に注意してください!
David Cian

27

その代わりにgit merge、追跡されていないファイルを上書きします

以下のコメントでは、「対象ファイル」に「FOI」を使用しています。

  • ドナーブランチに存在し、
  • 受け取りブランチに存在しない、
  • 作業ディレクトリに存在し、追跡されていないため、マージをブロックしています。
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

その代わりにgit pull、追跡されていないファイルを上書きします

pull = fetch + mergeなのでgit fetchgit checkout -f, git checkout, git merge上記のトリックが 続きます。

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

詳細説明

git merge -f存在しませんが、存在git checkout -fします。

git checkout -f+ を使用しますgit checkoutをして対象ファイル(上記を参照)を削除すると、マージは正常に続行できます。

手順1.この手順では、追跡されていないFOIを追跡されたバージョンのドナーブランチに強制的に置き換えます(ドナーブランチをチェックアウトし、残りの作業ディレクトリを更新します)。

git checkout -f donor-branch

ステップ2.現在の(ドナー)ブランチで追跡され、receiving-branch切り替え先のFOIに存在しないため、このステップはFOIを削除します。

git checkout receiving-branch

ステップ3. FOIがなくなったので、ドナーブランチでマージしても追跡されていないファイルは上書きされないため、エラーは発生しません。

git merge donor-branch

3
これは7番目または8番目の回答になるにはクリーンすぎます!
Majed DH

1
ありがとう、@ MajedDH、あなたは私の一日を作りました!<3
Esteis

1
これは私が探していたインスタフィックスでした!ありがとう
AFM-Horizo​​n

@ AFM-Horizo​​nをサポートしてくれて嬉しいです。
Esteis

20

追跡されていないファイルをすべて削除します。

git clean  -d  -fx .

8
プロジェクトでは、おそらく使用したファイルを削除すると、真の解決策であってはならないです
ErdinçÇorbacı

4
yikes、IDEファイルもクリーンアップしました:(
kisna

18

これが1回限りの操作である場合、プルを実行する前に、追跡されていないすべてのファイルを作業ディレクトリから削除できます。現在のGit作業ツリーからローカル(追跡されていない)ファイルを削除する方法をお読みください追跡されていないファイルをすべて削除する方法については、

まだ必要な追跡されていないファイルを誤って削除しないようにしてください;)


15

あなたはそのコマンドを試すことができます

git clean -df

5
追跡されていないディレクトリを削除する目的は何ですか?..それらは価値がある場合があります。
zhekaus

それが何をするのか説明してもらえますか?
Safak Ozkan、

12

アップデート-より良いバージョン

このツール(https://github.com/mklepaczewski/git-clean-before-merge)は次のことを行います。

  • git pull同等のものと同一の追跡されていないファイルを削除し、
  • 変更されたファイルの変更を元に戻し、変更されたバージョンはgit pull同等のものと同じです。
  • それらとは異なる修正/追跡されていないファイルを報告する git pullバージョン
  • ツールには、--pretendファイルを変更しないオプションがあります。

古いバージョン

この回答は他の回答とどのように異なりますか?

ここで紹介する方法は、マージによって上書きされるファイルのみを削除します。他の追跡されていない(おそらく無視されている)ファイルがディレクトリにある場合、このメソッドはそれらを削除しません。

ソリューション

このスニペットは、上書きされるすべての追跡されていないファイルを抽出しgit pullて削除します。

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

そして、ちょうど行います:

git pull

これはgit porcelainコマンドではないので、それが何をするかを常にダブルチェックしてください:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

説明-ライナーが怖いので:

以下はその機能の内訳です。

  1. git pull 2>&1- git pull出力をキャプチャし、すべて標準出力にリダイレクトして、で簡単にキャプチャできるようにしgrepます。
  2. grep -E '^\s -目的は、上書きされる追跡されていないファイルのリストをキャプチャすることです git pullです。ファイル名の前には空白文字がたくさんあるので、ファイル名を取得するために使用します。
  3. cut -f2- -2で取得した各行の先頭から空白を削除します。
  4. xargs -I {} rm -rf "{}"- xargsすべてのファイルを繰り返し処理し、ファイル名を "{}"に保存して、各ファイルを呼び出しrmます。-rf追跡されていないディレクトリを強制的に削除および削除するために使用します。

手順1から3を磁器コマンドに置き換えるのは素晴らしいことですが、同等のものは知りません。


ありがとう、作業ディレクトリに、削除またはコミットしたくない、追跡されていないファイルがよくあります。私の場合、私はこれに置き換える必要がありgit pullましたgit checkout <branch_name>
mihow '27 / 02/27

6

-fフラグの使用を検討する場合は、最初にドライランとして実行することができます。あなたが前もってあなたが次にどんな種類の興味深い状況になるか知っているということだけです;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

受け入れられた回答に加えて、ファイルを指定することで、不要になったファイルを削除することもできます。

git clean -f '/path/to/file/'

git cleanで削除されるファイルを確認する場合は、最初に-nフラグを指定して実行することを忘れないでください。これらのファイルは削除されることに注意してください。私の場合、とにかくそれらについて気にしなかったので、それは私にとってより良い解決策でした。


5

これを行う1つの方法は、ローカルの変更を隠してリモートリポジトリからプルすることです。このようにして、ファイルがstashに移動するときにローカルファイルが失われることはありません。

git add -A
git stash
git pull

このコマンドを使用してローカルの隠しファイルを確認できます- git stash list


3

知らない人のために、gitはファイルとフォルダの大文字と小文字の名前の違いを無視します。大文字と小文字を変えてまったく同じ名前に変更すると、これは悪夢になります。

フォルダの名前を「Petstore」から「petstore」に変更したときにこの問題が発生しました(大文字から小文字へ)。大文字と小文字を区別しないように.git / configファイルを編集し、変更を加え、コミットを破棄し、変更を隠して別のブランチに移動しました。隠しておいた変更をこの他のブランチに適用できませんでした。

私が見つけた修正は、一時的に.git / configファイルを一時的に編集して、ケースを再び一時的に無視することでした。これがgit stash apply成功した。次に、ignoreCaseをに戻しましたfalse。次に、何らかの理由でgitが奇妙に主張したpetstoreフォルダー内の新しいファイルを除いて、すべてを追加しました。変更をコミットして実行しましたgit reset --hard HEADして追跡されていない新しいファイルを削除しました。私のコミットは期待どおりに表示されました。フォルダー内のファイルの名前が変更されました。

これが私の同じ悪夢の回避に役立つことを願っています。


私のために働いていませんでした。フォルダ内のすべてのファイルを削除しました。そして、git pull -fその後git checkout .。なんて悪夢なんだ。
m.rufca

本当に?それはほんの数週間前に私にとってはうまくいきました。gitconfigファイルを編集して、必要に応じて大文字と小文字を無視して開始/停止しましたか?
A.デビッドソン

ありがとうございました。フォルダーパスのケーシングを修正した後、マスターからマージする必要がありました。私はそれをgit ignore case onとマージすることができました。その後、大文字と小文字の区別を再び有効にしました。
Rubenisme

3

クリーン/リセット/ハードチェックアウト/リベースのどちらもうまくいきませんでした。

だから私はgitが不平を言ったファイルを削除しました*

rm /path/to/files/that/git/complained/about

*このファイルを別のフォルダにある新しいリポジトリをチェックアウトすることで削除できるかどうかを確認しました(ファイルはそこにはありませんでした)


1

私の場合、この問題が発生しました。リモートで名前を変更したローカルファイルがありました。

git pullGitを実行しようとしたときに、新しいファイル名は追跡されなかったと教えられました-ローカルにはまだ存在していませんが、リモートにありました。

そのインスタンスがローカルにgit pullなかっgit rmたため、古いファイル名を変更するまではできませんでした(名前を変更するという愚かな考えのため、最初はわかりませんでした)。


0

.gitignoreでファイルを書き込んでいる場合は、ファイルを削除して、もう一度git pullを実行します。それは私を助けました。

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