今天在帮一个朋友解决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 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/不相关
有一个新特性(从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.18 Q2 2018)可以将其提取到它自己的新的孤儿分支中,因为“Git rebase -i——root”的实现已经更新为使用
音序器机械较多。
该排序器现在允许将提交图的整个拓扑移植到其他地方。
参见Johannes Schindelin (dscho)的commit 8fa6eea, commit 9c85a1c, commit ebddf39, commit 21d0764, commit d87d48b, commit ba97aea(2018年5月3日)。
(由Junio C Hamano—gitster—在commit c5aa4bc中合并,2018年5月30日)
Sequencer:允许引入新的根提交
在新的——rebase-merges模式的背景下,它被设计成
特别是允许更改现有的分支拓扑结构
一般情况下,用户可能希望将提交提取到一个全新的
以新创建的根提交开始的分支。
现在可以通过在前面插入命令reset [new 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]不是(一部分)有效的引用名称:都是开括号
以及空间是非法的参考名称。