私のブランチでは、.gitignoreにいくつかのファイルがありました
別のブランチでは、これらのファイルは違います。
私は別のブランチを私のものにマージしたいのですが、それらのファイルが無視されなくなったかどうかは気にしません。
残念ながら私はこれを手に入れました:
次の追跡されていない作業ツリーファイルは、マージによって上書きされます
これらのファイルを自分で見つけたり、移動したり、削除したりせずに、プルコマンドを変更してこれらのファイルを上書きするにはどうすればよいですか?
私のブランチでは、.gitignoreにいくつかのファイルがありました
別のブランチでは、これらのファイルは違います。
私は別のブランチを私のものにマージしたいのですが、それらのファイルが無視されなくなったかどうかは気にしません。
残念ながら私はこれを手に入れました:
次の追跡されていない作業ツリーファイルは、マージによって上書きされます
これらのファイルを自分で見つけたり、移動したり、削除したりせずに、プルコマンドを変更してこれらのファイルを上書きするにはどうすればよいですか?
回答:
問題は、ファイルをローカルで追跡するのではなく、同一のファイルをリモートで追跡するため、システムがバージョン管理されていないローカルファイルを強制的に上書きすることです。
実行してみてください
git add *
git stash
git pull
これにより、すべてのファイルが追跡され、それらのファイルに対するローカルの変更がすべて削除され、サーバーからファイルが取得されます。
git add -A .; git stash
私のために働いた。このgit add *
亜種は、無視されたパスについて不平を言っていました。
ローカルから追跡されていないファイルをクリアするコマンドを試すことができます
Git 2.11以降のバージョン:
git clean -d -f .
古いバージョンのGit:
git clean -d -f ""
どこ-d
を次のように置き換えることができます:
-x
無視されたファイルやGitに認識されていないファイルも削除されます。
-d
追跡されていないファイルに加えて追跡されていないディレクトリを削除します。
-f
強制的に実行する必要があります。
こちらも参考になるリンクです。
-i
インタラクティブモードを追加します。不要なディレクトリを削除するだけでなく、プロジェクトのユーザー設定も削除しました:-(
-x
得ることができます。
私のために働いた唯一のコマンドは:
git fetch --all
git reset --hard origin/{{your branch name}}
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 fetch
、git 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
追跡されていないファイルをすべて削除します。
git clean -d -fx .
これが1回限りの操作である場合、プルを実行する前に、追跡されていないすべてのファイルを作業ディレクトリから削除できます。現在のGit作業ツリーからローカル(追跡されていない)ファイルを削除する方法をお読みください。追跡されていないファイルをすべて削除する方法については、
まだ必要な追跡されていないファイルを誤って削除しないようにしてください;)
あなたはそのコマンドを試すことができます
git clean -df
アップデート-より良いバージョン
このツール(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 "{}"
説明-ライナーが怖いので:
以下はその機能の内訳です。
git pull 2>&1
- git pull
出力をキャプチャし、すべて標準出力にリダイレクトして、で簡単にキャプチャできるようにしgrep
ます。grep -E '^\s
-目的は、上書きされる追跡されていないファイルのリストをキャプチャすることです git pull
です。ファイル名の前には空白文字がたくさんあるので、ファイル名を取得するために使用します。cut -f2-
-2で取得した各行の先頭から空白を削除します。xargs -I {} rm -rf "{}"
- xargs
すべてのファイルを繰り返し処理し、ファイル名を "{}"に保存して、各ファイルを呼び出しrm
ます。-rf
追跡されていないディレクトリを強制的に削除および削除するために使用します。手順1から3を磁器コマンドに置き換えるのは素晴らしいことですが、同等のものは知りません。
git pull
ましたgit checkout <branch_name>
これを行う1つの方法は、ローカルの変更を隠してリモートリポジトリからプルすることです。このようにして、ファイルがstashに移動するときにローカルファイルが失われることはありません。
git add -A
git stash
git pull
このコマンドを使用してローカルの隠しファイルを確認できます- git stash list
知らない人のために、gitはファイルとフォルダの大文字と小文字の名前の違いを無視します。大文字と小文字を変えてまったく同じ名前に変更すると、これは悪夢になります。
フォルダの名前を「Petstore」から「petstore」に変更したときにこの問題が発生しました(大文字から小文字へ)。大文字と小文字を区別しないように.git / configファイルを編集し、変更を加え、コミットを破棄し、変更を隠して別のブランチに移動しました。隠しておいた変更をこの他のブランチに適用できませんでした。
私が見つけた修正は、一時的に.git / configファイルを一時的に編集して、ケースを再び一時的に無視することでした。これがgit stash apply
成功した。次に、ignoreCaseをに戻しましたfalse
。次に、何らかの理由でgitが奇妙に主張したpetstoreフォルダー内の新しいファイルを除いて、すべてを追加しました。変更をコミットして実行しましたgit reset --hard HEAD
して追跡されていない新しいファイルを削除しました。私のコミットは期待どおりに表示されました。フォルダー内のファイルの名前が変更されました。
これが私の同じ悪夢の回避に役立つことを願っています。
git pull -f
その後git checkout .
。なんて悪夢なんだ。
クリーン/リセット/ハードチェックアウト/リベースのどちらもうまくいきませんでした。
だから私はgitが不平を言ったファイルを削除しました*
rm /path/to/files/that/git/complained/about
*このファイルを別のフォルダにある新しいリポジトリをチェックアウトすることで削除できるかどうかを確認しました(ファイルはそこにはありませんでした)