2

最近、SVN から GIT に切り替えましたが、以前のワークフローの変換に問題があります。ほとんどすべてが機能しますが、今日は奇妙なチェリーピックの競合が発生しました。

競合を解決することはできますが、これがどこから来たのかを知りたいです。私の理解では、この状況では競合が発生するべきではないからです。

設定

私たちのリポジトリには、master開発するブランチがあります。年に 4 回、新しいバージョンをリリースします。に分岐masterRelease-x、これはテスト後に出荷されます。

同時に複数のリリース バージョンを運用しています。バグが見つかった場合は、すべての (サポートされている) リリース ブランチで修正する必要があります。そのため、タグを使用してさまざまなリリースを識別する単一のリリース ブランチは、有効なワークフローではありません。

したがって、現在、次のブランチがあります: masterRelease-15Q1Release-15Q2およびRelease-15Q3

たとえば、でバグの原因となるタイプミスを見つけたとmasterします。それを修正してcherry-pickからRelease-15Q1Release-15Q2Release-15Q3

だから、今私が直面している紛争に:

ファイルは、分岐後properties.datに で変更されましたmasterRelease-15Q3

Properties.dat ( Release-15Q3)

serverip=1.1.1.1
serverport=11
name=MyApp

Properties.dat ( master)

serverip=2.2.2.2
serverport=22
name=BetterName

開発は進みました... すべて順調です。その後、バグを無効にするためにファイルに追加のプロパティを追加する必要があるバグに気付きました。

Properties.dat ( master)

  serverip=2.2.2.2
  serverport=22
  name=BetterName
+ allowBug=false

この修正コミットは、他の 3 つのブランチにも適用する必要があります。そこで、各ブランチに移動して、cherry-pick コマンドを使用します。

これにより、最初の 3 行で競合が発生しますが、その理由がよくわかりません。

チェリーピッキングでは、その特定のコミットのみを再生すると想定していたので、適切な場所にallowBug=false行を追加するだけです。ブランチをマージしていないので、他の変更が行われたかどうかは問題ではありませんよね?

なぜこれが競合を引き起こしているのですか?これらの他の変更は無視されるべきではありませんか?

4

1 に答える 1

1

cherry-pick が発行されると、まず git はその親との差分を計算します。これにより、差分ファイル (別名パッチ) が生成されます。このパッチには、変更されたもの (つまり、+ allowBug=false)変更された行の周囲のコンテキスト) だけが含まれているわけではありません。したがって、パッチ ファイルは次のようになります。

@@ -1,7 +1,7
serverip=2.2.2.2 
serverport=22  
name=BetterName
+ allowBug=false

パッチが計算されると、git はそれをリリース ブランチに適用しようとします。パッチ ファイルのコンテキスト行 (+/- のないもの) は、git+ allowBug=false. リリース ブランチの Properties.dat に周囲のコンテキストが見つからないため、パッチを適用できず、git で競合が発生します。

少し遅れましたが、お役に立てば幸いです:)

EDIT : git cherry-pick: コミットによって変更された行のみを考慮する方法 (つまり、周囲のコンテキストではない) を参照してください。

于 2016-05-02T12:03:09.543 に答える