Яка різниця між "сквош" та "фіксація" в Git / Git Extension?


111

Я вже деякий час використовую розширення Git (це приголомшливо!), Але я не знайшов простої відповіді на наступне:

Іноді під час введення повідомлення про вчинення роблять помилку на друку. Мій друг показав мені, як це виправити наступним чином (у Git Extentions):

Клацніть правою кнопкою миші на фіксації> Додатково> Виправити фіксацію

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

Тоді я просто встановлюю прапорець "Змінити" і переписую своє повідомлення та вуаля! Моє повідомлення про фіксацію виправлено.

Однак цей інший варіант "Сквош-коміт" ... Я завжди цікавився, що це робить ?!

Моє запитання:

Хтось просто пояснить мені, яка точна різниця між компіляцією Squash і фіксуванням Fixup у Git / Git Extentions ? Вони схожі на мене ... "схожі" на мене: введіть тут опис зображення введіть тут опис зображення

Відповіді:


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

66

Простіше кажучи, при повторному опублікуванні серії комітетів кожне зобов’язання, позначене як " squash," дає вам можливість використовувати його повідомлення як частину повідомлення pickабо rewordвиконувати.

Коли ви використовуєте fixupповідомлення від цього зобов’язання, викидається.


Яке повідомлення зберігається fixupтоді?
ІгорГанапольський

2
@IgorGanapolsky Повідомлення від чергового комітету у дереві git. Ви в основному "зливаєте" свої зобов'язання в ньому.
Олександр Гарольдо да Роша

15

З git-rebase doc, розділ "інтерактивний режим" :

Якщо ви хочете скласти два чи більше комітетів на одне, замініть команду "pick" на другу та наступні коміти на "squash" або "fixup". Якщо у комітетів були різні автори, складений комітет буде віднесений до автора першого комітету. Запропоноване повідомлення про фіксацію для складеного коміту - це з'єднання повідомлень про фіксацію першої фіксації та тих, хто має команду "сквош", але опускає повідомлення про виконання комісій за допомогою команди "фіксація".


13

Якщо питання полягає в тому, в чому різниця між git squashта fixupgit, коли виконується git rebase - інтерактивна , то відповідь - це повідомлення про фіксацію .

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

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, сквош = використовувати фіксацію, але увімкнути попередній коміт

f, fixup = як "сквош", але відмовтеся від журналу цього журналу

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.