Was ist der Unterschied zwischen "Squash" und "Fixup" in Git / Git Extension?

110

Ich benutze Git Extensions jetzt schon eine Weile (es ist großartig!), Aber ich habe keine einfache Antwort auf Folgendes gefunden:

Wenn Sie eine Commit-Nachricht eingeben, machen Sie manchmal einen Tippfehler. Mein Freund hat mir gezeigt, wie man es folgendermaßen behebt (in Git Extentions):

Klicken Sie mit der rechten Maustaste auf Commit> Erweitert> Fixup-Commit

Geben Sie hier die Bildbeschreibung ein

Dann aktiviere ich einfach das Kontrollkästchen "Ändern" und schreibe meine Nachricht und voila neu! Meine Commit-Nachricht ist behoben.

Allerdings diese andere Option "Squash Commit" ... Ich habe mich immer gefragt, was es tut?!

Meine Frage ist:

Würde mir jemand einfach erklären, was der genaue Unterschied zwischen Squash-Commit und Fixup-Commit in Git / Git-Erweiterungen ist ? Sie sehen mir irgendwie ... "ähnlich" aus : Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Platzhalter
quelle

Antworten:

153

Ich weiß nicht, was Git Extensions speziell damit macht, habe aber git rebasedie Option, Commits mit Squash automatisch zu quetschen oder zu reparieren! oder reparieren! Präfixe jeweils:

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

Der Unterschied zwischen Squash und Fixup besteht darin, dass Sie während des Rebases squashaufgefordert werden, die Nachrichten des Originals und des Squash-Commits zu kombinieren, während der fixupVorgang die ursprüngliche Nachricht beibehält und die Nachricht aus dem Fixup-Commit verwirft.

Nieselregen
quelle
6
Weitere rebaseInformationen zu und Squash / Fixup finden Sie in den Git-Dokumenten .
Dies ist eine großartige Antwort. Ich habe mich immer gefragt, warum ich Kombinations-Commit-Nachrichten erhalten habe.
jedd.ahyoung
65

Einfach ausgedrückt, wenn Sie eine Reihe von Commits neu festlegen squash, bietet Ihnen jedes als gekennzeichnete Commit die Möglichkeit, seine Nachricht als Teil einer pickoder einer rewordCommit-Nachricht zu verwenden.

Wenn Sie fixupdie Nachricht aus diesem Commit verwenden, wird sie verworfen.

ocodo
quelle
Welche Nachricht wird dann aufbewahrt fixup?
IgorGanapolsky
2
@IgorGanapolsky Die Nachricht vom nächsten Commit im Git-Baum. Sie "verschmelzen" im Grunde Ihr Commit darin.
Alexander Haroldo da Rocha
15

Aus dem git-rebase-Dokument, Abschnitt "Interaktiver Modus" :

Wenn Sie zwei oder mehr Commits zu einem falten möchten, ersetzen Sie den Befehl "pick" für das zweite und nachfolgende Commit durch "squash" oder "fixup". Wenn die Commits unterschiedliche Autoren hatten, wird das gefaltete Commit dem Autor des ersten Commits zugeordnet. Die vorgeschlagene Festschreibungsnachricht für das gefaltete Festschreiben ist die Verkettung der Festschreibungsnachrichten des ersten Festschreibens und derjenigen mit dem Befehl "squash", lässt jedoch die Festschreibungsnachrichten der Festschreibungen mit dem Befehl "fixup" weg.

Paulo Lieuthier
quelle
12

Wenn die Frage ist , was ist der Unterschied zwischen squashund fixupin git , wenn dabei git rebase --interactive , dann ist die Antwort die Nachricht begehen .

s, squash <commit> = Commit verwenden, aber mit dem vorherigen Commit verschmelzen

f, fixup <commit>= wie "squash", aber verwerfen Sie die Protokollnachricht dieses Commits


Beispielsweise:

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

Die Commit - Nachricht , nachdem in Rebasing 1 Fall wäre:

father commit message

child commit message

während die Festschreibungsnachricht in Fall 2 lautet:

father commit message
# no sub messages
Loi Nguyen Huynh
quelle
1

Ich bastelte an Git-Erweiterungen und konnte es nicht schaffen, viele Commits in einem zusammenzufassen. Dazu musste ich auf die Kommandozeile zurückgreifen und fand diesen Beitrag hilfreich

git rebase -i Head~2

Dies ist eine interaktive Rebase. Beachten Sie Folgendes:

  • ~ 2 bezieht sich hier auf die Anzahl der Commits, die Sie in diese Operation einbeziehen möchten, einschließlich des aktuellen Kopfes
  • Sie müssen das nachfolgende interaktive Bearbeitungsfenster bearbeiten, das erste Element als "Auswählen" belassen und nachfolgende Zeilen durch "Squash" ersetzen. Die Anweisungen im obigen Link sind viel klarer, wenn dies undurchsichtig ist.
BraveNewMath
quelle
Der Beitrag, auf den Sie verlinken, handelt von der klarsten Erklärung, die ich je für Squash und Fixup gesehen habe. Vielen Dank!
Simon Tewsi
0

Warum nicht git selbst fragen? Wenn Sie mit neu gründen git-bash, heißt es:

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

Nun siehst du:

s, squash = Commit verwenden, aber mit dem vorherigen Commit verschmelzen

f, fixup = wie "squash", aber verwerfen Sie die Protokollnachricht dieses Commits

WesternGun
quelle