ローカルの変更がマージによって上書きされるという「git pull」のエラーを無視するにはどうすればよいですか?


569

Gitプルで次のエラーメッセージを無視するにはどうすればよいですか?

次のファイルに対するローカルの変更は、マージによって上書きされます

それらを上書きしたい場合はどうなりますか?

私はのようなものを試しましたgit pull -fが、何もうまくいきません。

明確にするために、すべてではなく、特定の変更のみを上書きしたいと思います。


関連するがありません重複:stackoverflow.com/questions/52704/...
ダニエルHilgarth

7
@BrianKnoblauch完全に同意します!さらに、それが「上書き」であれば、それは「マージ」ではありませんか?私は毎日SVNを見逃しています...
user1944491 2015年

2
git config core.fileMode false時間を節約
Nolwennig


それらを上書きしたくない場合はどうなりますか?
フィリップレゴ

回答:


439

gitによって追跡されていないファイルを含むすべてのローカル変更を作業コピーから削除する場合は、単にそれらを隠します。

git stash push --include-untracked

それらがもう必要ない場合は、その隠し場所をドロップできます。

git stash drop

既にステージングした変更を(たとえば、git add- を使用して)隠したくない場合は、オプションを追加します--keep-index。ただし、これらの段階的な変更が上流からの変更と衝突した場合でも、これによりマージが防止されることに注意してください。


ローカル変更の特定の部分のみを上書きする場合は、2つの可能性があります。

  1. 上書きしたくないものはすべてコミットし、残りについては上記の方法を使用します。

  2. git checkout path/to/file/to/revert上書きしたい変更に使用します。ファイルがを介してステージングされていないことを確認してくださいgit reset HEAD path/to/file/to/revert


可能性#2は機能しません。コマンドを実行した後、何も起こりません。プル時にも同じエラーが発生します。
mae

1
@ user1132363:私にとってはうまくいきます。最初に単一のファイルでテストしてください。また、上書きするファイルがステージングされていないことを確認してください。
Daniel Hilgarth、2013年

3
トリックは使用することgit checkout HEAD^ path/to/file/to/revertでした。HEAD ^を使用すると、すべての違いが生まれます。
mae

2
@ user1132363:これにより、現在チェックインされているバージョンではなく、以前のバージョンがチェックアウトされます。これが正しいアプローチであるとは思いません。
Daniel Hilgarth、2013年

1
save --keep-index」を除外する必要がありました。
Peter Mortensen

318

他の2つの答えの助けを借りて、私は直接的な解決策を考え出しました:

git checkout HEAD^ file/to/overwrite
git pull

7
これでうまくいきました。この答え、つまり これは実際に何をしていますか?
AC Patrice

3
ローカルの変更を削除し、おそらくマスターブランチの最後のコミットであるHEADリファレンスに戻します
k3a

32
なぜHEAD ^ではなくHEAD ^なのですか?
Yura

19
HEAD ^はHEAD ^ 1の略で、基本的にはHEADの前のコミットを意味します。その前のコミットに対してHEAD ^ 2を実行することもできます。詳細については、git-scm.com / book / en / v2 / および stackoverflow.com/questions/1955985/…を参照してください。
davidneedham 2015

4
これが答えで何をするか説明してください
エンドリス

242

これは私にとってすべてのローカル変更を上書きするために機能し、アイデンティティを必要としません:

git reset --hard
git pull

4
SOは、ランキングアルゴで作業する必要があります。これまでのところ、有効で評価の高い回答を見つけるのは面倒です。
ベネディクト

3
@BenedictK。ランキングシステムは、「ほとんどの人が最も役立つと思うもの」を適切に反映していると思います。彼らは投票によってランク付けされています。他のソリューションを好む人が増えています。これは良い解決策ですが、より多くの人々が他の答えがより役立つと感じています。
Kittsil 2018年

私には問題なく動作します
エンダー

超簡単=)thx ^^
lestat_kim

タンク、私にとってはうまく
Igor

76

段階的な変更を破棄するソリューションは次のとおりです。

git reset file/to/overwrite
git checkout file/to/overwrite

11
不愉快なことに、ファイルのチェックアウト時にファイルの改行が変更されたという事実から認識された違いが生じた場合、これは問題を解決しません。
DanielSank 2014

1
私の問題を解決しました。
ロイック・N.

これは最良の答えです、imo。ステージングされたアイテムを中断することはありませんが、プルを妨げるファイルの問題に対処します
theRiley

65

マージを行う前に変更をコミットするか、それらを隠しておくことができます。

  1. git stash save
  2. git merge origin/master
  3. git stash pop

10
ポイントは、これを行う必要はないということです。現在のHEADマテリアルを取得して.....マージするだけです!それは本当に簡単です、Git、他のすべてのVCSはそれを行います...しかし、いいえ。Linusは、使用するのを面倒にする必要がありました。
Jon

@ジョンこのソリューションはUbuntu用であり、私はこれより良いものを見つけていません。
Suneel Kumar 2016

残念ながら、--autostashオプションは--rebaseオプション(
Eugen Konkov

それはそれだけの価値がないほど多くの問題を引き起こすでしょう。ロードにも少なくとも5分かかります。「ファイルのリンク解除」エラーも導入されています。反対投票
Philip Rego

51

1つのファイルに対するローカルの変更を破棄したい場合は、以下を実行できます。

git checkout -- <file>

次に、ファイルを最新バージョンで上書きするだけです。

git pull

@pabloascこれは、そのファイル内のローカルの変更を破棄します。
Suneel Kumar

6
はい、「上書きしたい場合はどうしますか?」
デビッド

1
元の質問ではこれはできません。この答えは、コマンドを盲目的にコピーして貼り付けることができる誰かに悪夢を与える可能性があります。
Suneel Kumar

すでにコミットをステージングしている場合は、最初にコミットを元に戻してからgit reset HEAD~git checkout
dopexxxを

git checkout -- <file>失敗するerror: pathspec '<file>' did not match any file(s) known to git.
A__

18

リポジトリにいくつかのファイルが含まれている場合master

  1. git checkout master
  2. git fetch origin
  3. git reset --hard origin/master
  4. git checkout -b newbranch

12

時々、これらのどれも機能しません。不愉快なことに、LFの問題により、ファイルを削除しからプルするのがうまくいくと思います。私がこのソリューションをお勧めするわけではありませんが、ファイルが存在しない場合、gitは変更(変更されない場合もある)が上書きされることを無意味に通知しないので、続行できます。

自己責任。


行末が原因で行き詰まった場合、この方法は命の恩人です
Dan Pisarski

これではうまくいきません。ファイルがローカルに存在せず、まだエラーが発生します。
PRMan

11

git stash save --keep-index 私のために働いていませんでした。

以下のコマンドは期待どおりに機能しました。

git reset --hard
git pull

ローカルの変更が必要なければ、すべての変更を上書きします。


10

ここには非常に多くの答えがあるので、もう1つ追加するのは嫌ですが、上記のすべては必要以上に不格好です。Gitが混乱し、変更されていないファイルを変更したため、これを常に行う必要があります(変更されていないため元に戻すことはできませんが、変更されている可能性があるため、プルすることはできません)。私がこれまでに見つけた最速は:

git stash
git stash drop
git pull

魅力のように働きました
Blaze

すごい!シンプルで実用的なソリューション。
naïveRSA

すばらしい、たくさんありがとう
ハムザ

8

最近のGitでは、-r/ --rebaseon pullコマンドを追加して、フェッチ後に現在のブランチを上流のブランチの上にリベースできます。警告は消えるはずですが、解決する必要があるいくつかの競合が発生するリスクがあります。


別の方法として、別のブランチを強制的にチェックアウトして、次に戻ることもできますmaster。例:

git checkout origin/master -f
git checkout master -f

次に、いつものようにもう一度引っ張ります:

git pull origin master

この方法を使用すると、スタッシング(git stash)と潜在的な権限の問題、ファイルのリセット(git reset HEAD --hard)、ファイルの削除(git clean -fd)などから時間を節約できます。また、上記のことを覚えておくのも簡単です。


8

この問題は、ファイルにローカルで変更を加えたため、Gitリポジトリに変更が加えられた同じファイルが存在するため、プル/プッシュする前にローカルの変更を隠しておく必要があります。

単一ファイルのローカル変更を上書きするには:

git reset file/to/overwrite
git checkout file/to/overwrite

すべてのローカル変更(すべてのファイルの変更)を上書きするには:

git stash
git pull
git stash pop

また、この問題は、マスターブランチとマージされていないブランチにいることが原因である可能性があります。


5

git reset --hard && git clean -df

注意:これにより、追跡されていないファイルがリセットされ、削除されます。


27
友人の額からハエを取り除くために斧を使わない。
HonoredMule

3
一部のファイルが削除されることを意識せずにこれを使用しないでください。
アンドロメダ


4

この問題を解決する最良の方法は次のとおりです。

git checkout -- <path/file_name>

その後、次の方法でファイルを上書きできます。

git pull origin master

ファイルが変更されていないことを想定してインデックスを更新したため、問題が言及されました。それでも私は引っ張ることはできません。私はgit checkout -- path/*1回だけ使用しましたが、プルアフターを実行することができました。
Stephen O'Flynn 2017年

4

これは、ライブリモートサーバー上の変更を破棄し、ソースコントロールGitHubからプルするのに役立ちました。

git reset --hard
git pull origin master

4

これが問題を解決するための私の戦略です。

問題文

10以上のファイルを変更する必要があります。試してみましたPULL (git pull origin master)が、Gitは叫びました:

エラー:次のファイルに対するローカルの変更はマージによって上書きされます:マージする前に、変更をコミットするか、隠してください。

私たちは、実行しようとしたcommit当時とpull、彼らはどちらか動作しませんでした。

解決

ファイルが「ステージング領域」または「インデックス領域」にあり、一部が「ヘッド領域」または「ローカルGitディレクトリ」にあったため、実際にはダーティステージにありました。そして、サーバーから変更をプルしたかったのです。

明確な方法でGitのさまざまなステージに関する情報については、このリンクを確認してください:GITステージ

次の手順に従いました

  • git stash (これにより作業ディレクトリがきれいになりました。変更はGitによってスタックに保存されます)。
  • git pull origin master (サーバーから変更をプルします)
  • git stash apply (スタックからのすべての変更を適用)
  • git commit -m 'message' (変更をコミットしました)
  • git push origin master (変更をサーバーにプッシュしました)
  • git stash drop (スタックをドロップ)

隠しておく必要があるときと理由を理解しましょう

あなたはしている場合、汚れのに、あなたは、ファイルの変更を行っていると、あなたが何らかの理由で、強要され、手段の状態プルまたはスイッチので、この時点で、あなたが引っ張ったりすることができない、いくつかの非常に緊急の仕事のための別のブランチには、変更をコミットするまで切り替えます。stashコマンドは、援助の手としてここにあります。

ProGIT、第2版から:

多くの場合、プロジェクトの一部で作業しているとき、物事は厄介な状態にあり、ブランチを切り替えて少し他の作業を行う必要があります。問題は、あとでこの時点に戻ることができるように、半完了した作業をコミットしたくないということです。この問題の答えはgit stashコマンドです。スタッシングは、作業ディレクトリのダーティな状態(つまり、変更された追跡ファイルと段階的な変更)を取得し、いつでも再適用できる未完了の変更のスタックに保存します。


3

特定の変更を上書きしたい場合、どの変更を忘れたいかを伝える何らかの方法が必要です。

使用を中止したい変更を選択的に隠しておき、git stash --patchその隠し場所をでドロップしてみることができますgit stash drop。その後、リモートの変更を取り込み、通常どおりそれらをマージできます。


3

TL; DR;

git pull --rebase --autostash
  -r, --rebase[=false|true|merges|preserve|interactive]
       When true, rebase the current branch on top of the upstream branch after
       fetching. If there is a remote-tracking branch corresponding to the upstream

  --autostash, --no-autostash
       Before starting rebase, stash local modifications away if
       needed, and apply the stash entry when done

これがまだ回答されていない理由はわかりませんが、解決策は簡単にわかります。ここでのすべての回答は同じことを示唆しています:ローカル変更を削除/保存して上流に適用し、次に(もしあればsave)ローカル変更を上に適用します。

何をgit pull --rebase --autostashステップ・バイ・ステップで行われます。

1. your local changes saved by `--autostash`
2. your local commits saved by `--rebase`
3. commits from upstream applied to your branch
4. your local commits are restored on top of upstream
5. your local changes are restored to working directory

私のケース(おそらくあなたも):

ローカルの変更(作業ディレクトリでの変更)があります。

ここに画像の説明を入力してください

リモートの変更をプルしようとすると、エラーが発生します。

ここに画像の説明を入力してください

この変更はローカルの変更と交差しません:

ここに画像の説明を入力してください

だから私際にpull --rebase --autostashローカルの変更が保存され、問題なく適用しました自動的に自動的に

ここに画像の説明を入力してください

今私のローカルな変更は少し低いです: ここに画像の説明を入力してください


2

これには特別なケースがありました。--assume-unchangedが付いたファイルがありました。git statusコマンドに変更が表示されなかったため、場所を見つけるのが困難でした


私にも同じ問題があります。あなたはそれを回避する方法を見つけましたか?私は削除してから変更なしの仮定を再度追加できると思います...私が行ったのは、それらのファイルを手動でチェックアウトして変更されていないバージョンを取得することです...単にチェックアウト/リベース/マージを単に上書きする方法があるかどうか疑問に思っていますそれら。
David

1
いいえ、「変更しないと仮定する」こと全体を放棄しなければなりませんでした。

2

サーバーで本番環境の変更を維持する場合は、新しい構成アイテムにマージするだけです。処理方法は以下のとおりです。

git stash
git pull
git stash pop

たぶん、すべての操作を実行するわけではありません。次に何ができるかを知ることができます。


次に、Git diff-w +ファイル名を使用して、コードのマージを自動的に確認できます
YanQing

1

私は私のリポジトリのファイルを無視していました、そしてそれをしたとき、私はgit pull upstream master次のエラーを受け取りました:

エラー:次のファイルに対するローカルの変更は、マージによって上書きされます:myfile.jsマージする前に、変更をコミットするか、それらを隠してください。中止しています

それを解決するために、私は次のことをしました

git update-index --no-assume-unchanged myfile.js

その後、私git statusはこのメッセージを受け取りました

ブランチマスター上ブランチは4つのコミットによって「origin / master」の背後にあり、早送りすることができます。(「git pull」を使用してローカルブランチを更新します)

コミットのためにステージングされていない変更:(コミットされるものを更新するには「git add ...」を使用)(作業ディレクトリの変更を破棄するには「git checkout-...」を使用)

変更:myfile.js

コミットに変更が追加されていません( "git add"や "git commit -a"を使用してください)

その後、私はgit checkout myfile.js続いたgit pull upstream master。今回はgit pull操作が成功しました。


1

マスターから引っ張るときにこれに遭遇しました。

Visual Studioを使用して処理する方法。

  1. まず、自分のソリューションで元に戻すコミットを実行しました。
  2. 次に、Gitのプルプロセスを行いました。

お役に立てれば!



1

私はgitの初心者で、自分の解決策が良いアイデアかどうかはわかりません。

私はすべての答えをテストしましたが、どれもうまくいきませんでした!

しかし、私は別の解決策を見つけました:

1. Backup both of local and repository versions of the file.
2. Delete the file from repository.
3. git add .
4. git commit
5. git push

お役に立てれば。


1

ローカルリポジトリにまだコミットされていない変更があるため、「次のファイルに対するローカルの変更はマージによって上書きされます」というエラーが発生するため、リモートリポジトリからプルする前に、ローカルリポジトリの変更をコミットするだけです。

リモートリポジトリにブランチxyzがあり、そのリモートリポジトリxyzブランチをローカルリポジトリxyzブランチにマージ(コピー)したいとしましょう。

{
git checkout xyz                  //check out to the respective branch in local repo
git commit -m "commiting message" //commit changes if any, in local repo branch xyz
git pull                          //it pulls remote xyz branch into local xyz branch
}

0

このエラーが行末が原因である場合、

git add
git checkout mybranch

働くでしょう。なぜうまくいくのかよくわかりません。



0

このメッセージは、git-lfsが使用され、ファイルポインタが実際のファイルによって上書きされた場合にも発生する可能性があります。

次に使用します:

git stash
git lfs migrate import
git pull

私のケースからの完全な出力

λ git stash
Saved working directory and index state WIP on master: 5d4ad47 Merge branch 'feature/...' into 'master'
Encountered 1 file(s) that should have been pointers, but weren't:
        public/apple-touch-icon.png

λ git pull
Updating 5a4ad44..b25f79d
error: Your local changes to the following files would be overwritten by merge:
        public/apple-touch-icon.png
Please commit your changes or stash them before you merge.
Aborting

λ git lfs migrate import
migrate: Fetching remote refs: ..., done
migrate: Sorting commits: ..., done
migrate: Rewriting commits: 100% (0/0), done
migrate: Updating refs: ..., done
migrate: checkout: ..., done


λ git pull
Updating 5d4ad47..a25c79a
Fast-forward
 public/apple-touch-icon.png | Bin 2092 -> 130 bytes
 public/favicon.ico          | Bin 6518 -> 1150 bytes
 2 files changed, 0 insertions(+), 0 deletions(-)

https://github.com/git-lfs/git-lfs/issues/2839を参照してください


0

私は試してみましたが、プルする前に、コミットしていないすべてのファイルをコミットします。そうしないと、ASからそのメッセージを受信しません。

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