4

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

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

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

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

4

2 回答 2

9

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

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-13aa6b69127d20ac42746c39be3c273a9d80fb706
  • B 具有 SHA-195b0fc836dbea7eaa0d043390df841d184af7cd5
$ git init 
$ git remote add master ../gittest 
$ git remote add copy ../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
于 2013-01-10T09:05:29.293 回答
0

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

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

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

然后你可以合并,使用

$git merge another_repo/master
于 2013-01-10T08:50:38.020 回答