git-ローカルが削除されてもファイルがリモートに存在する場合のマージの競合


116

私はgitに非常に慣れていないので、ローカルリポジトリでマスターブランチのいくつかのファイルを削除しましたが、これらのファイルはリモートマスターブランチ内に存在するので、どのようにマージする必要があるのか​​疑問に思いました。

git-mergeを実行すると、発生した競合が表示されます。

git guiを使用すると、ローカルブランチファイルが削除され、リモートブランチファイルにコンテンツが含まれていることが示されます。

これらのファイルの競合を防ぐにはどうすればよいですか?git guiを使用する簡単な方法はありますか?

どうもありがとう


過去に、私がやったことの1つは、「削除された」ファイルをソース管理に残し、プロジェクト/ makefile /何からでもそれらを除外することです。これは、少なくともマージの競合に対する一時的な回避策です。
Mark Rushakoff、2010年

2
マージの競合を修正するのと同じ方法で修正します。目的のバージョン(ファイルまたはファイルの不足)をインデックスに追加して、コミットします。あなたはどれが欲しいですか?
Cascabel、2010


@MarkRushakoff私はあなたのアドバイスを「私が衝突を解決する必要がある状況に遭遇したとき、それらを解決するのではなく単にそれらを実際にマスクするために彼らが将来誰か(おそらく私ではない)を噛むようにする」に言い換えるでしょう。これは、プロジェクトにより多くの問題を持ち込みたい人にとって、本当に良いアドバイスです。
Victor Yarema

回答:


155

必要に応じて、競合を解決する必要があります。ファイルが本当に削除されることになっていて、その変更をオリジンに公開する場合は、もう一度削除します。

git rm path/to/file

実際にファイルを引き続き追跡する必要がある場合は、ファイルを追加します(作業ツリーのバージョンは、元のバージョンになります)。

git add path/to/file

これらのいずれかを実行して競合を解決した後、マージをコミットします。


複数のファイルがあり、すべて同じディレクトリにあり、すべて同じサフィックスが付いています。ディレクトリ内の残りのファイルを保持しながら、それらを一度にすべて削除するショートカットはありますか?
サイボーグ、

@chiborg:それはただの質問です。cdディレクトリ、およびgit rm *.ext。あなたのシェル(ないGitは)展開し*.ext、一致するすべてのファイル名に。
Cascabel、2011年

また、ファイルの一部を保持したい場合はどうすればよいですか?フラグgit rmはありません-i
サイボーグ、2011年

@chiborg:あなたはあなたが与えられたサフィックスを持つすべてを削除し、他のすべてをそのまま残したいと言った。それはまさに私があなたにどのように行うかをあなたに言ったことです。それとも、どういう意味git rm *-suffix.extですか?同じ違い。シェルワイルドカードの使用方法がわからない場合は、unix.stackexchange.comで質問してください。グロビングでは必要なことを実行できないという事実がわかっている場合は、を使用rm -igit add -uてを実行し、削除を取得します。
Cascabel、2011年

2
@Jefromiは、私が指定していた場合-s recursive -X ours、なぜそれはまだする必要があるgit rmgit add
Noel Yap

27

承認された回答に加えて追加されたヒントとして、「deleted by us」では、使用できる他の場所にそれらの変更を適用できるように、削除されたファイルに加えられた変更を確認したい場合:

git diff ...origin/master -- path/to/file

それが「彼らによって削除された」シナリオであり、他の場所に適用できるように変更を確認したい場合は、以下を使用できます。

git diff origin/master... -- path/to/file

6
はい!これは、ファイルの名前が変更されたときや、ファイルが削除される前にコンテンツが移動されたときなど、マージしている変更を吹き飛ばしたくない場合に重要です。
Edward Anderson

8
注意:リベース中に競合が発生した場合、これは機能しません。次のように明示する必要がありますgit diff mybranch@{1}...origin/master -- path/to/file
nschum

@nschumありがとう!これがまさに私が探していたものです。
チュイム

2
使用することもできますgit diff --base(他の回答を参照してください)。
Dorian Marchal

こんにちはジョセフ、この答えは有望に見えますが、私はまだ行き詰っています。時間があれば、ここで答えてください:stackoverflow.com/q/63044843/470749ありがとうございます!
ライアン

9

Git GUIでは、競合するファイルを選択し、競合するテキストが表示されているメインテキスト領域を右クリックします。

表示されるコンテキストメニューで、[リモート]または[ローカル]を選択できます。したがって、ファイルがリモートで削除された場合は、「リモート」を選択してローカルで削除を伝播することができ、その逆も可能です。

それを理解するのに1か月かかった... Git GUIが実際にドキュメントを持っていれば...


4

最も評価の高い答えは、競合を解決する方法に焦点を当てています。

その前に、おそらくローカルで削除されたファイルでリモートが何を変更したかを知りたいでしょう。

これを行うには、次のようにして変更を確認できます。

git diff --base

https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--baseから

作業ツリーを「ベース」バージョンと比較します[...]。インデックスには、マージされていないエントリ(競合の解決中)の場合のみこれらのステージが含まれます。


これは、git diff --base stackoverflow.com
Ryan

0

EGitでも問題が見つかりました。私の解決策は:

  • Gitステージングビューを使用。
  • ステージングされていない変更で表示される各ファイルをダブルクリックして、コンパレータを開きます
  • 「すべてを左から右にコピー」アイコンをクリックします
  • ファイルを保存します(ステージングされていないリストから削除されます)

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