パッチを適用するときに、競合を解決する方法はありますか?


124

私は窓の上にいます。

さまざまな理由で、異なるsvnブランチの複数のgitインスタンスがあります。

リポジトリAの問題を修正し、パッチを生成して、リポジトリBに適用したい場合がよくあります。これは、競合がない限り問題なく動作します。

リベースするときは、フォルダを右クリックしてtortioseGitを使用し、解決オプションを選択します。これにより、競合を解消するための素晴らしいGUIが表示されます。

拒否されたパッチチャンクでこれを達成する方法はありますか?

これがパッチを作成/適用するための私の現在のアプローチです

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch

3
すべてのパッチオプションが失敗した場合、通常は手動で行います...
stdcall

マージが失敗するのは、プログラム明確にマージを行う方法を理解できないためです。<<<<、===、>>>>セットを含むファイルを取得する必要があり、手動でそれらを入力して解決する必要があります。
tacaswell 2013

うん、それを手作業でやるのは、あなたが数100のrej hunkを話しているときの本当のピタです。
Kenoyer130 2013

これが、使用git mergetoolしたいGUIで3方向マージを実行したいときです(私はWindowsのkdiffに部分的です)...
g19fanatic

回答:


254

パッチを生成するには、次のようにします。

git format-patch --stdout first_commit^..last_commit > changes.patch

パッチを適用する準備ができたら、次のようにします。

git am -3 < changes.patch

-3競合がある場合は3方向マージを行います。この時点で行うことができgit mergetoolますが、GUIに行くか、単に手動(標準のvimを使用してファイルをマージしたい場合は<<<<<<||||||>>>>>>紛争解決を)。


3
に追加--ignore-whitespace --ignore-space-changeすると便利かもしれませgit amん。私はそれなしでは通用しない些細なマージをしました。
Angularsen 2015

12
git apply -3 changes.patch私にも効果があるようです
peterflynn

1
パッチが適切に適用されない場合でも、「ファイルをマージする必要はありません」というメッセージが表示されgit mergetoolます。代わりに、使用した元のパッチのベースコミットを見つけ、その上に適用し(幸運にも私のリポジトリにはこれがありました)、次にリベースする必要がありました。
jozxyqk 2018

4
@jozxyqkと同じ問題が発生しています。また、やなどのメッセージが表示されても、実際にはファイルに競合マーカーをドロップしませgit am -3ん。これはオンです。おそらく、パッチを適用できないファイルがある場合、gitはロールバックしますか?git apply -3Applied patch to 'configure.ac' with conflicts.error: patch failed: ...git 2.17.1
nh2

1
@ nh2と同じ問題が発生しましたが、問題を見つけたことがありますか?
Eridanis

12

パッチの適用、リベース、またはマージの際に同じ競合セットが頻繁に発生する場合は、git rerere(記録された解像度を再利用)機能を使用できます。これにより、過去の解決方法に基づいて、競合を解決する方法を事前に定義できます。この仕組みの詳細については、http://git-scm.com/blog/2010/03/08/rerere.htmlを参照してください


5

TortoiseGitには、パッチファイルを開くことができるマージ機能があります。

ここにそれの写真があります


実際には、マージオプションが私が探しているものかもしれません。
Kenoyer130 2013

本当に?私は長い間カメを使用していませんでしたが、リンクされたページには「TortoiseMergeはGitパッチファイルを直接開くことができます。レビューして作業コピーにパッチを適用します。」というテキストがあるため、正常に動作するようです。
AMS

それはパッチファイルを開きます...しかし、時々パッチファイルフォーマットはtortoisegitmergeを壊します。私はdiff -uではなく、diff -c出力で成功したことはありません。
thistleknot 2014

作業ツリーフォルダーでパッチを右ドラッグして、[パッチシリアルを適用](0001-xxx.patch、... 0002-xxy.patchなどのパッチの場合)または[単一のパッチファイルを適用]を選択することもできます。
MrTux、2015

2

私のアプローチは:

  • ファイルが同一である「統合」ブランチを作成します
  • このIntegration-Branchにパッチを適用します
  • それをマスターにマージまたはリベースします(ここでリベースが有用かどうかはわかりません。パッチをさらに適用するとどうなるかわかりません)。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.