GIT - 如何合并分支?

时间:2011-03-16 14:42:12

标签: git git-branch git-merge

我们决定在我们公司使用GIT,但现在遇到了问题.. 我们有几个分支具有不同的功能。现在我们需要的是合并分支并将其推送到Master。我们如何使用autoreplace做到这一点 - 我们有branch-a,branch-b,branch-c - 我们需要在Master中获取它们但是在重复文件的情况下,branch-b应该是Major而branch-c-minor。

UPD:

branch-a:
-file1
-file2
-file3
-file4


branch-b:
-file1
-file5
-file6


branch-c:
-file1
-file2
-file7
-file8

我们需要结果:

Master:
-file1 (from b)
-file2 (from a)
-file3 (from a)
-file4 (from a)
-file5 (from b)
-file6 (from b)
-file7 (from c)
-file8 (from c)

3 个答案:

答案 0 :(得分:11)

执行章鱼合并,不提交'--no-commit'。来自大师

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

解决所有冲突,然后根据需要,获取文件的特定版本并提交:

git checkout branch-b -- file3

重复其他特定文件。

git add . -A
git commit

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

希望这有帮助。

答案 1 :(得分: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

这是使用recursive合并策略,但是说如果合并时有任何冲突,要始终解决它们以支持您正在合并到当前分支的分支。要查找相关文档,请查看git merge man page中有关递归合并策略的部分,以及该策略的ourstheirs选项。

问题在于,如果您对每个分支中的文件所做的更改不会发生冲突,那么您将从一个分支中获得一些更改,而在另一个分支中进行一些更改。如果那不是你想要的(我承认我不太了解你的工作流程),你可能不得不做,例如:

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的默认合并行为几乎总能做到我想要的,只留下真正的冲突来解决。

答案 2 :(得分:0)

文件副本 - 一个简单的替代方案

执行此操作的一种方法是签出主分支。在单独的存储库中,签出次要和主要分支文件。复制次要文件,然后复制主要文件,以便主要文件覆盖次要文件。 然后提交结果。

文件副本甚至可以让您根据具体情况(如果需要)决定是否真的希望主文件覆盖次要文件,一个好的文件复制程序会给你日期和文件大小的文件和可能的预览,以帮助您做出明智的决定。

这可能不是针对您的特定情况做事的最佳方式。只需将其视为工具箱中的额外工具即可。当然,如果合并是您想要做的,而不仅仅是覆盖,那么 git 仍然是使用的工具,与kdiff3等合并工具一起使用。< / p>