如何(无法)在源代码树中使用 rebase interactive 压缩提交?

How to ( Unable) to squash commits using rebase interactive in source tree?

我正在尝试压缩提交,这样我的回购历史就不会充斥着不重要的提交,例如“次要修复 1”、“次要修复 2”……等等。但我似乎无法使用 sourcetree UI.

我做了一些带有自我描述名称的提交,例如“工作的主要部分”、“次要修复”、“修复 2”(尚未推送到远程)。当然,我想将所有这 3 个提交压缩为一个适当的提交,例如“do feature a2a”。

第一步是我点击“在以前的提交上交互地重新设置子项的基数”,然后我尝试重新排列提交,以便它们代表我希望它们所处的逻辑顺序。在我这里的例子中,我安排它们,以便所有的小修复都包含在一个主要提交下,并按时间顺序排列,当然我也编辑提交消息以使其更清晰,如下所示根据说明 here:

然后我点击确定,但随后,我收到了这条消息(合并冲突):

我不知道为什么会有合并冲突?如何解决?有没有办法单独使用 sourcetree UI(不使用 git 命令行)使 squash 提交正常工作?

如果您无论如何都想将提交压缩在一起,请不要重新排列它们的顺序——更改顺序会导致冲突。

提交的最终内容将完全相同,在您的情况下您无论如何都想改写消息。


从命令行,具有以下历史记录:

$ git log --oneline --graph
* 7f6cc32 (HEAD -> master) fix 2
* 11adfe2 minor fix
* 871c26d A major part of the work
* 59a2b18 really new beginning
* e6872a9 Merge branch 'master' into xxx
...

如果我运行git rebase --interactive e6872a9,我先编辑一个文件,内容如下:

pick 59a2b18 really new beginning
pick 871c26d A major part of the work
pick 11adfe2 minor fix
pick 7f6cc32 fix 2

# Rebase e6872a9..7f6cc32 onto 7f6cc32 (4 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
...

这里的想法是指出我想对每个提交应用什么操作(保留它,用它的前身压缩它,编辑它......),保存并退出,然后 git 将重播一个接一个地提交,并应用我选择的操作。

两点说明:

  • 当你检查一个分支的历史时,你通常首先得到最近的提交,但是在这个文件中列表有最旧的提交 首先(默认情况下 git log 显示的相反);
  • 如果我编辑一行说 squash,该提交将与上一行 中的提交合并 (上一个提交)。

所以:如果我想将提交 fix 2minor fixA major part of the work 合并在一起,我会将文件编辑为:

pick 59a2b18 really new beginning
pick 871c26d A major part of the work
squash 11adfe2 minor fix
squash 7f6cc32 fix 2

# Rebase e6872a9..7f6cc32 onto 7f6cc32 (4 commands)
...

然后保存退出。

当您使用 squash 时,结果是 git 要求您编辑提交消息,所以我不需要将其他操作更改为 editreword.


我没有使用 Sourcetree 的经验,但我怀疑列表中的提交顺序与文件中的顺序相同(“反向”顺序,最早的提交在前)。

只是不要改变那个顺序,并在 minor fixfix 2.

这两个提交中的每一个上应用 [Squash with previous]

我想我现在明白它是如何工作的了:

  1. 确保压缩的提交必须按相反的时间顺序排列,即:最新的在顶部,而不是在底部。
  2. 单击“确定”时,请确保未勾选 Amend Commit? 列。可以在之前编辑提交注释并勾选 Amend Commit? 列,但当准备单击 OK 按钮时则不能。
  3. 更重要的是,您不能使用 # 开始您的新提交消息。如果您必须标记您的提交以错误编号开头(例如:#1234),您可能需要在 # 前面附加几个空格(例如: #1234