在没有变基的情况下重做 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-mastergit 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 中的提交历史的主要内容,如果未能解决你的问题,请参考以下文章

我分享了我的提交历史?

对于git中变基操作的粗略认识

在没有变基的情况下恢复合并

git rebase——分支变基及变基的风险

使用 git 和 meld 进行交互式变基的 3 路合并中的三个文件是啥?

Git squash 重命名文件的提交(保留历史记录)