今天在帮一个朋友解决git问题的时候,我不得不介绍一个 需要与主分支完全分离的分支。 这个分支的内容确实有一个不同的起源 已经在主分支上开发了,但它们将是 在稍后的时间合并到主分支。

我记得我读过约翰·威格利的《Git》 了如何 分支本质上是一个跟随某个对象的提交的标签 约定以及如何将提交绑定到文件树和(可选) 提交到父节点。我们去创建一个无父母的承诺 使用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

最后,我们回到主分支继续工作。

$ git checkout -f master

这似乎按计划进行了。但这显然不是那种 我向那些刚开始学习的人推荐的一些程序 委婉地说,使用git。是否有更简单的方法来创建 新的分支,与发生的一切完全无关 到目前为止在存储库中?


当前回答

有一个新特性(从V1.7.2开始)使这个任务比其他答案中的任务更高级一些。

Git签出现在支持——orphan选项。从手册页:

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清洁-fdx给出的其他答案)。


总而言之:

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

我没有指定<start_point>,因为它默认为HEAD,我们并不关心。这个序列本质上与Artem回答中的命令序列相同,只是没有使用可怕的管道命令。

其他回答

尽管使用git symbol -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/不相关

Github有一个叫做项目页面的功能,你可以在你的项目中创建一个特定的命名分支,以提供将由Github提供服务的文件。他们的指示如下:

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

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

有一个新特性(从V1.7.2开始)使这个任务比其他答案中的任务更高级一些。

Git签出现在支持——orphan选项。从手册页:

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清洁-fdx给出的其他答案)。


总而言之:

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

我没有指定<start_point>,因为它默认为HEAD,我们并不关心。这个序列本质上与Artem回答中的命令序列相同,只是没有使用可怕的管道命令。

在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

目前选择的答案是正确的,我想顺便补充一下…

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

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

基本的git命令如下:

Git checkout—孤儿gh-pages(在你的repo上创建一个称为gh-pages的无父分支) Git rm -rf。(从分支工作树中移除任何文件) rm”。Gitignore '(甚至Gitignore) 现在添加网站内容(添加index.html等)并提交和推送。 利润。

注意,你也可以在你的repo指定/docs文件夹作为“项目网站”的来源,Github用来建立网站。

希望这能有所帮助!