如何(无法)在源代码树中使用 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 2
、minor fix
和 A 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
要求您编辑提交消息,所以我不需要将其他操作更改为 edit
或 reword
.
我没有使用 Sourcetree 的经验,但我怀疑列表中的提交顺序与文件中的顺序相同(“反向”顺序,最早的提交在前)。
只是不要改变那个顺序,并在 minor fix
和 fix 2
.
这两个提交中的每一个上应用 [Squash with previous]
我想我现在明白它是如何工作的了:
- 确保压缩的提交必须按相反的时间顺序排列,即:最新的在顶部,而不是在底部。
- 单击“确定”时,请确保未勾选
Amend Commit?
列。可以在之前编辑提交注释并勾选 Amend Commit?
列,但当准备单击 OK
按钮时则不能。
- 更重要的是,您不能使用
#
开始您的新提交消息。如果您必须标记您的提交以错误编号开头(例如:#1234
),您可能需要在 #
前面附加几个空格(例如: #1234
)
我正在尝试压缩提交,这样我的回购历史就不会充斥着不重要的提交,例如“次要修复 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 2
、minor fix
和 A 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
要求您编辑提交消息,所以我不需要将其他操作更改为 edit
或 reword
.
我没有使用 Sourcetree 的经验,但我怀疑列表中的提交顺序与文件中的顺序相同(“反向”顺序,最早的提交在前)。
只是不要改变那个顺序,并在 minor fix
和 fix 2
.
[Squash with previous]
我想我现在明白它是如何工作的了:
- 确保压缩的提交必须按相反的时间顺序排列,即:最新的在顶部,而不是在底部。
- 单击“确定”时,请确保未勾选
Amend Commit?
列。可以在之前编辑提交注释并勾选Amend Commit?
列,但当准备单击OK
按钮时则不能。 - 更重要的是,您不能使用
#
开始您的新提交消息。如果您必须标记您的提交以错误编号开头(例如:#1234
),您可能需要在#
前面附加几个空格(例如:#1234
)