从上游合并,没有上游历史

时间:2015-03-17 01:00:04

标签: git version-control merge

我有一个包含我的项目的父回购,以及一个基于该项目的子回购。

父回购已标记版本,子回购基于其中一个标记。例如:

parent v1.0---v2.0---v3.0
                \
                 child---[changes]

不幸的是,在创建子repo时,父历史记录被删除,并且从头开始添加文件重新初始化repo。所以这意味着没有父repo的历史包含在子repo中,而是在开始时提交一个提示,表明它基于父的v2.0标记,其中所有的v2.0文件都是git add ed

有没有办法使用Git将上游更改从父级(例如.v3.0标记)合并回子级,尽管没有父级历史记录?

git pull告诉我没有常见的提交,所以我不知道从哪里开始合并。我是否需要重写孩子的历史记录以添加父母的历史记录?

显然这是一个奇怪的场景,而不是我将来允许的场景:)

1 个答案:

答案 0 :(得分:0)

然后我建议你重写儿童回购的历史,以便从v2.0向后完整的历史记录。

我假设在两个回购中都将分支称为master

首先,我们为父级仓库添加一个遥控器并获取它

$ cd /path/to/child/repo
$ git remote add origin <url_or_path_for_parent_repo>
$ git fetch origin

然后你会找到v2.0标签的sha(具有完整历史记录的标签):

$ git rev-parse v2.0
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

master分支中第一次提交的sha,即整个v2.0历史记录压缩成一次提交的那个:

$ git checkout master
$ git log --reverse --format=format:%H | head -n 1
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

然后,我们重写master分支以将父bbbbb ..交换到aaaaa ...(请在下面的命令中用命令的实际结果替换bbbbb ...和aaaaa ...字符串以上)

$ git filter-branch --parent-filter 'read p ; if [ "$p" = "-p bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" ]; then echo "-p aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" ; else echo "$p" ; fi'
Rewrite cccccccccccccccccccccccccccccccccccccccc (d/d)
Ref 'refs/heads/master' was rewritten

在此之后,您的master分支现在应该已使用v2.0标记的历史记录替换了第一个压缩的提交。

如果出现问题,您可以将master分支恢复为原始状态:

$ git reset --hard original/refs/heads/master

在您验证结果并感到满意之后,您可以通过以下方式摆脱original/refs/heads/master备份分支:

$ git update-ref -d refs/original/refs/heads/master

在此之后,您将能够以正常方式将v3.0标记合并到您的子仓库的master分支中。