3

問題があります。ブランチmasterfeature. 100 年前masterfeature共通の祖先がありましたが、その時から 100500 のコミットが経過しました。masterブランチは現在非常にfeature多様です。Ok。私は一日中費やし、ついにこの %#$%# マージを完了しました。しかし...一日の終わりに、この結果をリポジトリにプッシュしようとしましたが、チームメイトが「マスター」ブランチで約5つの新しいコミットを行っていることに気付きました... $#%#$ それは私たちにとって重要ですリベースを実行して、このコミットより先にマージを早送りします。したがって、この 5 つのコミットをマージ結果に組み込む必要があります。私はすでにEローカルリポジトリにコミットしています(スキームを見てください)。これは、にマージmasterした結果ですfeature. C1のため、サーバーにプッシュできません... C5-リモートでの新しいコミットfeature。私がリモートで何か新しいものを持っているとき、すでに変更を加えているとき、私はgit pull --rebase1 つのブランチの履歴を線形に保つようにしています。私は走っgit pull --rebaseて、実際にgitから提案を受け取り、すべてをもう一度マージしました。C1、...C5 コミットでは変更されていないファイルでも、多くの競合が発生しています。私が間違っていることは何ですか?助けてください。2番目のスキームで溺れた結果を取得するにはどうすればよいですか? 私はクレイジーですか?それはまったく可能ですか?

Now:

o--A--o-----...100500 commits....[master]....--o-----------B
       \                                                    \ 
        o---...100500 commits....[feature - local repo]...C--E(local repo - epic merge result)
        |                                    
        o---...100500 commits....[feature - remote repo]..C--C1--C2--C3--C4--C5(remote repo, feature branch - additional 5 commits)


Need to fast-forward E ahead C1, C2,... C5, that were added on remote when I was busy with merge:

o--A--o-----...100500 commits....[master]....--o-----------------------B
       \                                                                \ 
        o---...100500 commits....[feature]...--o--C--C1--C2--C3--C4--C5--E(epic merge result)

更新(ブランチにとどまって
いる) ときに、git が最初に C1、..、C5 (ブランチのリモートでコミット)、次に 2 番目、次にブランチの他の 100500 コミ​​ットの上に置こうとすることに気付きました。それは私が望むものではありません。C1、..C5の上にコミットするだけで済みますが、ブランチのすべてのコミットは必要ありません。betweenを調べると、この動作が見られ、競合が発生し、サイクルが発生します。git pull --rebasefeaturefeaturemasterEmastergitk --allgit rebase --continuegit mergetool

4

1 に答える 1

0

マージを使用して履歴を取得し、その上に5つの新しいコミットをリベースします。はい、これはあなたが求めていたものではありませんが、辛抱強く待ってください。

発生するマージの競合を解決します。5つの新しいコミットのみを処理しているため、これは単純なはずです。

これで、まさにあなたが望むものである結果のツリーができました。ここにタグをドロップしてから、すべてを破棄して最初からやり直してください。

今回は、マージするブランチ内の5つの新しいコミットを含めて、新たにマージを実行します。ただし-s ours、戦略オプションとして渡し、--no-commit実際にコミットを実行しないようにします。

次に、前のマージ+リベースからツリーを読み取ります。これは、(前の結果に配置したタグはgit checkout $tag -- .どこにありますか)と同じくらい単純である必要があります。$tag

次に実行しますgit commit。これにより、必要な履歴、および前の作業で作成されたツリーとのマージがコミットされます。

これが良さそうな場合は、先に進んでプッシュし、タグを削除してください。

于 2012-05-09T21:34:59.823 に答える