3

私は問題があります。分岐があったmasterfeature。 1百数年前、masterfeatureには共通の祖先がありましたが、それ以降は100500回のコミットが行われました。 masterfeatureの分岐が非常に分岐しています。 OK。私は一日中長い時間を過ごしており、最後にこの%#$%#マージを完了しました。しかし... 1日の終わりに、私はこの結果をリポジトリにプッシュし、私のチームメイトが「master」ブランチで約5つの新しいコミットを行ったことに気付きました... $#%#$それは私にとって重要ですdo rebase早送りするには、これを先に進めてください。だから、この5つのコミットをマージ結果に組み込む必要があります。私はすでにEmasterfeatureにマージした結果である自分のローカルレポで(コミットを見て)コミットしています。私はC1のためにサーバー上でそれを押すことはできません... C5 - 新しいリモートのコミットfeature。私がすでに何か新しいことをリモートで持っているとき私のための標準的な練習は、私はすでに変更を加えたときに、私はgit pull --rebase 1つのブランチの履歴を保持するリニア。私は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) 

更新
私は(featureブランチに滞在)git pull --rebaseをやっている私は...、C5は(featureブランチのリモートにコミット)、GitはC1の上に置くことを試みることに気づきました、次に2番目に、ブランチのmasterの他の100500コミット。それは私が望むものではありません。私はE C1の上にコミットする必要があります.. C5が、masterブランチのすべてのコミットではありません。私はgit rebase --continueの間でgitk --allを調べると、この動作を見ると、競合が発生し、git mergetoolサイクルになります。

答えて

0

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

発生するマージの競合を解決します。あなたは5つの新しいコミットしか扱っていないので、これは簡単なはずです。

これで、目的のツリーが得られました。ここにタグを入れて、すべてを捨ててやり直してください。

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

これで、以前のマージ+リベースのツリーが読み込まれました。これは、git checkout $tag -- .(ここで、$tagは前回の結果に配置したタグです)と同じくらい簡単です。

git commitを実行します。これはあなたが望む歴史を持ってあなたのマージをコミットし、あなたの以前の仕事によって生み出された木でコミットします。

これがうまくいけば、それを押してタグを削除してください。

+0

申し訳ありませんが、私はばかです、あなたのアイデアをより詳しく説明してください。 「マージして履歴を取り、その上に5つの新しいコミットをリベースする」という意味です。私が中止したリベース中にマージを処理することを意味しますか? (それは地獄です!) – Dao

+0

@Dao:あなたの現在の歴史では、地元の特徴がマージされたマスターがあります。あなたはそれの上にリモート機能をrebaseしたい。最も単純な方法は、実際には5つのコミットのすべてをチェリーピックすることです( 'git cherry-pick ..remote/feature')。 –

+0

@Dao:また、ローカルの機能ブランチをチェックアウトし、それをリモートに一致するように更新し、次に 'git rebase master'だけにすることができます。 –

関連する問題