【问题标题】:GIT - how to merge branches?GIT - 如何合并分支?
【发布时间】:2011-03-16 14:42:11
【问题描述】:

我们决定在我们公司使用 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)

【问题讨论】:

  • 重复文件?主要的?次要的?这些不是标准术语。

标签: git git-branch git-merge


【解决方案1】:

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

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

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

git checkout branch-b -- file3

重复其他特定文件。

git add . -A
git commit

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

希望这会有所帮助。

【讨论】:

【解决方案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 的默认合并行为几乎总是按照我的意愿行事,只留下真正的冲突来解决。

【讨论】:

  • 他们的策略由于失去信息潜力而被弃用。你需要从另一边做我们的。但这带来了一个问题:合并提交的第一个父级反映了错误的分支
  • @adymitruk: 我的第一个反对票 :( 那 不是 theirs 策略,这是 recursive 策略的 theirs 选项,这是完全不同的并且没有被弃用 - 它仍然在当前的 git master 中。
  • 啊,感谢您的澄清。我不能再取消 43 分钟的投票 :(
  • 试图扭转它..现在它说我不能再次..所以有一个奇怪的时间窗口可以改变我的投票。不能做得太早,现在我不能做,因为太晚了。所以失败了。对不起:(
  • @adymitruk:我认为这是因为在某个时间窗口之后,除非答案已被编辑,否则您无法更改投票。我现在已经对其进行了编辑,但无论如何不要担心 - 我对 -2 并不在意 :)
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多