我正在从我的主分支开始一个新分支。但我不希望新分支上的全部历史。我希望只有 1 个提交来启动分支。
我创建了新分支并尝试重新设置所有提交,但它不起作用,因为我没有以前的提交。我不明白“先前提交”的东西......
也许压缩提交会更好。但是我的新分支在创建时已经与主分支合并。
我不知道该怎么做。你有想法吗?
您可以使用一点管道来做到这一点:
tree=$(git log -1 --format=%T master)
commit=$(git commit-tree $tree -m "initial commit")
git checkout -b new_branch $commit
解释:
仅从当前提交中提取树(数据)master
,因为这是您真正感兴趣的内容。树对象的 SHA1 由 打印git log -1 --format=%T
,并保存到$tree
从没有父级的树中创建一个提交。这是通过管道命令完成的,该命令git commit-tree
接受一个树对象和一个提交消息,并创建一个提交对象。它通常也需要父提交,但在这种情况下,我们不想要父提交,所以我们不给。该命令输出结果提交的 SHA1,我们将其保存到$commit
.
第三步,也是最简单的一步,是以新的提交为起点创建一个分支,使用通常的git checkout -b
.
编辑:执行此操作的更简单的方法是使用git checkout --orphan new_branch master
后跟git commit -m "Initial commit"
,结果完全相同。我将上述解释用于教育目的,因为研究它教会了我一些关于 git 的细节。另外,请注意 git 之所以难以做到这一点是有原因的——强烈鼓励进行历史跟踪——所以如果你这样做,一定要有充分的理由。
如我所见,您不了解分支是什么。分支只是指向提交的指针。当您从 master 创建一个分支时,您不会创建任何提交,新分支只是指向与 master 完全相同的提交,它们都表示相同。所以,还没有什么可以压缩或变基,也没有历史。
只有在您做了一些更改并将它们提交到分支上之后,您的问题才会有意义:如何将分支中所做的所有更改作为一个提交合并到 master 中?只需使用git merge --squash branch
.