2009-09-05 27 views
270

在今天帮助一个有git问题的朋友时,我不得不介绍一个 分支,它需要与master分支完全分开。 这个分支的内容确实与0123xx分支上开发的 有不同的起源,但它们将在以后合并到master分支中,并将被合并为 。在git中,是否有一种将不相关的分支引入到存储库的简单方法?

我从阅读想起约翰Wiegley的Git from the bottom up如何 分支机构基本上是一个标签提交遵循一定的 惯例以及如何提交绑定到文件的树和可选 父提交。我们去创造一个无父无母使用Git的管道提交到 现有资源库:

所以我们摆脱索引中的所有文件......从压缩包

$ git rm -rf . 

...提取的目录和文件,加入那些到 指数...

$ git add . 

...并创建了一个树对象...

$ git write-tree 

git-write-tree告诉我们创建的树对象的SHA1SUM。)

然后,我们犯了树,没有指定父犯...

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

git-commit-tree告诉了我们创造的SHA1SUM提交对象。)

...并创建了一个新分支,指向我们新创建的 提交。

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

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

$ git checkout -f master 

这似乎按计划运作。但是,这显然不是那种我会推荐给刚开始使用git的人 的那种程序 。 有没有更简单的方法来创建一个 新的分支,这与库中到目前为止发生的所有事情都完全无关?

回答

420

有一个新特性(自V1.7.2起)使得这个任务比任何其他答案都要高一点。

git checkout现在支持--orphan选项。从man page

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

创建一个新的孤儿分支,命名为 <new_branch>,从 <start_point>启动并切换到它。 第一次提交在这个新分支 将没有父母,它将是 一个新的历史记录的根,总共 断开所有其他 分支和提交。

这并不做正是提问者想要的东西,因为它填充索引和<start_point>工作树(因为这毕竟,检出命令)。唯一需要的其他操作是从工作树和索引中删除任何不需要的项目。不幸的是,git reset --hard不起作用,但可以用git rm -rf .代替(我相信这相当于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's answer中的命令顺序基本相同,只是不诉诸可怕的管道命令。

+19

注意:这个特性是在git 1.7.2中添加的 – Matthew 2011-02-11 01:26:59

+0

你知道是否有可能创建一个孤立分支,当你从另一个“树”中签出任何分支时,它保持可见状态? – JJD 2011-06-07 16:38:22

+1

@JJD:我想你想要的是git merge。 '(git checkout master && git merge --no-commit“orphan-branch”)'一些类似的技巧可以使用git-reset或者使用索引来工作。但这取决于您所需的工作流程。 – phord 2011-09-29 23:40:56

30

Git Community Book

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

这是一个伟大的答案。 – gahooa 2009-09-05 22:00:15

+1

下一个答案是现代版本的git更好。 – kikito 2012-04-03 21:50:07

+10

@kikito:回复:“下一个答案是更好的”......这里的排序是不稳定的。你可以添加一个链接指向你认为是更好的答案。 – 2014-01-08 16:09:00

12

Github有一个叫做Project Pages功能,您可以在项目中创建一个特定命名的分支提供将通过Github的送达文件。他们的说明如下:

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

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

21

虽然与git symbolic-ref和删除索引工作的解决方案,它可能是概念清洁创建

$ 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 

现在你可以删除/路径/到/无关

+0

在我看来,一个干净的概念会涉及'git branch'或'git checkout'选项。我很高兴git使这种东西成为可能,但为什么不能更容易呢? – hillu 2009-09-06 12:05:13

+3

因为它是,而且应该是一件罕见的事情。如果你有不相关的事物分支,它通常属于不相关的存储库,而不是将其填入现有的存储库(尽管有例外)。 – 2009-09-06 13:05:02

+1

+1。对于其他git新手,你显然可以通过'git branch'列出分支,并通过'git checkout BRANCH_NAME'在它们之间切换。 – akavel 2011-12-14 10:08:23

0

发现硫在http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches的脚本,它工作得很好!

#!/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 
+1

我相信使用'git fetch $ REMOTE $ REMOTE_BRANCH:$ LOCAL_BRANCH'可以达到同样的效果。我错过了什么吗? – hillu 2010-08-25 06:41:57

2

有时候,我只是想创建项目空分公司立即然后开始做的工作,我只是将EXCUTE以下命令:

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