Git / Git Extension中的“ squash”和“ fixup”有什么区别?


111

我已经使用Git Extensions一段时间了(太棒了!),但是我没有找到以下简单的答案:

有时,在键入提交消息时,会打错字。我的朋友向我展示了如何通过以下方法(在Git Extensions中)进行修复:

右键单击提交>高级>修复提交

在此处输入图片说明

然后,我只需选中“修改”框,然后重写我的信息即可!我的提交消息是固定的。

但是,另一个选项“ Squash commit”……我一直想知道它的作用是什么?!

我的问题是:

有人可以简单地解释一下我在Git / Git扩展中的Squash提交Fixup提交之间的确切区别是什么吗?它们看起来“相似”在此处输入图片说明 在此处输入图片说明

Answers:


153

我不知道Git Extensions专门做什么,但是git rebase有一个选项可以自动压扁或用压扁修正提交!或修正!前缀分别为:

   --autosquash, --no-autosquash
       When the commit log message begins with "squash! ..." (or "fixup!
       ..."), and there is a commit whose title begins with the same ...,
       automatically modify the todo list of rebase -i so that the commit
       marked for squashing comes right after the commit to be modified,
       and change the action of the moved commit from pick to squash (or
       fixup).

squash和fixup之间的区别在于,在重新设置基准期间,该squash操作将提示您合并原始消息和squash提交的消息,而该fixup操作将保留原始消息,并从fixup提交中丢弃该消息。


6
您可以rebaseGit docs上阅读有关壁球和固定的更多信息。

这是一个很好的答案。一直想知道为什么我收到组合提交消息。
jedd.ahyoung 2015年

66

简而言之,在对一系列提交进行基础调整时,每个标记为的提交都会squash使您有机会将其消息用作a pickrewordcommit消息的一部分。

当您使用fixup该消息时,该提交将被丢弃。


fixup然后保留哪个消息?
IgorGanapolsky

2
@IgorGanapolsky来自git树中下一次提交的消息。您基本上可以将提交“合并”到其中。
亚历山大·哈罗多·达罗沙

15

git-rebase doc的“交互模式”部分

如果要将两个或多个提交折叠成一个,请用“ squash”或“ fixup”替换第二个及后续提交的命令“ pick”。如果提交的作者不同,则折叠的提交将归因于第一个提交的作者。对于折叠提交,建议的提交消息是第一次提交的提交消息和使用“ squash”命令的提交消息的串联,但是使用“ fixup”命令省略了提交的提交消息。


12

如果问题是在进行git rebase --interactivegitsquashfixupgit 有什么区别,那么答案就是提交消息

s, squash <commit> =使用提交,但可以合并到先前的提交中

f, fixup <commit>=类似于“ squash”,但丢弃此提交的日志消息


例如:

pick 22a4667 father commit message
squash 46d7c0d child commit message # case 1
# fixup 46d7c0d child commit message # case 2

情况1中重新定位后的提交消息为:

father commit message

child commit message

而情况2的提交消息是:

father commit message
# no sub messages

1

我修改了git扩展,无法将许多提交压缩为一个。为此,我不得不求助于命令行,发现这篇文章很有帮助

git rebase -i Head~2

这是交互式基础,请注意以下几点:

  • 〜2这里表示您要在此操作中涉及多少个提交,包括当前的头部
  • 您必须编辑随后的交互式编辑窗口,将第一项保留为“ pick”,然后将后续行替换为“ squash”。如果它是不透明的,则上面链接中的说明会更加清晰。

您链接到的帖子是关于我对壁球和固定的最清晰的解释。谢谢!
西蒙·图西

0

为什么不问git本身呢?使用进行基准调整时git-bash,它会显示:

pick 512b1d7 (some comment)
# Rebase 621b2e4..512b1d7 onto 621b2e4 (1 command)
#
# 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
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
D:/code/fenixito-legacy-api/.git/rebase-merge/git-rebase-todo [unix] (11:57 23/10/2019)                                         1,1 start
"D:/code/xxx/.git/rebase-merge/git-rebase-todo" [UNIX] 27L, 1170C

所以你看:

s,squash =使用提交,但可以合并到先前的提交中

f,fixup =类似于“ squash”,但丢弃此提交的日志消息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.