Git:清理或删除提交以清理提交历史

3

文件和搜索结果让我感到困惑,不知道该如何清理提交历史记录。

比如说我有一个名为“tests”的分支,我用它来推送构建到travis-ci,但是构建失败了。我会进行一些小的提交来尝试修复错误信息并重新推送“tests”分支。

这可能会导致一系列小而几乎毫无意义的提交,我并不想这样做,但我还是被迫这样做。如何将它们合并成一个提交呢?我认为我要找的是rebase,但有些事情让我感到困惑。

如果使用squash,我发现我会遇到大量需要手动解决的合并冲突。

我认为解决方案可能是只删除提交,但我不确定是否会删除我的最终“工作”提交所需的某些历史记录。

假设我的提交历史记录看起来像这样:

commit1: some new feature
commit2: crap, builds failing, trying fix
commit3: more build attempts
commit4: Ahh I think I got it this time
commit5: ok finally fixed, build passing

现在我希望只有一个提交记录可以合并回 master 分支。你会采取哪些措施以避免合并冲突?


为什么squash会导致合并冲突?如果在分支的同一点上进行变基,就不应该有冲突,它应该可以正常工作。也许你的rebase命令有误? - Albert
3个回答

9
如何呢?
git reset --soft HEAD~[n]
git commit

那应该压缩你的n次提交。

1
这实际上完美地运行,并且不会导致我处理冲突的问题。我想我将不得不接受在某些分支中重新编写已发布的分支历史。 - Joff
很酷,很高兴我能帮到你。 - qantik

1

Git Squash 可以将多个提交合并成一个。

如前所述,git rebase -i HEAD~n中的n替换为您想要合并的提交数量,并在必要时进行force push更改。

理想情况下,当需要记录和跟踪时才进行提交。提交历史在rebase、检查代码版本、创建分支等方面起着重要作用。在将更改记录到git时,请确保更改是相关的并且需要持久化。

仅在确实不需要说明正在进行的更改时才使用squash。这会修改工作报告。


1

如果您在这里进行的操作不会导致合并冲突,那么您会怎么做?

不幸的是,如果您压缩提交记录,合并冲突可能是不可避免的。

您可以尝试进行交互式变基,将热修复提交合并为一个提交。请记住,如果您还没有将此分支推送到远程,则只建议在一般情况下使用此解决方案。因此,如果您在本地进行了1-5次提交,尚未推送它们,并且希望将它们合并,则交互式变基是一个不错的选择。

从以下内容开始:

git checkout tests
git rebase -i HEAD~5

这应该会弹出一个窗口,显示以下5个提交的列表,从最旧的提交1到最新的提交5,它们都位于你的tests分支中:
pick 07c5abd message for commit 1
pick dl398cn message for commit 2
pick 93nmcdu message for commit 3
pick lst28e4 message for commit 4
pick 398nmol message for commit 5

默认情况下,每个提交选项都是 pick。如果现在完成变基,你只会保留每个提交,这实际上是一个无操作。但是,由于你想要压缩某些中间提交,因此请编辑并将列表更改为以下内容:
pick 07c5abd message for commit 1
squash dl398cn message for commit 2
squash 93nmcdu message for commit 3
squash lst28e4 message for commit 4
squash 398nmol message for commit 5

保存并关闭文件,然后完成变基。

请仔细注意上面发生的情况。通过输入squash,您告诉Git将该提交合并到它上面的提交中,这是在它之前立即出现的提交。因此,这意味着将提交5向后压缩到提交4中,然后将4压缩到3中,依此类推,使您只保留提交1到5的一个提交。发生在提交1之前的其他提交保持不变。

如果您刚刚压缩的提交尚未被推送,并且提交1超前于origin/tests,那么您应该能够通过以下方式推送此分支:

git push origin tests

如果这不起作用,你可能需要强制推送该分支:
git push --force origin tests

但请记住,这会重写远程历史记录,最好不要这样做。


好的,我明白关于重写历史的风险,并且我不想这样做。假设我必须向远程的test分支推送很多“垃圾”提交...你对如何进行干净的合并到主分支有什么建议? - Joff
我刚刚尝试创建了一个测试仓库,并提交了一个初始文件,然后创建了一个新的分支并提交了两个更改,然后切换到主分支并使用git merge branch2命令,我发现主分支上有来自branch2的所有提交。我是否应该使用其他方法? - Joff
好的,这对我来说看起来不错。我猜我需要手动复制我之前写过的或重新创建一个精心编写的合并提交信息? - Joff
实际上,我刚刚尝试了一下,但是它不起作用。我看到了我的合并消息和我在测试分支中提交的提交消息。 - Joff
您可以使用 git commit -m '您的信息在此' 来指定自己的消息。 - Tim Biegeleisen
让我们在聊天中继续这个讨论:点击此处进入聊天室 - Joff

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