В чем разница между сквошом и исправлением в Git/Git Extension?

Я уже некоторое время использую Git Extensions (это здорово!), но не нашел простого ответа на следующие вопросы:

Иногда при вводе сообщения коммита можно сделать опечатку. Мой друг показал мне, как исправить это следующим образом (в Git Extentions):

Щелкните правой кнопкой мыши фиксацию > Дополнительно > Фиксировать фиксацию.

введите здесь описание изображения

Затем я просто ставлю галочку «Изменить» и переписываю свое сообщение, и вуаля! Мое сообщение фиксации исправлено.

Однако этот другой вариант "Squash commit"... Мне всегда было интересно, что он делает?!

Мой вопрос:

Кто-нибудь просто объяснит мне, в чем точная разница между Squash commit и Fixup commit в Git/Git Extentions? Они выглядят... "похожими" для меня: введите здесь описание изображения введите здесь описание изображения


person Placeholder    schedule 26.05.2013    source источник


Ответы (6)


Я не знаю, что именно Git Extensions делает с этим, но git rebase имеет возможность автоматически сжимать или исправлять коммиты с помощью squash! или ремонт! префиксы соответственно:

   --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 сохранит исходное сообщение и отбросит сообщение из фиксации исправления.

person drizzd    schedule 26.05.2013
comment
Подробнее о rebase и squash/fixup можно прочитать в документах Git. - person ; 26.05.2013
comment
Это отличный ответ. Всегда задавался вопросом, почему я получаю сообщения о комбинации коммитов. - person jedd.ahyoung; 20.03.2015

Проще говоря, при перебазировании серии коммитов каждый коммит, помеченный как squash, дает вам возможность использовать его сообщение как часть сообщения коммита pick или reword.

Когда вы используете fixup, сообщение от этой фиксации отбрасывается.

person ocodo    schedule 11.07.2014
comment
Какое сообщение хранится для fixup тогда? - person IgorGanapolsky; 11.02.2020
comment
@IgorGanapolsky Сообщение от следующего коммита в дереве git. Вы в основном объединяете свой коммит с ним. - person Alexander Haroldo da Rocha; 04.03.2020

Если возникает вопрос, в чем разница между squash и fixup в git при выполнении git rebase --interactive, то ответом будет сообщение фиксации.

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 будет таким:

father commit message

child commit message

в то время как сообщение фиксации в случае 2:

father commit message
# no sub messages
person Loi Nguyen Huynh    schedule 29.12.2019

Из документа git-rebase, раздел "интерактивный режим":

Если вы хотите объединить два или более коммитов в один, замените команду «pick» для второго и последующих коммитов на «squash» или «fixup». Если у коммитов разные авторы, свернутый коммит будет отнесен к автору первого коммита. Предлагаемое сообщение коммита для свернутого коммита представляет собой конкатенацию сообщений коммита первого коммита и сообщений с командой "squash", но опускает сообщения коммитов с коммитами с командой "fixup".

person Paulo Lieuthier    schedule 12.03.2015

Я возился с расширениями git и не смог заставить его объединить множество коммитов в один. Для этого мне пришлось обратиться к командной строке и найти этот пост полезен

git rebase -i Head~2

Это интерактивная перебазировка, и обратите внимание на следующее:

  • ~2 здесь относится к тому, сколько коммитов вы хотите задействовать в этой операции, включая текущую голову
  • Вы должны отредактировать последующее интерактивное окно редактирования, оставить первый элемент как «выбрать» и заменить последующие строки на «сквош». Инструкции по ссылке выше намного понятнее, если это непрозрачно.
person BraveNewMath    schedule 08.05.2015
comment
Пост, на который вы ссылаетесь, посвящен самому ясному объяснению, которое я когда-либо видел о сквоше и исправлении. Спасибо! - person Simon Tewsi; 14.05.2019
comment
Спасибо! Ваш ответ определенно заслуживает большего количества лайков!! - person Justice47; 03.02.2021

Почему бы не спросить самого 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 = как сквош, но отбросить сообщение журнала этой фиксации

person WesternGun    schedule 23.10.2019