在我们的项目中,有人拿了一份代码。他们在他们的目录中启动了一个新的 git 存储库,并在那里继续他们的工作。与此同时,我们的主要项目存储库的工作也在继续。我们现在只剩下两个没有通用 SHA1 的 git 存储库。
A --- B --- C --- D
|
| Copy of code to new directory
|
E --- F --- G
B 和 E 是完全相同的文件、文件夹等。
我们的目标是使用 Git 将更改 F 和 G merge 到主分支(目前在 D)
最佳答案
首先,我将重新绘制您的图表。
A --- B --- C --- D master E --- F --- G copy
Let's first put both of these in the same repo. There are no special steps to this, you just git fetch
both into the same repository.
Then you create a graft. Edit .git/info/grafts
...
<E-sha1> <B-sha1>
然后运行 git filter-branch
使其永久化。
git filter-branch --tag-name-filter cat -- --all
这将创建一个新的历史,“正确的”历史:
A --- B --- C --- D master \ E --- F --- G copy
之后,你就可以 merge 了。
实际演示
我创建了两个与图表匹配的存储库,从提交 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 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
如果现在 merge 会怎样?
我遇到了 merge 冲突,我宁愿自动解决。
$ 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
关于git - 使用 git merge 两个具有共同父级的目录(但 SHA1 不同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14253594/