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

时间:2009-09-05 21:41:46

标签: git branch

今天帮助一个有git问题的朋友,我不得不介绍一个 需要与master分支完全分离的分支。 这个分支的内容真的与什么不同 已在master分支上开发,但它们将成为。{1}}分支 稍后合并到master分支。

我记得约翰威格利的Git from the bottom up怎么样 分支本质上是一个遵循某个特定的提交的标签 约定以及如何将提交绑定到文件树,并且可选 到父提交。我们去创建一个无父对象的提交 使用git管道的现有存储库:

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

$ git rm -rf .

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

$ 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,温和地说。 是否有更简单的方法来创建 新的分支与发生的一切完全无关 到目前为止在存储库中?

10 个答案:

答案 0 :(得分:470)

有一项新功能(自V1.7.2起)使这项任务比任何其他答案都高一些。

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

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

  

创建一个名为的新孤儿分支   &lt; new_branch&gt;,从   &LT; start_point&GT;并切换到它。该   第一次在这个新分支上提交   将没有父母,它将是   完全是新历史的根源   与所有其他人断开连接   分支和提交。

这不是完全提问者想要的,因为它填充了<start_point>的索引和工作树(因为这毕竟是一个checkout命令)。唯一需要的其他操作是从工作树和索引中删除任何不需要的项目。不幸的是,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中的命令序列基本相同,只是没有使用可怕的管道命令。

答案 1 :(得分:31)

来自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'

答案 2 :(得分:22)

虽然使用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

现在你可以删除/ path / to / unrelated

答案 3 :(得分:12)

Github有一个名为Project Pages的功能,您可以在项目中创建一个特定的命名分支,以提供由Github提供的文件。他们的指示如下:

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

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

答案 4 :(得分:8)

当前选择的答案是正确的,我只是巧合地添加......

这实际上就是github.com允许用户通过名为gh-pages的孤立分支为他们的回购创建Github页面的方式。 这里给出并解释了漂亮的步骤:

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

基本上用于设置它的git命令如下:

  1. git checkout --orphan gh-pages(在您的回购中创建一个名为gh-pages的无父分支)
  2. git rm -rf .(从分支工作树中删除所有文件)
  3. rm '.gitignore'(即使是gitignore)
  4. 现在添加网站内容(添加index.html等)并提交并推送。
  5. 利润。
  6. 请注意,您还可以在{2.}}上成为Github用于构建网站的“项目网站”的来源。

    希望这有帮助!

答案 5 :(得分:3)

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

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"

答案 6 :(得分:3)

在最新的Git版本(至少为2.27)中,可以使用switch命令完全实现这一点:

git switch --orphan <new-branch>

官方文档:https://www.git-scm.com/docs/git-switch

答案 7 :(得分: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

答案 8 :(得分:0)

如果您的现有内容已经提交,那么您现在(Git 2.18 Q2 2018)可以将其提取到自己的新孤儿分支中,因为实现了&#34; git rebase -i --root&#34;已更新使用 序列机器更多。

那个音序器现在是allowing to transplant the whole topology of commit graph elsewhere

commit 8fa6eeacommit 9c85a1ccommit ebddf39commit 21d0764commit d87d48bcommit ba97aeaJohannes Schindelin (dscho)(2018年5月3日) 。
(由Junio C Hamano -- gitster --合并于commit c5aa4bc,2018年5月30日)

  

sequencer:允许引入新的root提交

     

在设计的新--rebase-merges模式的上下文中   特别是允许更改现有的分支拓扑   自由地,用户可能希望将提交提取为完全新鲜的   以新创建的根提交开始的分支

     

现在可以通过插入命令reset [new root]来实现   pick想要成为root提交的提交。例如:

reset [new root]
pick 012345 a commit that is about to become a root commit
pick 234567 this commit will have the previous one as parent
  

这与reset命令的其他用法不冲突,因为   [new root]不是(一部分)有效的引用名称:两个开头括号   以及空间在参考名称中是非法的。

答案 9 :(得分:0)

创建一个单独的存储库对我来说很有效。不必担心

  1. 在其他地方创建一个新的空仓库。
  2. 将master分支重命名为master以外的其他名称,即gh-pages
  3. 开始您的孤儿工作。
  4. 将您的工作提交到新存储库中的唯一分支。
  5. 将新分支推送到包含原始master分支的同一远程仓库中。

此方法在以下位置提及:

相关问题