首先,我要重新绘制你的图表。
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 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