2013-02-22 125 views
93

我想在这个git仓库中定义一个新的“根”分支。通过“根”分支,我指的是完全独立于存储库中的所有其他分支的分支。如何创建一个新的(和空的!)“根”分支?

不幸的是,即使是提交(我们称之为A)在repo的提交树的底部也包含很多文件(这是一个已经在相当成熟的项目上初始化的存储库)。

这意味着即使我将A作为新分支的<start-point>,这个新分支不会从“干净的标准”开始,而是它将包含所有在A中提交的文件。

是否有某种方法可以在此存储库中创建一个完全裸分支,<start-point>尽可能接近A


顺便说一句,这是等效于创建一个新的回购。由于很多原因,单独的回购将不太方便。


编辑:OK,这是我做的,基于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 

虽然这个过程是参与了一下,最终的结果是基本提交可以作为<start-point>用于任何新的“clean-slate分支”;所有我需要做的就是

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD) 

今后我会一直创造新的存储库这样的:

git init 
git commit --allow-empty -m 'base commit (empty)' 

......从而使第一承诺是,始终可用于启动一个新的独立分支。 (这将是的,我知道,一个很少需要的设施,但它是相当费力,使其随时可用。)

+0

重复的http://stackoverflow.com/questions/13969050/how-to-create-a-new-empty-branch-for-a-new-project – Anonymoose 2013-11-04 04:52:22

+1

@ Anonymoose:只是为了记录(而不是辩论):我不同意你的看法。 – kjo 2013-11-04 15:54:59

+1

似乎有一个更简单的解决方案基于'git rebase --onto',请参阅http://stackoverflow.com/questions/645450/insert-a-commit-before-the-root-commit-in-git – 2015-11-11 21:47:50

回答

151

创建分支时,使用--orphan

git checkout --orphan YourBranchName 

这将创建一个新的分支上没有提交,但是所有的文件都会上传。在这一点上,你可以删除它们。
(“删除”:一个git reset --hard将清空索引,让你有一个空的工作树)

看看在man page结帐关于--orphan更多信息。

+0

这实质上是创造一个空白的石板吗?从头开始?还是它保留了以前的所有更改,但只是不在git历史记录中? – 2016-07-22 02:58:29

+1

@ConAntonakos这将创建一个没有父母的新分支。其他分支不受影响,所有更改都保留。 – fuz 2016-10-15 19:14:20

1

要添加到接受的答案 - best practice恢复到清洁状态是创建an initial empty commit,所以你可以很容易地设置分支为后代rebase。另外,既然你想要一个干净的状态,你可能已经提交了你不应该的文件,所以你必须从索引中删除它们。有了这些考虑,你应该:

$ 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 
相关问题