如何创build一个新的(和空的!)“根”分支?
我想在这个git仓库中定义一个新的“root”分支。 我所说的“根”分支是指完全独立于存储库1中所有其他分支的分支。
不幸的是,甚至在repo的commit树的底部提交(我们称之为A
)包含了很多文件(这是一个已经在相当成熟的项目上初始化的仓库)。
这意味着,即使我将A
作为新分支的<start-point>
,这个新分支也不会从“clean slate”开始,而是包含所有在A
中提交的文件。
有什么办法可以在这个仓库中创build一个完全裸分支,并且尽可能的接近A
<start-point>
?
1顺便说一句,这不等于创build一个新的回购。 由于很多原因,单独的回购将不太方便。
编辑 :好的,这是我做的,基于vcsjones的答案:
# save rev of the current earliest commit OLDBASE=$(git rev-list --max-parents=0 HEAD) # create a new orphan branch and switch to it git checkout --orphan newbranch # make sure it's empty git rm -rf . # create a new empty commit in the new branch, and # save its rev in NEWBASE git commit --allow-empty -m 'base commit (empty)' NEWBASE=$(git rev-list HEAD) # specify $NEWBASE as the new parent for $OLDBASE, and # run filter-branch on the original branch echo "$OLDBASE $NEWBASE" > .git/info/grafts git checkout master git filter-branch # NOTE: this assumes that the original repo had only one # branch; if not, a git-filter-branch -f <branch> command # need to be run for each additional branch. rm .git/info/grafts
虽然这个过程有一点涉及,但最终的结果是一个空的基本提交,可以作为任何新的“clean-slate分支”的<start-point>
; 所有我需要做的是
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
将来我会一直创build像这样的新库:
git init git commit --allow-empty -m 'base commit (empty)'
…所以第一次提交是空的 ,并始终可用于启动一个新的独立分支。 (我知道,这是一个很less需要的设施,但是很容易就可以使用。
创build分支时使用--orphan
:
git checkout --orphan YourBranchName
这将创build一个新的分支零提交,但所有的文件将上演。 在这一点上,你可以删除它们。
(“删除它们”: git reset --hard
会清空索引,留下一个空的工作树)
看看关于–orphan的更多信息,请查看man page 。
添加到被接受的答案 – 恢复到清理状态的最佳做法是创build一个初始的空提交,以便您可以轻松地重新设置分支机构为子孙后代。 另外,因为你想要一个干净的状态,你可能已经提交了你不应该的文件,所以你必须从索引中删除它们。 考虑到这些,你应该:
$ git checkout --orphan dev2 Switched to a new branch 'dev2' $ git reset # unstage all the files, you probably don't want to commit all of them $ git commit --allow-empty -m 'Initial empty commit' [dev2 (root-commit) a515c28] Initial empty commit