git将两个存储库合并为一个新存储库,一个应该是一个分支

时间:2017-09-08 10:16:53

标签: git merge repository branch visual-sourcesafe

我想一起带到存储库,但第二个存储库应该进入分支

A - B - C - D -  E -  F - G - H Repo1

           A1 - B1 - C1 Repo2

Crete new repo reponew

git init reponew

添加遥控器并获取旧回购Repo1

git remote add -f Repo1 ..\..\output\Repo1

将Repo1 / master中的文件合并到new / master

git merge Repo1/master --allow-unrelated-histories

新的存储库reponew如下所示:

A - B - C - D -  E -  F - G - H master

现在我在特定提交和结帐时创建了一个新分支

git branch branchX 200303b0b215cc0fb2d92f50ffc9d7df8bbaab74
git checkout branchX

添加遥控器并获取旧回购Repo1

git remote add -f Repo2 ..\..\output\Repo2

将Repo1 / master中的文件合并到new / master

git merge -Xtheirs Repo2/master --allow-unrelated-histories

现在新的存储库repnew看起来像这样:

                 A1 - B1 - C1 branchX
                                     \
A - B - C  - - - - - - - - - - - - - -
          \
           D - E - - - - - F - G - H master

看起来这是由合并请求引起的,合并请求的合并日期为

但是我觉得它看起来像这样:

A - B - C - D - E - - - - - F - G - H master
          \
            - - - A1 - B1 - C1 branchX

2 个答案:

答案 0 :(得分:3)

“移动”提交现有历史记录 AFTER 的主要方法是使用rebase。合并只能添加两个历史记录作为父项的新提交 但是rebase不会真正移动提交者,而是在指定的onto之后重放它们。因此,如果旧提交中仍有引用(分支或标记),则它们将在整个提交历史记录中保持可用。

在您的情况下,您希望将Repo2/master的历史记录重新定义到提交C

所以解决方案是:

git branch branchX --no-track Repo2/master
git rebase -Xtheirs 200303b0b215cc0fb2d92f50ffc9d7df8bbaab74 branchX

你应该得到你想要的结果。

@torek建议,还有filter-branchfilter-branch允许您通过对每个重写的提交应用过滤器来重写提交历史记录。它主要用于删除错误提交的敏感数据(如密码),从历史记录中删除大文件,或更改存储库的根文件夹。 filter-branch的优点是它也会移动标签 它还将使用空消息过滤提交。

使用filter-branch,有--parent-filter允许您在过滤时更改提交的父级。
它会过滤列出的所有引用,因此要移动代码,我们必须列出当前branchX中的所有代码:git tag --merged branchX,然后按--tag-name-filter cat原样过滤它们。

所以命令将是:

git branch branchX --no-track Repo2/master
git filter-branch \
    --parent-filter 'test $GIT_COMMIT = <FULL-commit-id-of-A1> && echo "-p 200303b0b215cc0fb2d92f50ffc9d7df8bbaab74" || cat' \
    --tag-name-filter cat \
    -- branchX $(git tag --merged branchX)

然后你将获得重写的历史记录,但仍然是旧版的历史记录,前缀为refs/original/

如果没问题,您可以删除原始引用(rm -rf .git/refs/original/),否则可以恢复它们(cp -r .git/refs/original/refs .git && rm -rf .git/refs/original/)。

答案 1 :(得分:0)

好的,我将我的默认提交消息更改为vss2git,因此每次使用此消息时都是如此。

但如果我选择显示所有分支,则回购看起来像:

             A1 - B1 - C1 Repo2

A - B - C  - - - - - - - - - - - - - A1' - B1' - C1' branchX
          \
           D - E - - - - - F - G - H master

我只看到C1上的标签,没有标签添加到C1&#39;,任何想法?所有其他标签都很好,就像在C E或G上一样。