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

时间:2013-05-26 10:01:01

标签: git git-extensions squash fixup difference

我一直在使用 Git Extensions 一段时间(真棒!)但我还没有找到以下简单答案:

有时,在输入提交消息时,请输入错误信息。我的朋友告诉我如何通过以下方式修复它(在Git Extentions中):

  

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

enter image description here

然后我只需勾选“修改”框并重写我的留言即可!我的提交消息已修复。

然而另一个选项“壁球提交”......我一直想知道它的作用是什么?!

我的问题是:

有人会简单地解释一下 Git / Git Extentions Squash commit Fixup commit 之间的确切区别是什么?他们看起来像...... “相似”给我: enter image description here enter image description here

6 个答案:

答案 0 :(得分:121)

我不知道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之间的区别在于,在rebase期间,squash操作将提示您组合原始和壁球提交的消息,而fixup操作将保留原始消息并从修正提交中丢弃该消息。

答案 1 :(得分:54)

简单地说,当重新定位一系列提交时,每个提交标记为squash,使您有机会将其消息用作pickreword提交消息的一部分。

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

答案 2 :(得分:13)

来自git-rebase doc

  

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

答案 3 :(得分:1)

我修改了git扩展,无法将许多提交压缩成一个。为此,我不得不求助于命令行并找到this post有用的

git rebase -i Head~2

这是交互式rebase,请注意以下内容:

  • ~2这里指的是您希望在此操作中涉及多少次提交,包括当前头
  • 您必须编辑后续的交互式编辑窗口,将第一个项目保留为"选择"并使用" squash"替换后续行。如果这是不透明的,上面链接中的说明会更清楚。

答案 4 :(得分: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”,但丢弃此提交的日志消息

答案 5 :(得分:0)

如果问题是执行git rebase --interactive时git中squashfixup有什么区别,那么答案就是 commit message < / strong>。

  

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

     

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


例如:

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

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

father commit message

child commit message

情况2的提交消息为:

father commit message
# no sub messages