今天在帮一个朋友解决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回答中的命令序列相同,只是没有使用可怕的管道命令。