在没有变基的情况下重做 GIT 中的提交历史
Posted
技术标签:
【中文标题】在没有变基的情况下重做 GIT 中的提交历史【英文标题】:Redoing Commit History in GIT Without Rebase 【发布时间】:2010-02-23 18:39:08 【问题描述】:自从问了我最后一个问题which turned out to be about rebasing with GIT,我已经决定我根本不想变基。相反,我想:
-
分公司
工作工作工作,随时签到和推
丢弃所有这些提交并假装它们从未发生过(所以在工作结束时进行一次干净的提交)
我目前这样做是通过将文件复制到新目录,然后将它们复制回新分支(与我的工作分支在同一点分支),然后将其合并到 master
或任何地方。
这很糟糕吗?为什么?更重要的是:有没有更好的/GIT 方法来做到这一点? git rebase -i
强迫我合并(并挑选和挤压)。
【问题讨论】:
【参考方案1】:最简单的方法是软重置。
所以检查你的主题分支:
git checkout -b topic master
工作,工作,工作。
git commit
git commit
git commit
git commit
对此感到满意,您可以在 master 之上进行新的单次提交
git reset --soft master
git commit
现在合并到master(这将是一个快进)并整理主题分支。 (请注意,如果您准备记住或标记 master 所在的位置并且只在 master 上工作而不进行分支,则不需要这样做,您可以只完成 git reset --soft old-master
和 git commit
并且您不需要这些最后清理步骤。)
git checkout master
git merge topic
git branch -d topic
【讨论】:
优秀 (+1),但这留下了一个问题:这是正确的方法(使用 Git 还是实际上使用任何 (D)VCS)?所有逻辑增量步骤都被压缩了,如果主题的提交存在一些令人讨厌的错误,那将不容易查明和修复。 @Charles Bailey,谢谢。 @VonC,这取决于。我每隔一分钟或更短时间检查一次……信息太多就像没有信息一样糟糕。 所以为了清楚起见,git reset --soft some_branch 将我切换到 some_branch/some_commit 而不接触我的文件? 好的,我现在看到了:它在那里重置了我,但不进行结帐。奇怪/好极了!git reset --soft
只是将当前分支头移动到给定的提交,保持索引完好。一个普通的 (--mixed
) git reset
也会将索引重置为给定提交的状态,但这不是你想要的这种情况【参考方案2】:
您还可以将git merge
与--squash
选项一起使用。
【讨论】:
Squash 在每次提交时自动发生,我看不出这对我的问题有什么帮助。并不是说没有,但我需要更多信息。 当我想将一个主题分支与主分支合并时,我使用了git merge --squash
,但也将提交历史记录减少到只有一次提交。 git merge --squash
执行合并,但让我们在实际提交合并之前提供提交消息。所以最终结果看起来好像你只向主分支提交了一次。
对不起,我花了三年时间才弄清楚这个答案是正确的。干得好!
@Yar 哈哈,没问题。我很高兴它最终帮助了你:)
在deleted files 的情况下不起作用。也许不是要走的路 - 见here以上是关于在没有变基的情况下重做 GIT 中的提交历史的主要内容,如果未能解决你的问题,请参考以下文章