2012-09-12 28 views
0

我开始从我的主分支一个新的分支。但我不想要新的分支上的整个历史。我想只有1个提交开始分支。挤压或垫底,而分支

我创建了新的分支,并试图重订的所有提交,但因为我没有以前提交它不工作。我不明白的东西“以前的承诺” ...

也许会更好压垮提交。但是我的新分支在创建时已经与主人合并了。

我不知道该怎么做。你有好主意吗?

+0

对不起,我不能这样做...... – Franck

回答

2

你可以做,使用一个小水管:

tree=$(git log -1 --format=%T master) 
commit=$(git commit-tree $tree -m "initial commit") 
git checkout -b new_branch $commit 

说明:

  1. 只提取树(数据)从目前提交的master,因为那是你真正感兴趣。树目标的SHA1打印git log -1 --format=%T,并保存到$tree

  2. 创建通讯它没有父母的那棵树。这是通过管道命令git commit-tree完成的,该命令采用树对象和提交消息,并创建一个提交对象。它通常也需要父提交,但在这种情况下,我们不需要父代,所以我们不提供一个。该命令输出结果提交的SHA1,我们将其保存到$commit

  3. 第三个最简单的步骤是创建一个新的提交作为起点的分支,用通常的git checkout -b完成。

编辑:一个更简单的方式做到这一点是使用git checkout --orphan new_branch master之后git commit -m "Initial commit",用完全相同的结果。我为了教育目的而离开了上述解释,因为研究它教给我一些关于git的细节。另外,请注意,git使得这很难做 - 历史跟踪受到高度鼓励 - 所以如果你这样做,一定要有一个很好的理由。

+1

它实际上是很容易:'git的更新裁判-d $(GIT象征-REF HEAD); git commit -m'非常糟糕的主意' – fork0

+1

谢谢;同时我还发现了'git checkout --orphan',这看起来明显是为这种事情设计的。 – user4815162342

+0

'git checkout --orphan new_branch master'是解决方案。但是这种行为有点奇怪。在我执行初始提交之前,我没有看到新的分支。初始提交后,新的分支是可见的,我的bash表明正确的当前分支。 – Franck

1

当我看到你不明白一个分支是什么。一个分支只是一个指向提交的指针。当你从master创建一个分支时,你不会创建任何提交,新分支只是指向与master相同的提交,它们都表示相同。所以,没有任何东西可以挤压或变硬,而且还没有历史。

你做一些修改,并提交它们在树枝上只有后,那么你的问题会使感:如何合并作为一个提交到主分支的所有更改?只需使用git merge --squash branch即可。

+1

他可能不知道git分支是什么,但很明显,他不希望'git log'显示所有以前的提交历史记录,这会在正常的git分支中发生。换句话说,他想做类似于将主分支的树导入由'git init'创建的新回购的类似事物。除了他希望能够继续与其他分支和对象进行回购合作。 – user4815162342

+0

@ user4815162342:坦率地说,我不确定这是他想要的。这是一种先进的使用方法_ – fork0

+0

它对您和我都很重要,但可能不适用于OP。想象一下,有一堆线性历史记录的回购测试提交。完成之后,您想要将所有这些都压缩到一个“初始”提交中,从中您将开始真正的工作。 'git rebase -i'似乎完全有能力完成这项工作,除了它不能从历史上第一次提交开始的小麻烦之外,因为不能从头开始提供理论上的承诺!所以人们觉得这个愚蠢的初始提交会“卡住”,唯一的选择是创建一个全新的回购。 – user4815162342