在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