将没有root的分支推送到新存储库

时间:2017-12-28 08:48:18

标签: git

想象一下,我有主分支。一旦创建了新分支。现在我想将此分支准确地移动到新的存储库,而不会在创建此分支之前提交注释。

照片: 1.旧存储库

newbranch    C - D - E
            /
master A - B

图片:2。新存储库

newbranch     C - D - E
             /
master      Z

我不需要移动newbranch,我尝试了它,但它花了所有以前的历史。 我也熟悉可以帮助我删除提交的rebase。 但关键是我不希望在我的新回购中看到超过1000个提交。我无法在rebase模式下手动删除它。

我只需要向人们展示这个新分支 - 在这个分支中做了什么,但不是预先提交的。

非常感谢您的回复!

1 个答案:

答案 0 :(得分:0)

您至少可以在新的仓库中创建一个孤儿分支。 (git checkout --orphan),并在其中进行一次虚拟提交 或者只是从Z创建一个新分支(仍在新的仓库中)

这假设您在当地克隆了旧的仓库 并且您已经在本地创建了一个新的仓库。

cd c:\a\path
git init create newrepo
cd newrepo.

首先,确保您的旧仓库在B处签出(即SHA1代表分支前的提交)

cd C:\path\to\old\repo
git checkout B

然后将该内容导入新的空仓库

cd C:\a\path\newrepo
git --work-tree=C:\path\to\old\repo add .
git commit -m "Import old repo as Z"

您可以在新的仓库中获取旧的仓库,并在新分支上重新提交您的提交。

cd C:\a\path\newrepo
git remote add oldrepo C:\path\to\old\repo
git fetch oldrepo

git checkout -b newbranch

git rebase --onto newbranch C~ oldrepo/newbranch

这将仅重新创建您在新回购中提交的提交。

但是:rebase可能有问题,并且有很多merge conflicts to be resolved manually

在您的情况下,您可以完全避免使用 git replace ,或者在您的情况git graft points中,如in this example所示。 按照过去的说明进行git fetch oldrepo步骤,然后:

git fetch oldrepo
git checkout -b newbranch oldrepo/newbranch
echo SHA1(C) SHA1(Z) > .git/info/grafts

(将SHA1(xxx)替换为提交xxx的SHA1。Z是新回购中的新提交,C是您newbranch的第一次提交1}}在旧的回购中)

这会将Z声明为C的父提交(此处不需要合并/转换)。
要使其永久化,请使用git filter-branch

git filter-branch --tag-name-filter cat -- newbranch
rm .git/info/grafts

然后,您可以推送新的重新分支。

git remote add origin /url/of/new/remote/repo

git push -u origin master
git push -u origin newbranch