使用git合并具有公共父目录(但不同的SHA1)的两个目录
在我们的项目中,有人复制了代码。他们在自己的目录中创建了一个新的git存储库,并在那里继续工作。与此同时,我们的主要项目存储库的工作也在继续。我们现在只剩下两个没有通用SHA1的git存储库使用git合并具有公共父目录(但不同的SHA1)的两个目录,git,merge,git-merge,Git,Merge,Git Merge,在我们的项目中,有人复制了代码。他们在自己的目录中创建了一个新的git存储库,并在那里继续工作。与此同时,我们的主要项目存储库的工作也在继续。我们现在只剩下两个没有通用SHA1的git存储库 A --- B --- C --- D | | Copy of code to new directory | E --- F --- G B和E是完全相同的文件、文件夹等 我们的目标是使用Git将F和G的更改合并到主分支中(当前位于D)假设您现在在回购中,
A --- B --- C --- D
|
| Copy of code to new directory
|
E --- F --- G
B和E是完全相同的文件、文件夹等
我们的目标是使用Git将F和G的更改合并到主分支中(当前位于D)假设您现在在回购中,包括
A--B--C--D
您需要首先使用命令将另一个repo添加到此repo中
$git remote add another_repo <git repo path>
$git fetch another_repo
首先,我要重新绘制你的图表 A --- B --- C --- D master E --- F --- G copy 然后运行
git filter branch
,使其永久化
git filter-branch --tag-name-filter cat -- --all
这将创建一个新的历史,“正确”的历史:
如果现在合并会发生什么?
我希望自动解决合并冲突
$ git merge copy/master
Auto-merging test.txt
CONFLICT (add/add): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
$git合并副本/主副本
自动合并测试.txt
冲突(添加/添加):在test.txt中合并冲突
自动合并失败;修复冲突,然后提交结果。
起作用的嫁接
$echo 3aa6b69127d20ac42746c39be3c273a9d80fb706\
95b0fc836dbea7eaa0d043390df841d184af7cd5>.git/info/grafts
$git筛选器分支--标记名筛选器类别--all
重写为0E7AF9374E4C57CB87F3FD5B2FB6A3F431B(7/7)
警告:Ref“Ref/heads/master”未更改
Ref“refs/remotes/copy/master”已重写
警告:Ref“refs/remotes/master/master”未更改
$git合并副本/主副本
自动合并测试.txt
通过“递归”策略进行合并。
test.txt|5+++++
1个文件已更改,5个插入(+)
最终结果
$git log--图形--单线| cat
*4dadb0a合并远程跟踪分支“副本/主副本”
|\
|*bb2fc85克
|*be88bc5 F
|*0816baf E
*| 1532332 D
*| 903C0 C
|/
*95b0fc8 B
*e9de90c提交一个
等待这不会导致大量的合并冲突吗?如果发生冲突,这将导致大量更改的文件,但不会比正常合并产生更多的冲突。但是应该会有冲突。。。因为他们没有共同点history@DietrichEpp:大多数将通过git自动合并,因为大多数文件的内容都是相同的。我尝试将其作为一个实验,在两个repo中涉及的每个文件中都会出现合并冲突。太好了,这生成了一个漂亮的日志。和+1表示您的解决方案。
git filter-branch --tag-name-filter cat -- --all
A --- B --- C --- D master
\
E --- F --- G copy
$ git init
$ git remote add master ../gittest
$ git remote add copy ../gittest2
$ git fetch master
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 12 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
From ../gittest
* [new branch] master -> master/master
$ git checkout -b master master/master
Branch master set up to track remote branch master from master.
Already on 'master'
$ git fetch copy
warning: no common commits
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 9 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From ../gittest2
* [new branch] master -> copy/master
$ git log --format=oneline copy/master | tail -n 1
3aa6b69127d20ac42746c39be3c273a9d80fb706 E
$ git log --format=oneline master/master
1532332fe705931babe9db04c8d84051867b52c9 D
90903c0ac8dc26649b875ee00ea39bfd7571b1fb C
95b0fc836dbea7eaa0d043390df841d184af7cd5 B
e9de90c82a32041cff3a19f8e40d4358bc4ec2ca Commit A
$ git log --format=oneline master/master
bec0e7af9374e4c57cb87f3fd5b2fb2b6a3f431b G
a61e01d096e81c36bcc450afd98ca94cff909622 F
3aa6b69127d20ac42746c39be3c273a9d80fb706 E
$ git merge copy/master
Auto-merging test.txt
CONFLICT (add/add): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
$ echo 3aa6b69127d20ac42746c39be3c273a9d80fb706 \
95b0fc836dbea7eaa0d043390df841d184af7cd5 > .git/info/grafts
$ git filter-branch --tag-name-filter cat -- --all
Rewrite bec0e7af9374e4c57cb87f3fd5b2fb2b6a3f431b (7/7)
WARNING: Ref 'refs/heads/master' is unchanged
Ref 'refs/remotes/copy/master' was rewritten
WARNING: Ref 'refs/remotes/master/master' is unchanged
$ git merge copy/master
Auto-merging test.txt
Merge made by the 'recursive' strategy.
test.txt | 5 +++++
1 file changed, 5 insertions(+)
$ git log --graph --oneline | cat
* 4dadb0a Merge remote-tracking branch 'copy/master'
|\
| * bb2fc85 G
| * be88bc5 F
| * 0816baf E
* | 1532332 D
* | 90903c0 C
|/
* 95b0fc8 B
* e9de90c Commit A