在GIT中重新执行提交历史而不使用Rebase

21
自从我问了上一个问题关于使用GIT进行变基, 我已经决定不想再进行变基了。相反,我想要:
  1. 创建分支
  2. 工作、工作、工作,在任何时候都检查并推送
  3. 放弃所有这些提交,并假装它们从未发生过(因此在完成工作后只有一次干净的提交)
我目前是通过将文件复制到新目录中,然后将它们复制回新分支(在我的工作分支处创建分支),然后将其合并到master或其他位置。 这样做是否很糟糕,为什么?更重要的是:有更好/更适合GIT的方法吗?git rebase -i强制我进行合并(选择和压缩)。
2个回答

25
最简单的方法是进行软重置。
因此,请检出您的主题分支:
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是否是正确的方式?所有逻辑增量步骤都被压缩了,如果提交主题中存在一些严重的bug,那么很难找到并修复它。 - VonC
2
@Charles Bailey,谢谢你。@VonC,这取决于情况。我每分钟或更短时间检查一次……太多信息和没有信息一样糟糕。 - Dan Rosenstark
1
git reset --soft 只是将当前分支头移动到给定的提交,保留索引不变。正常(--mixed)的 git reset 也会将索引重置为给定提交的状态,但这并不适用于此场景。 - CB Bailey
太棒了。我现在感到很傻,因为过去花了那么多时间进行变基。是的,变基更强大,但如果你只想将一个分支压缩成较少的提交,这种方法更好。变基的问题在于,你需要重新解决之前遇到的任何合并冲突,让你做两次工作。 - kotoole
你好,我按照你的步骤操作了,但是我在历史记录中并没有得到一个压缩提交,反而多了两个提交。我做错了什么? - guy mograbi
显示剩余3条评论

10

您也可以使用带有--squash选项的git merge


1
自动压缩会在每次提交时自动进行,但我不知道它如何帮助解决我的问题。这并不表示它没有用处,但我需要更多的信息。 - Dan Rosenstark
2
当我想将一个主题分支与主干合并,但是又想将提交历史记录减少为仅一个提交时,我使用了 git merge --squashgit merge --squash 执行了合并,但允许您在实际提交合并之前提供提交消息。因此,最终结果看起来好像您只向主干分支提交了一次。 - Ionuț G. Stan
2
抱歉我花了三年时间才明白这个答案是正确的。干得好! - Dan Rosenstark
@Yar 哈哈,没问题。我很高兴最终能帮到你 :) - Ionuț G. Stan
删除的文件的情况下它不起作用。也许这不是正确的方法 - 请参见这里 - Mr_and_Mrs_D
当一个人花了三年时间才弄清楚这是正确的解决方案时,你就知道 Git 太过复杂了... - Jeff Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接