【问题标题】:Using git to merge two directories with common parent (but different SHA1)使用 git 合并两个具有共同父目录的目录(但不同的 SHA1)
【发布时间】:2012-12-24 14:02:17
【问题描述】:

在我们的项目中,有人复制了代码。他们在他们的目录中创建了一个新的 git 存储库,并在那里继续他们的工作。同时,我们主要项目存储库的工作也在继续。我们现在剩下两个没有通用 SHA1 的 git 存储库。

A --- B --- C --- D
      |
      | Copy of code to new directory
      |
      E --- F --- G

B 和 E 是完全相同的文件、文件夹等。

我们的目标是使用 Git 将变更 F 和 G 合并到主分支中(目前在 D)

【问题讨论】:

    标签: git merge git-merge


    【解决方案1】:

    首先,我要重新绘制你的图表。

    A --- B --- C --- D 大师 E --- F --- G 复制

    让我们首先将这两个放在同一个 repo 中。对此没有特殊步骤,您只需将git fetch 两者都放入同一个存储库。

    然后你创建一个嫁接。编辑.git/info/grafts...

    <E-sha1> <B-sha1>
    

    然后运行git filter-branch 使其永久化。

    git filter-branch --tag-name-filter cat -- --all
    

    这将创建一个新的历史,即“正确”的历史:

    A --- B --- C --- D 大师 \ E --- F --- G 复制

    之后,你就可以合并了。

    实际演示

    我创建了两个与图表匹配的存储库,从提交 B 复制到提交 E。

    • E 具有 SHA-1 3aa6b69127d20ac42746c39be3c273a9d80fb706
    • B 具有 SHA-1 95b0fc836dbea7eaa0d043390df841d184af7cd5
    $ git 初始化 $ git remote add master ../gittest $ git 远程添加副本 ../gittest2 $ git fetch master 远程:计数对象:12,完成。 远程:压缩对象:100% (7/7),完成。 远程:总共 12 个(增量 2),重用 0 个(增量 0) 拆包对象:100% (12/12),完成。 来自 ../gittest * [新分支] master -> master/master $ git checkout -b master master/master 分支 master 设置为从 master 跟踪远程分支 master。 已经在“大师”上 $ git 获取副本 警告:没有常见的提交 远程:计数对象:9,完成。 远程:压缩对象:100% (6/6),完成。 远程:总计 9(增量 0),重用 0(增量 0) 拆包对象:100% (9/9),完成。 来自 ../gittest2 * [新分支] 主 -> 复制/主 $ git log --format=oneline copy/master |尾 -n 1 3aa6b69127d20ac42746c39be3c273a9d80fb706 E $ git log --format=oneline master/master 1532332fe705931babe9db04c8d84051867b52c9 D 90903c0ac8dc26649b875ee00ea39bfd7571b1fb C 95b0fc836dbea7eaa0d043390df841d184af7cd5 B e9de90c82a32041cff3a19f8e40d4358bc4ec2ca 提交 A $ git log --format=oneline master/master bec0e7af9374e4c57cb87f3fd5b2fb2b6a3f431b G a61e01d096e81c36bcc450afd98ca94cff909622 F 3aa6b69127d20ac42746c39be3c273a9d80fb706 E

    如果你现在合并会发生什么?

    我遇到了希望自动解决的合并冲突。

    $ git 合并副本/主文件 自动合并 test.txt CONFLICT (add/add):在 test.txt 中合并冲突 自动合并失败;修复冲突,然后提交结果。

    移植行动

    $ 回显 3aa6b69127d20ac42746c39be3c273a9d80fb706 \ 95b0fc836dbea7eaa0d043390df841d184af7cd5 > .git/info/grafts $ git filter-branch --tag-name-filter cat -- --all 重写 bec0e7af9374e4c57cb87f3fd5b2fb2b6a3f431b (7/7) 警告:参考 'refs/heads/master' 未更改 Ref 'refs/remotes/copy/master' 被重写 警告:参考 'refs/remotes/master/master' 未更改 $ git 合并副本/主文件 自动合并 test.txt 通过“递归”策略进行合并。 测试.txt | 5 +++++ 1 个文件已更改,5 个插入(+)

    最终结果

    $ git log --graph --oneline |猫 * 4dadb0a 合并远程跟踪分支“复制/主” |\ | * bb2fc85 G | * be88bc5 F | * 0816baf E * | 1532332 D * | 90903c0 C |/ * 95b0fc8 B * e9de90c 提交 A

    【讨论】:

    • 太好了,这会生成一个漂亮的日志。并为您的解决方案 +1。
    【解决方案2】:

    假设您现在在 repo 中包含 A---B---C---D

    您需要首先使用命令将另一个 repo 添加到此 repo 中。

    $git remote add another_repo <git repo path>
    $git fetch another_repo
    

    然后就可以合并,使用

    $git merge another_repo/master
    

    【讨论】:

    • 等等...这不会引起大量合并冲突吗?
    • 如果发生冲突,这将得到很多更改的文件,但不会比正常合并更多的冲突。
    • 但是应该有冲突……因为他们没有共同的历史
    • @DietrichEpp: 大多数会被 git 自动合并,因为大部分文件的内容是一样的。
    • 我将其作为实验进行了尝试,并且在两个存储库中涉及的每个文件中都出现了合并冲突。
    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多