如何在Git中创建一个没有父节点的提交?

103

我有一个小项目,在没有任何版本控制软件的情况下进行开发,最终得到了三个不同版本的脚本,每个版本的脚本略有不同。我使用其中一个版本初始化了git仓库,现在我想提交另外两个版本,但是不想与已有的提交记录产生关系。这样,我就可以将这三个版本的脚本看作不同分支的末端,然后进行合并。

我甚至不确定这是否是解决问题的合理方式... 如果您有关于如何按照这种方式操作或者更好的处理这种情况的建议,将不胜感激。


3
你可以创建两个分支并将另外两个版本加入其中,然后在这些分支上进行工作。 - manojlds
3
这被称为“根提交”。 - Mechanical snail
3个回答

173

根据我的评论:

为什么不创建两个分支并将其它两个版本添加到这些分支中,然后再在分支上工作呢?

我认为这也会与 ctcherry 的回答相符。


但是如果你真的想要创建一个与主分支无关的完全不同的“分支”,那么你可以使用 git checkout --orphangit checkout 手册 描述了选项 --orphan 的工作方式:

创建一个新的孤立分支(orphan branch),名为 <new_branch>,从 <start_point> 开始,并切换到该分支。在此新分支上进行的第一次提交将没有父节点,它将成为全新历史记录的根,与所有其他分支和提交完全断开连接。

你可以像这样使用它:

git checkout --orphan version2
git rm -rf .
<add version2 script>
git add your files
git commit -m 'Initial commit for version 2'
如果你的 Git 版本早于 1.7.2(即 git checkout --orphan 命令被引入之前),那么你可以使用来自“创建新的空分支”的备用命令序列,它在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'

6
感谢提到git checkout --orphan,赞成这种方法,即使我的git版本1.7.1还不支持。但是看起来Ubuntu 11.04将包含git 1.7.4,所以我只需要再等待两个星期。 - Paŭlo Ebermann
27
+1是为了解释为什么原帖作者可能需要重新考虑他们的策略,但仍然回答了问题,而不是说“你的方法是错误的”并就此打住。 - Tyler
在执行 git checkout 后,您还可以使用 git reset --hard 命令来移除暂存的文件。 - Thai

1
你可以为每个脚本版本创建一个分支,并将它们提交到这些单独的分支中。然后逐个将它们合并回主分支。这应该会产生你想要的效果。

1
为什么不从一个“空的”仓库开始(例如,只有一个自述文件包含您的问题说明)。然后,您可以执行三次分支,并将不同版本的脚本添加到每个分支中,并单独提交它们。
接下来,您可以通过分支/编辑/提交/合并以良好管理的方式尝试所有选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接