在git中,是否有一种将不相关的分支引入到存储库的简单方法?

在今天帮助一个有git问题的朋友的时候,我不得不介绍一个需要与master分支完全分离的分支。 这个分支的内容与master分支的内容有所不同,但是稍后他们将被合并到master分支中。

我记得从底层阅读John Wiegley的Git,分支本质上是一个标签,它遵循一定的约定,以及如何将一个提交与一个文件树以及可选的父提交绑定在一起。 我们使用git的pipe道创build了一个无父母的提交到现有的仓库:

所以我们摆脱了索引中的所有文件…

 $ git rm -rf . 

从tarball提取目录和文件,将其添加到索引…

 $ git add . 

…并创build一个树对象…

 $ git write-tree 

git-write-tree告诉我们创build的树对象的sha1sum。)

然后,我们提交了树,没有指定父提交…

 $ echo "Imported project foo" | git commit-tree $TREE 

git-commit-tree告诉我们创build的提交对象的sha1sum。)

…并创build一个新的分支,指向我们新创build的提交。

 $ git update-ref refs/heads/other-branch $COMMIT 

最后,我们返回到master分支继续在那里工作。

 $ git checkout -f master 

这似乎按计划运作。 但是,这显然不是我推荐给那些刚开始使用git的程序的一种程序。 有没有一种更容易的方式来创build一个新的分支,这是迄今为止与库中发生的一切无关的?

有一个新的特性(从V1.7.2开始),使得这个任务比任何其他答案都要高一点。

git checkout现在支持--orphan选项。 从手册页 :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

创build一个名为<new_branch>的新的孤立分支,从<start_point>开始并切换到它。 在这个新的分支上做的第一次提交将没有父母,这将是一个新的历史与所有其他分支和提交完全断开的根源。

这并不完全符合提问者的要求,因为它从<start_point>填充索引和工作树(因为这毕竟是一个checkout命令)。 唯一需要的其他操作是从工作树和索引中删除任何不需要的项目。 不幸的是, git reset --hard不起作用,但是git rm -rf . 可以用来代替(我相信这相当于rm .git/index; git clean -fdx在其他答案中给出的rm .git/index; git clean -fdx )。


综上所述:

 git checkout --orphan newbranch git rm -rf . <do work> git add your files git commit -m 'Initial commit' 

我没有指定<start_point>因为它默认为HEAD,我们也不太在意。 这个序列与Artem的答案中的命令序列基本上是一样的 ,只是没有诉诸可怕的pipe道命令。

从Git社区书 :

 git symbolic-ref HEAD refs/heads/newbranch rm .git/index git clean -fdx <do work> git add your files git commit -m 'Initial commit' 

尽pipe使用git symbolic-ref和删除索引的解决scheme起作用,但创build新的存储库在概念上可能更为简洁

 $ cd /path/to/unrelated $ git init [edit and add files] $ git add . $ git commit -m "Initial commit of unrelated" [master (root-commit) 2a665f6] Initial commit of unrelated 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 foo 

然后从中获取

 $ cd /path/to/repo $ git fetch /path/to/unrelated master:unrelated-branch warning: no common commits remote: Counting objects: 3, done. Unpacking objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) From /path/to/unrelated * [new branch] master -> unrelated-branch 

现在你可以删除/path/到/无关

Github有一个名为Project Pages的特性,你可以在你的项目中创build一个特定的分支来提供Github提供的文件。 他们的指示如下:

 $ cd /path/to/fancypants $ git symbolic-ref HEAD refs/heads/gh-pages $ rm .git/index $ git clean -fdx 

从那里你有一个空的存储库,然后你可以添加你的新内容。

目前select的答案是正确的,我只是巧合地添加…

实际上,这正是github.com让用户通过一个叫做gh-pages的孤立分支来创buildGithub页面来完成他们的回购。 漂亮的步骤在这里给出并解释:

https://help.github.com/articles/creating-project-pages-manually

希望这可以帮助!

有时我只想立即在项目中创build空分支然后开始工作,我只是执行下面的命令:

 git checkout --orphan unrelated.branch.name git rm --cached -r . echo "init unrelated branch" > README.md git add README.md git commit -m "init unrelated branch" 

http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branchesfind这个脚本,它工作的很好!;

 #!/bin/bash set -e if test -z "$2" -o -n "$3"; then echo "usage: $0 REPO BRANCHNAME" >&2 exit 1 fi repo=$1 branch=$2 git fetch "$repo" "$branch" head=$(git rev-parse HEAD) fetched=$(git rev-parse FETCH_HEAD) headref=$(git rev-parse --symbolic-full-name HEAD) git checkout $fetched . tree=$(git write-tree) newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched) git update-ref $headref $newhead $head git reset --hard $headref