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

112

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

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

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

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

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

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

У меня вопрос:

Может ли кто-нибудь просто объяснить мне, в чем точная разница между фиксацией Squash и фиксацией фиксации в расширениях Git / Git ? Мне они кажутся ... "похожими" : введите описание изображения здесь введите описание изображения здесь

Заполнитель
источник

Ответы:

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

дризд
источник
6
Вы можете узнать больше о rebaseсжатии / исправлении в документации Git .
Это отличный ответ. Всегда задавался вопросом, почему я получаю сообщения о комбинированной фиксации.
jedd.ahyoung
67

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

При использовании fixupсообщение от этого коммита отбрасывается.

окодо
источник
Какое сообщение сохраняется для fixupэтого?
Игорь Ганапольский
2
@IgorGanapolsky Сообщение от следующего коммита в дереве git. Вы в основном "сливаете" в него свой коммит.
Александр Харольдо да Роша,
15

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

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

Пауло Лютье
источник
13

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

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 здесь относится к тому, сколько коммитов вы хотите задействовать в этой операции, включая текущую голову
  • Вы должны отредактировать следующее интерактивное окно редактирования, оставив первый элемент как «выбрать» и заменить последующие строки на «сквош». Инструкции в приведенной выше ссылке будут намного понятнее, если это непрозрачно.
СмелыйНовый
источник
Сообщение, на которое вы ссылаетесь, посвящено самому четкому объяснению сквоша и исправлений, которое я видел. Спасибо!
Саймон Тевси
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", но удалить сообщение журнала этой фиксации

WesternGun
источник