首页 > 解决方案 > Git squash multiple commit versus reset to base commit

问题描述

Suppose I have a Base commit B1 and on top of it I create local commits say C1,C2,C3. There are two ways for pushing the latest changes (C1,C2,C3) into git:-

  1. To squash C1,C2,C3 into one commit and push that as a single commit.
  2. To reset to old Base B1 (not hard) and create a new commit C4 which will have all the commits C1,C2,C3 included in it.

I want to know which way is better and which way is worse and why?

标签: git

解决方案


我会假设squash你的意思是rebasen 次提交,然后压缩它们。

所以,在我看来,这就是不同方法所提供的。

1.使用reset

当您使用重置时,您所做的是移动HEAD指向的内容。

将当前 HEAD 重置为指定状态。

reset 要做的第一件事就是移动HEAD指向的东西。这与更改HEAD自身不同(这就是 checkout 所做的);reset 移动HEAD指向的分支。这意味着如果HEAD设置为 master 分支(即您当前在 master 分支上),运行 git reset9e5e6a4将首先将 master 指向9e5e6a4.

鉴于您可以传递给命令的三个参数,您可能会完全放弃您的工作,或者您可以在状态--soft --hard --mixed中进行更改。"Changes to be committed"

这种方法的好处是简单快捷。你告诉 git 你想HEAD指向哪里,其余的更改(在这种情况下是所有 3 次提交)将被混合成一个大的更改。然后提交并推送。相当容易。

这样做的缺点是它使您对壁球的控制有限(因为这是操作的目标,即壁球)。你看不到提交哈希,你看不到 3 条提交消息,你没有选择重新排序它们,改写/修复任何提交。

2.使用rebase

注意:这里我说的是一个交互式的rebase,同样是为了正确压缩提交。

当你rebase在 git 中交互时,你会得到一个你指定到的所有提交的列表rebase。它们是有序的、格式化的,在它们之下,您可以为每个提交指定一组命令。因为我们对压缩感兴趣,所以我们可以选择要压缩的提交,其余的可以用squash.

这允许我们做的是查看我们正在压缩的提交。我们可以阅读他们的信息,我们可以看到我们的历史。在这一点上,我们可能会说我们实际上想要重新排序它们,或者只是改写消息。Git 为我们提供了更大的灵活性来获得我们想要的历史记录(尽管有些人可能会告诉你改变 git 历史记录是一件坏事,而这种论点有时确实有其价值)。

但即使我们只想压缩所有提交,git 也会让我们编写一个新的提交消息,我们可以从我们想要压缩的提交中看到所有提交消息。无需搜索或记住以前的消息。

这种方法的缺点是使用 git-interactive 菜单可能更困难,并且可能需要更长的时间来执行squash.


就个人而言,我相信这两种策略都有效,但感觉rebase-ing 更适合压缩提交。这仅取决于您所处的情况。如果您认为重置和重新提交可能会更好,那就去做吧。但我认为使用交互式rebase可能会让你免于在你的历史中搞砸事情。


编辑我没有看到评论正确指出挤压不是将提交推送到遥控器的唯一方法。也许这是最直接和最简单的方法:)


推荐阅读