关于git branch:GIT – 如何合并分支?

GIT - how to merge branches?

我们决定在我们公司使用Git,但现在遇到了一个问题。我们有几个不同特点的分支机构。现在我们需要的是合并这些分支并将其推送到master。我们该如何使用自动替换-我们有分支-A,分支-B,分支-C-我们需要把它们都放在主文件中,但是在重复文件的情况下,分支-B应该是主文件和分支-C-次文件。

Upd:< BR>

1
2
3
4
5
branch-a:
-file1
-file2
-file3
-file4

< BR>

1
2
3
4
branch-b:
-file1
-file5
-file6

< BR>

1
2
3
4
5
branch-c:
-file1
-file2
-file7
-file8

我们需要结果:< BR>

1
2
3
4
5
6
7
8
9
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)


执行八达通合并,不提交"——不提交"。来自主控形状

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

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

1
git checkout branch-b -- file3

对其他特定文件重复此操作。

1
2
git add . -A
git commit

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

希望这有帮助。


我还没有测试过,但这可能会满足您的需求:

1
2
3
4
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合并手册页中有关递归合并策略的部分,以及该策略的ourstheirs选项。

问题在于,如果您对每个分支中的文件所做的更改没有冲突,那么您将拥有来自一个分支和另一个分支的一些更改。如果这不是你想要的(我承认我一开始不太了解你的工作流程),你可能必须这样做,例如:

1
git merge --no-commit branch-c

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

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

…然后为每个版本选择branch-c版本,其中:

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

…然后像往常一样和git commit承诺。

只是重申一下,我非常肯定我永远不想这样做-Git的默认合并行为几乎总是按我的意愿进行,只留下真正的冲突来解决。


文件复制-一个简单的替代方案

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

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

这可能不是为您的特定案例做事情的最佳方式。把它当作工具箱中的额外工具。当然,如果合并是你想要做的,而不仅仅是重写,那么Git仍然是你要使用的工具,它与诸如kdiff3这样的合并工具一起使用。