GIT - 如何合并分支?

5
我们公司决定使用GIT,但现在遇到了一个问题。我们有几个不同功能的分支。现在我们需要将这些分支合并并推送到主分支Master上。我们应该如何使用autoreplace实现这一点——我们有branch-a、branch-b、branch-c,我们需要将它们全部合并到Master中,但如果有重复的文件,则branch-b应该是Major,branch-c是minor。
更新: branch-a: -file1 -file2 -file3 -file4
branch-b: -file1 -file5 -file6
branch-c: -file1 -file2 -file7 -file8
我们需要得到的结果是:
Master: -file1 (来自b) -file2 (来自a) -file3 (来自a) -file4 (来自a) -file5 (来自b) -file6 (来自b) -file7 (来自c) -file8 (来自c)

2
重复的文件?主要的?次要的?这些不是标准术语。 - Josh Lee
3个回答

11

执行八爪鱼合并并不提交 '--no-commit'。从主分支

git merge --no-commit branch-a branch-b branch-c

解决任何冲突,然后如果您想要的话,选择一个特定版本的文件并提交:

git checkout branch-b -- file3

为其他特定文件重复操作。

git add . -A
git commit

这就是您自定义工作流程的方式。

希望这可以帮到您。


你好,Adam。你能告诉我如何使用 --no-commit 选项撤销 git 合并吗? - Codium
drupality - https://dev59.com/XnVD5IYBdhLWcg3wE3No我遇到了合并冲突,如何中止合并? - Kristian H

2
我没有测试过这个,但是这可能会达到你所想要的效果:
git checkout master
git merge -s recursive -X theirs branch-c
git merge -s recursive -X theirs branch-a
git merge -s recursive -X theirs branch-b

这里使用了“递归”合并策略,但是如果在合并时出现任何冲突,总是以当前分支为基础解决。要查找此文档,请参阅git merge手册中关于递归合并策略的部分,以及该策略下的“ours”和“theirs”选项。
问题在于,如果您在每个分支上对文件所做的更改没有冲突,那么您将同时拥有两个分支中的更改。如果这不是您想要的结果(我承认我一开始并不太理解您的工作流程),您可能需要执行以下操作:
git merge --no-commit branch-c

在合并提交之前,您需要手动更新每个文件版本,并更新索引。运行该命令后,您可以找到两个分支上都存在的所有文件:

comm -1 -2 <(git ls-tree -r --name-only master|sort) <(git ls-tree -r --name-only branch-c|sort) > common.txt

然后使用以下命令为每个版本选择 branch-c 版本:

xargs -n 1 git checkout branch-c -- < common.txt

...然后像平常一样使用 git commit 进行提交。

再重申一下,我确信我永远不会这样做——git 的默认合并行为几乎总是能满足我的需求,只有在需要解决真正的冲突时才需要手动解决。


他们的策略因为信息潜力的丧失而被弃用了。你需要从另一侧来做我们的策略。但是这会带来一个问题:合并提交中的第一个父级反映了错误的分支。 - Adam Dymitruk
@adymitruk:我第一次被踩了 :( 那不是theirs策略,那是recursive策略的theirs选项,两者相当不同且不被弃用 - 它仍然在当前的Git主分支中。 - Mark Longair
啊,谢谢澄清。我还需要等43分钟才能取消投票 :( - Adam Dymitruk
尝试反转它..现在又说我不能再反转了..所以有一个奇怪的时间窗口,我可以改变我的投票。不能太早做,现在因为太晚了所以也不能做。SO失败了。很抱歉 :( - Adam Dymitruk
@adymitruk: 我认为这是因为在一段时间窗口后,除非答案已被编辑,否则您不能更改投票。我现在已经编辑了它,但无论如何不用担心 -2 :) - Mark Longair

0

文件复制 - 一种简单的替代方法

其中一种方法是检出主分支。在不同的仓库中,检出次要和主要分支文件。先复制次要文件,然后再复制主要文件,以便主要文件覆盖次要文件。然后提交结果。

文件复制甚至可以让您根据需要逐个决定是否真的希望主文件覆盖次要文件,而一个好的文件复制程序将为您提供文件的日期和大小,可能还有预览,以帮助您做出明智的决策。

这可能不是针对您特定情况的最佳方法。只需将其视为工具箱中的额外工具。当然,如果您想要合并而不仅仅是覆盖,则git仍然是要使用的工具,并辅以像kdiff3这样的合并工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接