我开始从我的主分支一个新的分支。但我不想要新的分支上的整个历史。我想只有1个提交开始分支。挤压或垫底,而分支
我创建了新的分支,并试图重订的所有提交,但因为我没有以前提交它不工作。我不明白的东西“以前的承诺” ...
也许会更好压垮提交。但是我的新分支在创建时已经与主人合并了。
我不知道该怎么做。你有好主意吗?
我开始从我的主分支一个新的分支。但我不想要新的分支上的整个历史。我想只有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使得这很难做 - 历史跟踪受到高度鼓励 - 所以如果你这样做,一定要有一个很好的理由。
它实际上是很容易:'git的更新裁判-d $(GIT象征-REF HEAD); git commit -m'非常糟糕的主意' – fork0
谢谢;同时我还发现了'git checkout --orphan',这看起来明显是为这种事情设计的。 – user4815162342
'git checkout --orphan new_branch master'是解决方案。但是这种行为有点奇怪。在我执行初始提交之前,我没有看到新的分支。初始提交后,新的分支是可见的,我的bash表明正确的当前分支。 – Franck
当我看到你不明白一个分支是什么。一个分支只是一个指向提交的指针。当你从master创建一个分支时,你不会创建任何提交,新分支只是指向与master相同的提交,它们都表示相同。所以,没有任何东西可以挤压或变硬,而且还没有历史。
你做一些修改,并提交它们在树枝上只有后,那么你的问题会使感:如何合并作为一个提交到主分支的所有更改?只需使用git merge --squash branch
即可。
他可能不知道git分支是什么,但很明显,他不希望'git log'显示所有以前的提交历史记录,这会在正常的git分支中发生。换句话说,他想做类似于将主分支的树导入由'git init'创建的新回购的类似事物。除了他希望能够继续与其他分支和对象进行回购合作。 – user4815162342
@ user4815162342:坦率地说,我不确定这是他想要的。这是一种先进的使用方法_ – fork0
它对您和我都很重要,但可能不适用于OP。想象一下,有一堆线性历史记录的回购测试提交。完成之后,您想要将所有这些都压缩到一个“初始”提交中,从中您将开始真正的工作。 'git rebase -i'似乎完全有能力完成这项工作,除了它不能从历史上第一次提交开始的小麻烦之外,因为不能从头开始提供理论上的承诺!所以人们觉得这个愚蠢的初始提交会“卡住”,唯一的选择是创建一个全新的回购。 – user4815162342
对不起,我不能这样做...... – Franck