私のブランチで、私はいくつかのファイルを.gitignoreに持っていました
別のブランチではそれらのファイルは違います。
私は別のブランチを私のものにマージしたいのですが、それらのファイルが無視されなくなってもしなくても構いません。
残念ながら私はこれを得ます:
次の追跡されていない作業ツリーファイルは、マージによって上書きされます。
自分でそれらのファイルを見つけたり、移動したり、削除したりせずに、それらのファイルを上書きするようにpullコマンドをどのように変更すればよいでしょうか。
問題は、あなたがローカルでファイルを追跡しているのではなく、同一のファイルがリモートで追跡されているので、あなたのシステムがバージョン管理されていないローカルファイルを上書きすることを強いられることです。
実行してみてください
git add *
git stash
git pull
これにより、すべてのファイルが追跡され、それらのファイルに対するローカルの変更がすべて削除され、サーバーからファイルが取得されます。
あなたはローカルから追跡されていないファイルを消去するコマンドを試すことができます
git clean -d -f .
git clean -d -f ""
-dは次のように置き換えます。
-xは無視されたファイルもgitに知られていないファイルと同様に削除されることを意味します。
-dは、追跡されていないファイルに加えて、追跡されていないディレクトリを削除することを意味します。
強制的に実行するには-fが必要です。
ここに link がありますが、これも役に立ちます。
私のために働いた唯一のコマンドは:
git fetch --all
git reset --hard Origin/{{your branch name}}
これが1回限りの操作である場合は、プルを実行する前に、作業ディレクトリから未追跡のファイルをすべて削除するだけで済みます。 Read 現在のGit作業ツリーからローカル(追跡されていない)ファイルを削除するにはどうすればいいですか? すべての追跡されていないファイルを削除する方法については。
あなたがまだ必要としている未追跡ファイルを誤って削除しないように注意してください。
あなたはそのコマンドを試すことができます
git clean -df
未追跡のファイルをすべて削除します。
git clean -d -fx .
-f
フラグの使用を検討しているのであれば、最初にドライランとして実行することをお勧めします。あなたが前もってあなたが次にどんな種類の面白い状況をあなたが次に結局するであろうか知っているということ;-P
-n
--dry-run
Don’t actually remove anything, just show what would be done.
承認された回答に加えて、ファイルを指定することで不要になった場合はもちろんファイルを削除できます。
git clean -f '/path/to/file/'
どのファイルをgit cleanで削除するのかを見たい場合は、最初に-nフラグを付けて実行してください。これらのファイルは削除されることに注意してください。私の場合、私はとにかくそれらを気にしませんでした、それでそれは私にとってより良い解決策でした。
この答えは他の答えとどう違うのですか?
ここで紹介する方法では、マージによって上書きされる可能性のあるファイルだけを削除します。ディレクトリに他の追跡されていない(おそらく無視されている)ファイルがある場合、この方法ではそれらは削除されません。
ソリューション
このスニペットは、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
を使用して簡単にキャプチャできます。grep -E '^\s
- その目的は、git pull
によって上書きされる可能性のある未追跡ファイルのリストを取得することです。ファイル名はそれらの前にたくさんの空白文字を持っているので、それらを取得するためにそれを利用します。cut -f2-
- 2でキャプチャした各行の先頭から空白を削除します。xargs -I {} rm -rf "{}"
- すべてのファイルを反復処理し、それらの名前を "{}"に保存し、それぞれに対してxargs
を呼び出すためのrm
。追跡されていないディレクトリを強制的に削除するには-rf
を使います。手順1〜3をporcelainコマンドで置き換えることは素晴らしいことですが、同等のものはわかりません。
git merge -f
は存在しませんが、git checkout -f
は存在します。以下の例では、FOIは '興味のあるファイル'を意味します。ドナーブランチに存在し、受信ブランチには存在せず、作業ディレクトリに存在し追跡されていないためマージをブロックしています。これらは、あなたのマージが正常に進行するように、興味のあるこれらのファイルを削除するためのステップです。
# FOI is the 'files of interest', the untracked files blocking the merge.
# 1. This forcibly replaces untracked FOI with tracked versions of
# the donor branch (as well as updating the rest of the working dir).
git checkout -f donor-branch
# 2. This removes the FOI because they they are tracked in our current
# (donor) branch, and absent in the `receiving-branch` we switch to.
git checkout receiving-branch
# 3. Now that the FOI are absent, merging in the donor branch will not
# overwrite any untracked files, so we get no errors.
git merge donor-branch
あなたの質問では、「これらのファイルを書き換えるためにpull
コマンドをどのように変更すればよいのでしょうか」と尋ねますか?
プルはgit fetch
(リモート履歴の取得)+上流ブランチの自動マージに他なりません。したがって、pullコマンドを変更して、(a)リモート履歴を取得する、(b)ファイルを上書きするチェックアウト-fトリックを使用する、(c)リモート履歴をマージするようにします。手順は次のようになります。
git fetch Origin
git checkout -f Origin/mybranch
git checkout mybranch
git merge Origin/mybranch
知らない人のために、gitはファイルとフォルダーの大文字と小文字の違いを無視します。大文字小文字を変えてまったく同じ名前に名前を変更すると、これは悪夢になります。
フォルダの名前を「Petstore」から「petstore」(大文字から小文字)に変更すると、この問題が発生しました。 .git/configファイルを編集して大文字と小文字を無視しないようにし、変更を加え、コミットを押しつぶし、変更を隠して別のブランチに移動しました。隠された変更をこの他のブランチに適用できませんでした。
私が見つけた修正は、一時的に.git/configファイルを編集して、大文字と小文字を再び一時的に無視することでした。これにより、git stash apply
が成功しました。次に、ignoreCaseをfalse
に戻しました。それから、なんらかの理由でgitが奇妙に主張しているpetstoreフォルダー内の新しいファイルを除いてすべてを追加しました。変更をコミットし、git reset --hard HEAD
を実行して、追跡されていない新しいファイルを削除しました。私のコミットは予想どおりに表示されました。フォルダ内のファイルの名前が変更されました。
これが私の同じ悪夢を避けるのに役立つことを願っています。
これを実行する1つの方法は、ローカルの変更を隠してリモートリポジトリから取得することです。このようにして、ファイルが隠し場所に行くので、あなたはあなたのローカルファイルを失うことはありません。
git add -A
git stash
git pull
このコマンドを使ってあなたのローカル隠しファイルをチェックすることができます - git stash list