2010-02-23 169 views
21

由于询问我的最后一个问题which turned out to be about rebasing with GIT,我已经决定我根本不想重新绑定。相反,我想:在没有Rebase的GIT中重做提交历史记录

  1. 分公司
  2. 工作工作工作,检查,并随时
  3. 扔掉所有这些提交的,并假装他们从来没有发生过推(这样一个干净的承诺在工作结束)

我做到这一点目前通过将文件复制到一个新的目录,然后将它们复制回来到一个新的分支(在相同的点作为我的工作分支支),然后合并到这master或其它地方。

这是不是很简单,为什么?更重要的是:有更好的/ GIT的方式来做到这一点?git rebase -i迫使我合并(并挑选和压扁)。

回答

10

您也可以使用git merge--squash选项。

+1

Squash会在每次提交时自动发生,我不明白这对我的问题有什么帮助。并非如此,但我需要更多信息。 –

+2

当我想要将主题分支与主人合并时,我已经使用了'git merge --squash',但同时也将提交历史记录减少为一次提交。 'git merge --squash'执行合并,但让我们在提交合并之前提供一个提交消息。所以最终的结果看起来好像你只向主分支提交过一次。 –

+1

对不起,我花了三年才弄清楚这个答案是正确的。做得好! –

24

最简单的事情就是软重置。

所以检出特性分支:

git checkout -b topic master 

工作,工作,再工作。

git commit 
git commit 
git commit 
git commit 

满足于这一点,你可以在主

git reset --soft master 
git commit 

现在合并掌握的顶新单提交(这将是一个快进)和整理的特性分支。 (请注意,如果您准备记住或标记主人的位置,并且无需分支即可在主人身上工作,则无需执行此操作,您可以刚刚完成git reset --soft old-mastergit commit,并且您不需要这些最后的清理步骤)

git checkout master 
git merge topic 
git branch -d topic 
+4

优秀(+1),但这留下了问题:这是正确的方式(与Git或实际与任何(D)VCS)?所有的逻辑增量步骤都被压缩了,如果在主题提交时存在一些令人讨厌的错误,那么找出并修复这些问题并不容易。 – VonC

+2

@Charles Bailey,谢谢你。 @VonC,这取决于。我每分钟检查一次或更少...太多的信息与没有信息一样糟糕。 –

+0

所以只需要清楚,git reset --soft some_branch将我切换到some_branch/some_commit而不接触我的文件? –

相关问题