分岐した 2 つのブランチ ( masterとfeature ) を取得しました。
master - C1 - C3
\
feature C2 - C4 - C5
C2 と C4 は、2 つのブランチの最終的なマージ/リベースには入れたくない、一時的なコードを含む単純なダーティ コミットです。
私は通常、次のことを行います。
git checkout master
git cherry-pick C5 (last commit from the feature branch)
しかし、今回は競合する C3 があり、コミットを選択できません。
私が試したのは、C3 をフィーチャーブランチにリベースして、チェリー ピッキングの際に競合が発生しないようにすることです。
git checkout feature
git rebase master
今、私はこれを手に入れました
master - C1 - C3
\
feature C2 - C4 - C5
問題ないようですが、マスターにもう一度チェリーピックしようとすると、まだ競合が発生します(いくつかのファイルから削除した空のスペースで)。
Git は、競合を解決し、ファイルを追加し、コミットするように指示しています。競合は手動で解決できますが、競合を解決するためだけにコミットしたくありません。
実装に直接関係のないことについて、履歴にコミットすることは避けたいと思います。コミットメッセージとして何を書くべきかさえわかりません。
- リベース後も競合が発生するのはなぜですか?
- そして、追加のコミットなしでC5をマスターにマージ/チェリーピックするにはどうすればよいですか?
私は通常、「役に立たない」マージコミットを回避し、コード変更に関するコミットだけを行うことができるので、チェリーピックすることを好みます。その後、ブランチを削除します。しばらくすると、もう必要ないと確信しています
[[ 編集 ]]
奇妙な動作は、C3 で変更されていないファイルで C5 と C3 が競合することです。
実際、検出されたすべての競合は、マスター ブランチでは空です。
<<<<<<< HEAD
=======
[ added code ..................... ]
[ .......... from ................ ]
[ ............... 'feature' branch ]
>>>>>>> 581g52d... "Commit message from 'feature' C5 "
「解決」する必要があるのは、競合するファイルから競合タグを削除することだけです。
- 対立の理由がわからない
- 手動で解決してから、新しいコミットを作成せずにマージ/チェリーピックしたい
- コミットは、将来削除されるブランチとのいくつかの競合を解決するだけです
- ブランチを削除すると、そのコミットはリポジトリ履歴に意味/位置がなくなります
[[ 編集 2 ]]
さらに、cherry-pick master/C3をフィーチャーにgit しようとすると、次のようになります。
コミットに追加された変更はありません (「git add」および/または「git commit -a」を使用) 以前のチェリーピックは空になりました。おそらく競合の解決が原因です。
反対方向 ( featureからmasterへ)で競合が発生する理由がわかりません
[[ 編集 3 - 最初からリトライ! ]]
これも私が試したものです。
master_copyとrepeat_featureという名前の最後のコミットとして C3 を使用して、 masterブランチの 2 つのコピーを作成しました。
git checkout master
/git branch master_copy
/git branch repeat_feature
- フィーチャーブランチから C5 までのすべてのコミットを、repeat_featureにチェリー ピック
git checkout repeat_feature
/git cherry-pick C2^..C5
(機能から)
- (競合はありません)
- repeat_featureからC5 をmaster_copyにチェリーピックしようとしました
- repeat_featureが C3 から開始されたことを思い出してください (したがって、競合があった場合は、C2 から C5 へのチェリー ピッキング中にそれらを発生させる必要があります)。
git checkout master_copy
/git cherry-pick repeat_feature_C5
私はまだ同じ競合を持っています!
同じ C3 コミット (ブランチをrepeat_featureブランチにクローンしたとき) から開始し、同じ C3コミット ( master_copyに) をチェリーピックしようとしたとしても!
何が起こっているのか、なぜこれらの空の競合が発生して機能をマスターブランチに移動できないのか、まったくわかりません。
ここでは専門家の提案が必要です。