3

私は現在、SVNからGitに巨大なプロジェクトをインポートしています。私はすべてのブランチをフラットにして、2つだけを維持することにしました。マスターブランチとダイバージドブランチ。

Master: A-B-C-D
               \ X-Y: Bugfix

Diverged: E-F-G-H

分岐には多くの異なるソースコードが含まれていますが、一部の部分は依然としてマスターに由来しています。バグ修正を行う必要がある場合は、SVNでMasterとDivergedに手動でパッチを適用する必要があります。Bugfixをmasterにマージし(ここでは問題ありません)、BugfixをDivergedにマージしたいと思います。

以前のコミットをマスターからの分岐に挿入したくないことを覚えておいてください。したがって、ABCDは無視する必要があります。私が探している構造はこれです:

Master: A-B-C-D-X-Y

Diverged: E-F-G-H-X-Y

誰かが私がこれを理解するのを手伝ってもらえますか?

4

2 に答える 2

2

分岐したブランチをマージすることは常に苦痛です。

まず第一にgit、モンスターのマージに役立ついくつかの便利なコマンドを覚えておく必要があります。

git log HEAD..origin/master-ブランチ間の違いが表示されます。

単純git merge origin/masterに機能しない場合は、マージを一連の小さなタスクに分割してみてください。変更がローカライズされるように、分岐したブランチを現在のマスターの上にリベースすることをお勧めします。

git rebase remotes/origin/master

(おそらく多くのコミットで)すべての競合を解決するという退屈なタスクになってしまいますが、これらの小さなタスクは、マージ全体を一度に処理するよりもはるかに簡単です。

Master: A-B-C-D-X-Y
Diverged: E-F-G-H-X-Y

git checkout diverged
git rebase master

リベースが完了したら、マスターをブランチの先端に早送りできます。

Master: A-B-C-D-X-Y
                  \ E-F-G-H

空のコミットは省略されます。最も複雑なシナリオでは、ブランチでインタラクティブなリベースを使用してコミットを再配置できます。つまり、あなたの計画のために:

手作業ですが、分割統治法です。

いくつかの詳細なアイデアについては、この投稿をお読みください:http: //blog.springsource.org/2010/12/21/git-and-social-coding-how-to-merge-without-fear/

于 2012-09-28T10:58:30.373 に答える
1

あなたの例はgitcherry-pickで簡単に解決できます(マージの競合は別として)。

コミットをコピーし、それを別のブランチに適用します。

git checkout diverged
git cherry-pick X Y

これにより、例で説明した状況が正確に作成されますが、実際には何もマージされません。

于 2012-09-28T14:37:39.770 に答える