在分支时挤压或重新定位

时间:2012-09-12 15:35:39

标签: git rebase squash

我从我的主分公司开始一个新的分支。但我不希望新分支上的整个历史。我想只有1个提交启动分支。

我已经创建了新的分支并尝试重新设置所有提交但由于我没有先前的提交它不起作用。我不明白“先前的提交”......

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

我不知道该怎么做。你有什么想法吗?

2 个答案:

答案 0 :(得分: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完成。

  4. 编辑:更简单的方法是使用git checkout --orphan new_branch master后跟git commit -m "Initial commit",结果完全相同。我将上述解释留给教育目的,因为研究它教会了我一些关于git的细节。另外,请注意git使得这很难做到 - 有很大的历史追踪 - 所以如果你这样做,一定要有充分的理由。

答案 1 :(得分:1)

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

只有在进行了一些更改并在分支上提交它们之后,您的问题才有意义:如何将分支中所做的所有更改合并为一个提交到master中?只需使用git merge --squash branch