2

分岐した 2 つのブランチ ( masterfeature ) を取得しました。

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_copyrepeat_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に) をチェリーピックしようとしたとしても!

何が起こっているのか、なぜこれらの空の競合が発生して機能をマスターブランチに移動できないのか、まったくわかりません。

ここでは専門家の提案が必要です。

4

2 に答える 2

1

実装に直接関係のないことについて、履歴にコミットすることは避けたいです。

でこのトピックに関する多くの回答を読んだのでSO、ほとんどの人が unnecessary を使用しないようにアドバイスしていると言えgit cherry-pickます。

はい、一連のコミットを通じて開発されたものをマージするためのものでcherry-pickはありません。両方のブランチが他のコミットで変更されていないコードラインに対して、あるブランチから別のブランチに小さな変更を適用するためのものです。

主な可能性は、いくつかのダーティを回避しながら状態feature C5をマージし、 squashing を使用することです。masterC2C4

1.使用merge

git checkout master
git merge --squash feature

2.使用rebase

これはインタラクティブなリベースで行うことができます:

git checkout feature
git rebase -i master

次に、1 つを除くすべてのコミットに対して変更pickする必要があります。squash

また、すべての一時的なコミット メッセージをsquash!orfixup!ワードで開始します。次に、使用できるようになりますautosquash(すべての一時コミットは、リベース中にリストにこのキーワードとともに表示されます)

git checkout feature
HASH=`git merge-base --fork-point master`
git rebase -i $HASH --autosquash
于 2016-02-20T18:03:51.017 に答える