我想将存储库带入存储库,但是第二个存储库应该进入分支
A - B - C - D - E - F - G - H Repo1
A1 - B1 - C1 Repo2
克里特
git init reponew
添加一个遥控器并获取旧的repo repo1
git remote add -f Repo1 ....outputRepo1
将文件从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
添加一个遥控器并获取旧的repo repo1
git remote add -f Repo2 ....outputRepo2
将文件从repo1/master合并为new/master
git merge -Xtheirs Repo2/master --allow-unrelated-histories
现在,新的存储库收益看起来像这样:
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
在之后,"移动"提交的主要方法是使用rebase
。合并只能在两个历史中添加新的提交。
但是rebase
并不能真正移动Commist,而是在指定的onto
之后重播它们。因此,如果在旧提交中仍然有参考(分支或标签),它们将在整个提交历史记录中可用。
在您的情况下,您想将Repo2/master
的历史记录到提交C
。
所以解决方案是:
git branch branchX --no-track Repo2/master
git rebase -Xtheirs 200303b0b215cc0fb2d92f50ffc9d7df8bbaab74 branchX
您应该得到想要的结果。
@Torek建议,也有filter-branch
。 filter-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/
)。