5

我们决定在我们公司使用 GIT,但现在遇到了一个问题。我们有几个具有不同功能的分支。现在我们需要合并这些分支并将其推送到 Master。我们将如何使用自动替换来做到这一点 - 我们有分支-a、分支-b、分支-c - 我们需要将它们全部放在 Master 中,但如果文件重复,则分支-b 应该是主要的,分支-c - 次要的。

更新:

分支-a:
-file1
-文件2
-file3
-file4


分支-b:
-file1
-file5
-file6


分支-c:
-file1
-文件2
-file7
-file8

我们需要结果:

掌握:
-file1(来自 b)
-file2(来自 a)
-file3(来自 a)
-file4(来自 a)
-file5(来自 b)
-file6(来自 b)
-file7(来自 c)
-file8(来自 c)
4

3 回答 3

11

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

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

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

git checkout branch-b -- file3

重复其他特定文件。

git add . -A
git commit

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

希望这可以帮助。

于 2011-03-16T19:41:29.393 回答
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 手册页中有关递归合并策略的部分,以及该策略的oursandtheirs选项。

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

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

于 2011-03-16T15:40:10.627 回答
0

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

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

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

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

于 2016-07-19T10:07:40.523 回答