Jaka jest różnica między "squash " a" fixup " w rozszerzeniu Git/Git?

Używam Git Extensions już od jakiegoś czasu (jest super!) ale nie znalazłem prostej odpowiedzi na następujące pytanie:

Czasami, podczas wpisywania komunikatu commit, a make a typo. Mój przyjaciel pokazał mi jak to naprawić w następujący sposób (w rozszerzeniach Git):

Kliknij prawym przyciskiem myszy commit > zaawansowane > fixup commit

Tutaj wpisz opis obrazka

Następnie po prostu zaznaczam pole "zmienić" i przepisuję wiadomość i voila! Mój komunikat commit to naprawione.

Jednak ta druga opcja "Squash commit"... Zawsze zastanawiałem się, co to robi?!

Moje pytanie brzmi:

Czy ktoś mógłby mi po prostu wyjaśnić jaka jest dokładna różnica pomiędzy squash commitA Fixup commitw Git/Git Extentions? Wyglądają jakby... "podobne" do mnie: Tutaj wpisz opis obrazkaTutaj wpisz opis obrazka

Author: Placeholder, 2013-05-26

6 answers

Nie wiem, co Git Extensions z nim robi, ale git rebase ma opcję automatycznego squasha lub poprawiania commitów za pomocą squasha! albo naprawa! prefiksy, odpowiednio:

   --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).

Różnica między squashem a fixupem polega na tym, że podczas rebase, operacja squash poprosi Cię o połączenie komunikatów oryginalnego i zatwierdzonego commita squasha, podczas gdy fixup zachowa oryginalną wiadomość i odrzuci wiadomość z zatwierdzonego commita.

 158
Author: drizzd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-02 05:51:50

Mówiąc najprościej, podczas zmiany rozmiaru serii commitów, każdy commit oznaczony jako squash, daje możliwość użycia jego komunikatu jako części pick lub reword.

Kiedy używasz fixup wiadomość z tego zatwierdzania jest odrzucana.

 70
Author: ocodo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-11 14:20:19

Jeśli pytaniem jest jaka jest różnica pomiędzy squash i fixup w git podczas wykonywania Git rebase --interactive , to odpowiedzią jest commit message .

s, squash <commit> = użyj commit, ale połącz z poprzednim commit

f, fixup <commit> = podobnie jak "squash", ale Odrzuć wiadomość dziennika tego commita


Na przykład:

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

commit message po zmianie rozmiaru w case 1 będzie to:

father commit message

child commit message

Podczas gdy commit message w przypadku 2 to:

father commit message
# no sub messages
 18
Author: Loi Nguyen Huynh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

From Git-rebase doc, sekcja "interactive mode" :

Jeśli chcesz złożyć dwa lub więcej commitów w jeden, zamień polecenie " pick "dla drugiego i kolejnych commitów na" squash "lub"fixup". Jeśli commity miały różnych autorów, złożony commit zostanie przypisany autorowi pierwszego commita. Sugerowana wiadomość commit dla złożonego commita jest połączeniem komunikatów commit pierwszego commita i tych z Komendą "squash", ale pomija komunikaty commitów commitów za pomocą polecenia "fixup".

 15
Author: Paulo Lieuthier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-12-13 07:31:58

Majstrowałem z rozszerzeniami Gita i nie mogłem sprawić, by zmiażdżyło wiele commitów w jeden. Aby to zrobić, musiałem uciekać się do wiersza poleceń i znalazłem ten post pomocny

git rebase -i Head~2

Jest to interaktywny rebase, i zauważ, co następuje:

  • ~2 tutaj odnosi się do tego, ile commitów chcesz zaangażować w tę operację, w tym aktualnego head
  • musisz edytować interaktywne okno edycji subquent, pozostawić pierwszą pozycję jako "pick" i zastąpić kolejne wiersze "squash" Instrukcje w linku powyżej są znacznie jaśniejsze, jeśli jest to nieprzezroczyste.
 2
Author: BraveNewMath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-08 17:15:44

Dlaczego nie zapytać samego Gita? Kiedy rebase z git-bash, mówi:

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

Więc widzisz:

S, squash = użyj commita, ale połącz go z poprzednim commitem

F, fixup = like "squash", ale Odrzuć wiadomość dziennika tego commita

 0
Author: WesternGun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55