使用git合并两个非常不同的分支?

use*_*038 6 git

我有我的master分支,我的verydifferentbranch这些有同样的祖先...大约300个提交前.现在这verydifferentbranch是完整的功能我想把它放在主人之下branch.执行rebase会导致每个补丁都发生很多合并冲突,从而导致所有冲突都成为一个大型项目.

我不知道该怎么做,除了强迫将头部推verydifferentbranchmaster分支.我会失去我所有的历史,这不是我真正想做的事情.

我还有什么其他选择?

Chr*_*sen 10

听起来你的历史看起来像这样:

...---o---A---o---...---o---o---B   master
           \
            o---o---...---o---C     verydifferentbranch
Run Code Online (Sandbox Code Playgroud)

你说,你是担心失去的历史,如果你强行推verydifferentbranchmaster.这样的操作将有效后扔掉一切A和达B.

您可以通过合并它来保留历史记录,或者只是通过在废弃的分支尖端放置标记并使其保持未合并状态来保存历史记录.

使用合并

合并将允许您保留历史的两面:

...---o---A---o---...---o---o---B
           \                     \
            o---o---...---o---C---M  master
Run Code Online (Sandbox Code Playgroud)

您执行的合并类型将确定为提交M创建的内容.正常合并(使用recursive合并策略)听起来像是会在您的情况下产生大量冲突.如果您确实需要合并来自A..B提交的更改,那么除了合并或rebase所呈现的冲突之外,没有其他任何事情可做.(将来你可能会遇到更少的问题,如果你可以更频繁地合并或更改以解决冲突.)但是,如果你只想M拥有相同的内容C(即你想忽略由在A..B提交),那么你可以使用的ours合并策略.

git-merge(1)描述了ours合并策略:

这会解析任意数量的头,但合并的结果树始终是当前分支头的树,实际上忽略了所有其他分支的所有更改.它旨在用于取代侧枝的旧发展历史.请注意,这与递归合并策略的-Xours选项不同.

您可以使用以下消息生成M Merge commit 'abandoned/foo-features':

git tag -m 'describe reason for abandonment here...' \
    abandoned/foo-features master                   # tag abandoned branch tip
git checkout verydifferentbranch                    # checkout dominant branch
git branch -M verydifferentbranch master            # replace master
git merge -s ours abandoned/foo-features            # merge only other's history
git tag -d abandoned/foo-features                   # optional: delete the tag
git push wherever master tag abandoned/foo-features # publish them
Run Code Online (Sandbox Code Playgroud)

这些命令的变化将为您提供略微不同的自动提交消息M(您可以随时提供git merge -mgit commit --amend随后修改它).

重点是结果master将具有两个历史记录,但没有来自原始master方面的更改(这些更改仍然在历史记录中,它们不会在提交引用的树中表示M).

把它挂起来

如果"重写"是可以接受的master(即没有基于任何提交的其他工作A..B,或者涉及的用户不介意从重写中恢复所需的工作),那么你可以在的电流尖master和替换masterverydifferentbranch.

...---o---A---o---...---o---o---B   (tag: abandoned/foo-features)
           \
            o---o---...---o---C      master
Run Code Online (Sandbox Code Playgroud)

像这样安排:

git tag -m 'describe reason for abandonment here...' \
    abandoned/foo-features master                    # tag abandoned branch tip
git branch -M verydifferentbranch master             # replace master
git push wherever +master tag abandoned/foo-features # publish them
Run Code Online (Sandbox Code Playgroud)


Chr*_*rle 5

这就是该git merge功能存在的原因。

$> git checkout master
$> git merge verydifferentbranch
Run Code Online (Sandbox Code Playgroud)

第一次这样做时,很可能会出现很多冲突(如果它们像你声称的那样分歧很大)。但如果你能掌控一切,在最初的合并之后,情况不会太糟糕。