想象一下,我有主分支。一旦创建了新分支。现在我想将此分支准确地移动到新的存储库,而不会在创建此分支之前提交注释。
照片: 1.旧存储库
newbranch C - D - E
/
master A - B
图片:2。新存储库
newbranch C - D - E
/
master Z
我不需要移动newbranch,我尝试了它,但它花了所有以前的历史。 我也熟悉可以帮助我删除提交的rebase。 但关键是我不希望在我的新回购中看到超过1000个提交。我无法在rebase模式下手动删除它。
我只需要向人们展示这个新分支 - 在这个分支中做了什么,但不是预先提交的。
非常感谢您的回复!
答案 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