.gitignoreおよび「次の追跡されていない作業ツリーファイルは、チェックアウトによって上書きされます」


828

そこで、.gitignoreファイルにフォルダーを追加しました。

私がやるとgit statusそれは私に伝えます

# On branch latest
nothing to commit (working directory clean)

しかし、ブランチを変更しようとすると、次のようになります。

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

これは私の.gitignoreファイルは次のようになります。

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

これらのファイルを削除せずにブランチを切り替えることができるように、これをどのように機能させるのですか?

変更すると、それらのファイルに影響がありますか?つまり、後でこのブランチに戻ってきた場合、最新のコミットまですべてが完璧ですか?

これらのファイルを失いたくないので、追跡したくありません。


10
これらのファイルを本当に気にしない場合:git checkout -f <branch>私の場合、ファイルはビルドプロセスで生成されるので、あまり気にしません
Hobbamok

(ブランチ名なしで)「git checkout」を実行すると、ときどき発生します。修正するには、 'git checkout branchname'を実行します

個別の、しかし決定的に関連する質問:なぜこのエラーが発生するのですか?なぜgitはブランチを切り替えることができないのですか?
ahnbizcad 2018

@ahnbizcad新しいファイルで作業していて、別のブランチの誰かが偶然同じ名前のファイルをコミットした場合、ブランチを切り替えたときにgitがバージョンをゴミ箱に捨てると、うんざりします。これが-fフラグが存在する理由です。
マシューシャープ

回答:


264

ファイルを無視したいようですが、すでにコミットされています。.gitignoreは、すでにリポジトリにあるファイルには影響しないため、で削除する必要がありますgit rm --cached。これ--cachedにより、作業コピーに影響が及ばなくなり、次にコミットしたときに削除済みとしてマークされます。ファイルがリポジトリから削除された後、.gitignoreはそれらが再び追加されるのを防ぎます。

しかし、.gitignoreに別の問題があります。ワイルドカードを過度に使用しているため、ワイルドカードの一致が予想よりも少なくなっています。代わりに.gitignoreを変更してこれを試してみましょう。

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/

2
ありがとう...現在のブランチからすべてのファイルを削除してバックアップしました。次に、枝を切り替えて元に戻しました。うまくいきました。また、.gitignoreのヒントをありがとう
marcamillion

@marcamillion:「それはうまくいった」とはどういう意味ですか?切り替えたブランチでファイルが追跡されていた場合、バージョンによってファイルが上書きされている可能性があります。これは異なる可能性があります...
Cascabel

1
追跡する必要のない/ buildフォルダーに問題がありました。そこで、ローカルフォルダーを削除し、.gitignoreファイルをコミットしてから、他のブランチをチェックアウトしました。それでようやくうまくいきました。
マイクS.

16
最初の部分は、この特定のエラーメッセージの逆のためのものだと思います。このエラーは、ユーザーが現在、それらのJPGファイルを追跡していないブランチにいて、ユーザーが追跡しているJPGファイルに移動しようとしていることを示しています。したがって、変更してgit rm --cachedも違いはありません。これらのファイルは現在のブランチに存在しません。このエラーの場合、ユーザーは代わりに@Greg Hewgillの回答に従う必要があると思います-「作業コピーから外して、ブランチを切り替えて、元に戻す」。
studgeek 2013年

5
私がyour files would be overwrittenするfatal: pathspec 'test/node_modules' did not match any filesとき、どうやってwithを解決しようとしgit rm -r --cache test/node_modulesますか?上書きされたメッセージのためにプルできず、gitがそれらを見つけることができないために削除できません(それらはそこにあります)
HMR

1047

警告:追跡されていないファイルを削除するので、提起されている質問に対する適切な回答ではありません。

私もこのメッセージをヒットしました。私の場合、ファイルを保持したくなかったので、これは私にとってはうまくいきました:

git 2.11以降

git clean  -d  -f .

古いgit

git clean  -d  -f ""

gitによって無視されたファイルも削除する場合は、次のコマンドを実行します。

警告されます!!! これはおそらくあなたのプロジェクトを破壊します、あなたが何をしているのか100%知っている場合にのみ使用してください

git 2.11以降

git clean  -d  -fx .

古いgit

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x 無視されたファイルやgitに認識されていないファイルも削除されることを意味します。

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

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


7
おかげで、そのクリーンの後、私はリベースすることができました。
Alexander Beletsky、2012年

139
git cleanを実行するときは注意してください。
ノエル

249
facepalmを回避するには、まずドライランオプションを使用して実行し、それがどうなるかを確認します。git clean -dfxnまたはgit clean -dfx --dry-run
Dennis

74
神聖ながらくた。これにより、xcode上のすべての構成ファイルが削除され、プロジェクトがMacプロジェクトに変わります。このコマンドを実行するときは、十分に注意してください。gitから削除するだけだと思いました。
tyegah123 2014

25
-xオプションは私を傷つける
wener

589

警告:これにより、インデックスが作成されていないローカルファイルが削除されます

強制するだけです: git checkout -f another-branch


78
警告:これにより、インデックスが作成されていないローカルファイルが削除されます。
givanse 2014年

git cleanは機能しませんでしたが、forceはまさに必要なものでした。それはそのブランチにスタックしていて、ブランチを変更するのにそれが必要でした。
Simon The Cat

7
インデックスに登録されていないファイルは必要ありませんでした。あなたのための+1
ryansstack '19年

:(error: pathspec 'mybranch' did not match any file(s) known to git.
Budi Mulyo

2
これが本当の答えです。
metamonkey

147

OS Xを使用している場合は、ファイル名に特定の文字の大文字と小文字の違いがあったためと考えられます。次の構成オプションを設定してみてください。

git config core.ignorecase true

13
Windowsでも機能しましたが、GITが判別できなかったケースの変更が原因でこのような状況が最初に発生したようです
SagiLow

4
これはまさに私が抱えていた問題です。ファイルパスが1文字の大文字小文字で異なっていました-Windowsはこれを同じように扱いますが、GITはそうではありません。
Daniel Sokolowski、2015

1
私の問題は、Windows 10の別のブランチをチェックアウトしたときに発生しました。この作業だけが私に感謝します。ありがとう
Weijie Sun

驚くばかり!これは、タグ間を移動していたときの問題を修正しました
WilliamAñez '

1
git rebase同様にしようとした場合にも動作します。ありがとう。
user3890355 2018

42

Gitはファイル(名前付きpublic/system/images/9/...など)を作成することを要求していますが、Gitによって追跡されていない既存のファイルがそのディレクトリに既に存在します。おそらく他の誰かがそれらのファイルをGitリポジトリに追加しましたが、そのブランチに切り替えたのはこれが初めてですか?

これらのファイルがdevelopブランチにあるが、現在のブランチにはない理由はおそらくあります。なぜそうなのかを協力者に尋ねなければならないかもしれません。

これらのファイルを削除せずにブランチを切り替えることができるように、これをどのように機能させるのですか?

どういうわけかファイルを消さなければ、それを行うことはできません。とりあえず名前publicを変更しmy_publicたり、何かを変更したりできます。

その後このブランチに戻ってきた場合、最新のコミットまですべてが完璧ですか?

変更をコミットしても、Gitはそれらを失うことはありません。変更をコミットしない場合、Gitは実行した作業を上書きしないように真剣に取り組みます。これが、Gitが最初のインスタンス(ブランチを切り替えようとしたとき)で警告していることです。


説明ありがとう。ファイルをバックアップし、ブランチを切り替え、それらをマージしてから、パブリックフォルダー内のファイルを置き換えました。うまくいきました。
marcamillion 2011

1
私が@Arrowmasterの答えにコメントしたように。これがエラーメッセージの正しい答えです。彼の本当の問題は彼のgitignoreのようであるので、これはこの特に質問者にとって正しい答えではないかもしれません。
studgeek 2013年

38

これでうまくいきました。

 1. git fetch --all
 2. git reset --hard origin/{branch_name}

5
ソリューションの説明を追加してください。stackoverflow.com/help/how-to-answer
user7294900

これが私の見解です。リモートブランチのローカルコピーには、実際には追跡されていないファイルがすべて含まれています。それをチェックアウトして、元々不満だった追跡されていないファイルを復元します。他のブランチに切り替えることができるようになりました
ahnbizcad 2018

2
何らかの理由で、これが私にとって唯一の有効な解決策です。相棒、ありがとな。
Kiwad

私の問題を解決しました。ありがとう
Devashis Kant

どうもありがとう、とてもシンプルです!git reset --soft origin / develop。これらのマージ競合編集を嫌う方法。このコマンドはとても素晴らしくてシンプルです。
nine9five

22

このデリケートなタスクのためのコマンドがあります(追跡されていないファイルを完全に削除します)

git clean -i

次にgit pull行います。


13

Scott Schaferの回答よりも遠くに届かないものを必要とする人のために、

git clean -f

おそらく機能します。走ることを強くお勧めします

git clean --dry-run

最初。このコマンドは、を実行するとGitが削除するファイルのリストを出力し、不要git clean -fなものを誤って削除する手間を省くことができます。

の詳細については、このStack Oveflowの回答またはドキュメントを参照してくださいgit clean


12

残念ながら、どちらgit rm --cachedgit clean -d -fx ""私のためにそれをやりました。

私の解決策は、ブランチをリモートにプッシュし、新しいリポジトリをクローンして、新しいリポジトリでマージを行うことでした。リポジトリにアクセスする他の人々も同じことをしなければなりませんでした。

物語の教訓:.gitignore最初からファイルを使用します。


10

この質問をすばやく解決したい場合は、次のコマンドを使用できます。

git checkout -f dev

私の問題が.gitignoreafaikに関連していなかったとき、これは私を助けました。
Nakilon、2016

エラー:pathspec 'dev'はgitが認識しているファイルと一致しませんでした。
ブラック、

@Black 'dev'はブランチ名です。代わりにブランチを配置してください
Vinit Solanki

8

以前のコミットに基づいてブランチにチェックアウトするときにも同じ問題が発生しました。追跡されていないファイルがあるため、Gitはチェックアウトを拒否しました。

私は解決策を見つけました。それがあなたにも役立つことを願っています。

影響を受けるディレクトリをそれらに追加し.gitignoreて発行$ git rm -r --cachedするだけでは明らかに不十分です。

いくつかのものをテストして現在のバージョンに戻るために、以前のコミットKに基づいてブランチを作成するとします。次の手順でそれを行います。

  1. 追跡されていないファイルを設定します:を編集して、gitに無視させたいファイルとディレクトリに.gitignore適用$ git rm -r --cachedします。ファイル.gitignore自体も追加し、.gitignore発行することを忘れないでください$ git rm -r --cached .gitignore。これにより、以前のコミットでもgitの無視動作が同じままになります。

  2. 行った変更をコミットします。

    $ git add -A
    $ git commit

  3. 現在のログを保存します。保存しないと、現在のバージョンに戻って問題が発生する可能性があります

    $ git log > ../git.log

  4. コミットKへのハードリセット

    $ git reset --hard version_k

  5. コミットKに基づいてブランチを作成する

    $ git branch commit_k_branch

  6. そのブランチにチェックアウト

    $ git checkout commit_k_branch

  7. あなたの仕事をしてそれをコミットしてください

  8. もう一度マスターにチェックアウトします

    $ git checkout master

  9. もう一度現在のバージョンにリセット

    $ git reset current_version または $ git reset ORIG_HEAD

  10. これで、HEADにハードリセットできます

    git reset --hard HEAD

注意!最後から2番目のステップ(例$ git reset --hard ORIG_HEAD :)をスキップしないでください。スキップすると、上記のgitで報告された追跡されていないファイルが失われます。

また、gitが不平を言っているファイルが削除されていないことを確認しました。それらをテキストファイルにコピーしてコマンドを発行しました$ for i in $(cat ../test.txt); do ls -ahl $i; done

上記のブランチにもう一度チェックアウトする場合は、発行$ git statusして、不要な変更が表示されないようにすることを忘れないでください。


8

これは、Windows 8システムでコマンドプロンプトからGitを使用して起こりました。私のチームの他のメンバーはTFSを使用しており、Microsoftのgit-tfを使用してTFSとローカルのGitリポジトリの間でプッシュ/プルを行います。

問題は、大文字と小文字を変更するためだけに名前が変更されたいくつかのファイルが原因で発生しました。起こったように見えるのはこれです:

  • ファイルは、名前の大文字と小文字が混在してチェックインされました。
  • 後のコミットで、ファイル名はすべて小文字に変更されました。
  • git-tfは最初、大文字と小文字が混在するファイルを取得しました。
  • ファイル名が小文字に変更された場合、Windows 8ではこれらのファイル名は同等であるため、git-tfはファイルを取得しませんでした。
  • Gitは大文字と小文字を区別するため、大文字と小文字が混在するファイルがソース管理にないことに不満がありました。しかしgit status、Windowsコマンドプロンプトではこれらのファイル名は同等であるため、を使用しても何も変更されませんでした。

私にとって最も簡単な解決策は:

  • git checkout以前のバージョンのプロジェクト。これらのファイルが追加されるずっと前に
  • 次にgit checkoutプロジェクトの最新バージョンと正しいファイルケーシングを使用します。

+1現在のブランチとブランチでgit logを使用してリベースして、ケースが変更されたコミットがいつ発生したかを確認できました。それから私はそれをハッキングしました...
セージ

4

これらの2つの関数(git rm --cached、git checkout -f another-branch)は私には機能しませんでした。

代わりに、Gitが指示したとおりに(Eclipseで)ファイルを物理的に削除しました。ブランチを切り替える前に、それらを移動または削除してください。

それから私はそれを追加/コミットしました。

そして私は引っ張ってそれはうまくいった!


4

私の場合、問題はサブモジュールにありました。masterプロジェクトに新しいサブモジュールを追加する別のブランチとマージされました。私がチェックアウトしようとしたブランチにはそれがありませんでした、それがgitが追跡されていないファイルについて文句を言っていて、他の提案された解決策のどれも私にとってうまくいかなかった理由です。チェックアウトを新しいブランチに強制し、マスターをプルしました。

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init

3

私の場合、git rm --cachedうまくいきませんでした。しかし、私はそれを手に入れましたgit rebase


3

私も同様の問題に直面していて、上記のすべての解決策を試しましたが、うまくいきませんでした

私は時に問題が発生した名前を変更し、私onMusicUpdateListener.javaにはOnMusicUpdateListener.javadevelopブランチ。

master持っていたonMusicUpdateListener.java し、develop同じファイルを持っていましたOnMusicUpdateListener.java

マスターに切り替えるたびにエラーが発生しました

The following untracked working tree files would be overwritten by checkout

そしてそれaborted

これを解決するために、私は強制的にchecked out master分岐し、その後、私の名前を変更onMusicUpdateListener.javaするOnMusicUpdateListener.javacommittedそれ、その後、mergedそれをdevelopブランチ。

それから私はそれdevelopによって私のブランチを更新しました、そして今、すべてが正常に戻り、問題が解決されました。mergingmaster


以前に同様の問題に遭遇したことがあります。私の理解では、大文字と小文字の区別の問題はWindowsでのみ問題のようです。あなたはwindowsで開発していると思いますか?
Ji_in_coding

2

これは許可の問題かもしれません、

所有権を変更し、

sudo chown -v -R usr-name:group-name folder-name

私もウォンと同じ問題を抱えていました。すでに追跡されているフォルダに.gitignoreを追加しました。ファイルを削除したところ、gitチェックアウトを実行できました。
cbloss793

2

同じ名前で大文字と小文字が異なる2つのファイルが問題である可能性があります。

これらのファイルの1つを削除するか、名前を変更できます。例:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

2

削除する代わりにファイルを移動する

ファイルの削除を回避する1つの方法は、代わりにファイルを移動することです。例えば:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done

1

ローカルでファイルの名前を変更してからを実行するとpull、そのエラーメッセージが表示されます。


その場合、このエラーを回避するにはどうすればよいですか?このメッセージは、ファイル名の大文字と小文字を変更した後でブランチを切り替えるときにも表示されます(MyFile => myfile)。
BernhardDöbler2017年

1

それは簡単に解決できます、gitは両方のブランチに同じファイルがあると言っているので、masterブランチから特定のファイルを削除する必要があり、それからマージすることができます:

git merge "your branch"

私はそれがあなたのために働くことを望みます、私はちょうど私のエラーを解決しました。私のエラーは:

エラー:次の追跡されていない作業ツリーファイルは、マージによって上書きされます:.vs / slnx.sqliteマージする前に、移動または削除してください。中止しています

今それは働いています!私の場合、.vs / slnx.sqliteはVisual Studioによって生成されたため、削除する前に閉じる必要がありました。


0

私の場合、人気のあるオープンソースCMSを使用していて、問題を引き起こしていたディレクトリがCMSが書き込むアップロードディレクトリだったため、このエラーが表示されました。

だから、それはあなたが持っていないが、バージョン管理から取得できないファイルがあるということでした。

私はライブサイトからローカルにすべてのファイルを取得しています。問題が修正されることを期待して、これをリポジトリにチェックインします。


0

この問題を解決するには、appname / gen /から.gitignoreファイルを削除します。


0

私はファイルシステムに行ってファイルを直接削除し、それからgit checkoutを続行するとうまくいきました。

私は問題を何度か発生させましたが、削除、プッシュ、再追加、プッシュなどを行っている開発者に関連している可能性があります。


0

ほとんどの回答では、ファイルを削除または削除することを検討しています。これは簡単な方法です。ただし、ローカルファイルを削除したくない場合もあります。しかし、戦略とマージすると、gitにもこれに対する解決策があります。

git merge --strategy=ours master 

0

ファイルを削除するか、名前を変更してください。

例えば

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

ajax / product.phpajax / produtPrice.phpの名前を変更/削除する必要がありました

心配しないでください、git pullはそれらを元に戻します。一部の変更が失われる可能性があるため、削除する代わりに名前を変更することをお勧めします。

これで問題が解決しない場合は、ブランチ全体を削除してからもう一度作成してから、 git pull origin remotebranch


0

変更されたファイルを保存し、後で変更されたコンテンツを使用するため。ブランチをチェックアウトしようとしたとき、およびリベースしようとしたときに、このエラーが見つかりました。Git stashを試す

git stash


0

「/」または特別な記号を含むフォルダ名があるかどうかを確認し、そのフォルダの名前を変更します。次に、リポジトリを別の場所に複製します。


0

簡単な解決策は次のとおりですGitBash。単にの正しい作業ディレクトリにいることを確認してください。そのメッセージは、ユーザーがフォルダー階層の高すぎるディレクトリをマージしようとすると、ほぼ毎回発生します。

例:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

シナリオ:ユーザーgit-folderがEclipseで新しいJavaプロジェクトを作成してリポジトリを複製し、複製したリポジトリをインポートした。Eclipseは、myProjectSourceFolderをローカルプロジェクトのソースフォルダーとして設定しました。したがって、ユーザーはそれをgit bashに入力し、そこからプロジェクトをプッシュ、プル、コミットしました。したがって、gitは同期しますmyProjectSourceFolderが、myBashSourceFolderの履歴はありません。したがって、myBashSourceFolderからのpush / pull / mergeは、ユーザーが以前に作業したフォルダの代わりに、そこから同期しようとすると、指定された出力を生成します。

解決策:正しいフォルダを入力して、もう一度プルしてみてください。私が遭遇したほとんどすべての時間で、この解決策はうまくいきました:)

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