想象一下,我有主分支。一旦创建了新分支。现在,我想将此分支准确地移动到新的存储库,而不会在创建此分支之前提交注释。
图片:1。旧存储库
newbranch C - D - E
/
master A - B
图片:2。新的存储库
newbranch C - D - E
/
master Z
我不需要移动newbranch,我尝试了它,但它花了所有以前的历史。我也熟悉可以帮助我删除提交的rebase。但关键是我不希望在我的新回购中看到超过1000个提交。我无法在rebase模式下手动删除它。
我只需要向人们展示这个新分支 - 在这个分支期间所做的是什么,而不是先前的承诺。
非常感谢您的回复!
你至少可以在新的仓库中创建一个孤儿分支。 (git checkout --orphan
),并在其中进行一次虚拟提交。
或者只是从Z
创建一个新分支(仍在您的新回购中)
这假设您在本地克隆了旧的repo。 并且您已经在本地创建了一个新的仓库。
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"
您可以在新的repo中获取旧的repo,并在新的分支上重新提交您的提交。
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
的第一次提交)
这将声明Z
作为C
的父提交(此处不需要合并/ rebase)。
要使其永久化,请使用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