git - 使用 git merge 两个具有共同父级的目录(但 SHA1 不同)

标签 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 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/

相关文章:

git - 如何使用其他用户凭据撤消对 GitHub 的意外推送

python - 在Python中将一个数据框中的列添加到分组数据框中

git - 如何在使用 git merge 时将 "fast forward"设置为默认值

git - 使 "Refreshing a repository after changing line endings"工作

gitignore:忽略文件不工作 cakephp

merge - 在 common lisp 中合并符号

svn - "The last merge operation tried to add the file ' x.cs' but the file was returned in theworking copy."是什么意思?

git - 在 git merge 期间,如何查看正在 merge 的提交

恢复 merge 提交后,git lab 未显示分支差异

git - 如何通过他们的 API 重命名 GitHub 存储库?