今天在帮一个朋友解决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。是否有更简单的方法来创建 新的分支,与发生的一切完全无关 到目前为止在存储库中?


当前回答

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

其他回答

创建一个单独的存储库对我来说效果很好。不用担心<start_point>。

在其他地方创建一个新的空回购。 将master分支重命名为master以外的任何分支,即gh-pages 开始你的孤儿工作吧。 将您的工作提交到新存储库中的唯一分支。 将新分支推到包含原始主分支的同一个远程回购。

此方法已在:

https://gitlab.com/tortoisegit/tortoisegit/-/issues/1090#note_77403778 https://gist.github.com/chrisjacob/1086274/382ef1ccc22b57b9b1f0e3a362b39e806b9ba04c

有一个新特性(从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版本中,至少是2.27,这可以通过switch命令干净地实现:

git switch --orphan <new-branch>

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

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

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"

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

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

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