Qual è la differenza tra "squash" e "fixup" in Git / Git Extension?


111

Uso Git Extensions da un po 'di tempo (è fantastico!) Ma non ho trovato una risposta semplice a quanto segue:

A volte, quando si digita un messaggio di commit, viene eseguito un errore di battitura. Il mio amico mi ha mostrato come risolverlo nel modo seguente (in Git Extentions):

Fare clic con il pulsante destro del mouse su commit> Avanzate> commit di correzione

inserisci qui la descrizione dell'immagine

Quindi spunta semplicemente la casella "Modifica" e riscrivo il mio messaggio e voilà! Il mio messaggio di commit è stato corretto.

Comunque quest'altra opzione "Squash commit" ... mi sono sempre chiesto cosa fa ?!

La mia domanda è:

Qualcuno potrebbe spiegarmi semplicemente qual è la differenza esatta tra il commit di Squash e il commit di Fixup in Git / Git Extentions ? Mi sembrano un po '... "simili" : inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Risposte:


153

Non so cosa faccia in particolare Git Extensions, ma git rebaseha un'opzione per schiacciare o correggere automaticamente i commit con squash! o correzione! prefissi, rispettivamente:

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

La differenza tra squash e fixup è che durante il rebase, l' squashoperazione ti chiederà di combinare i messaggi dell'originale e del commit squash, mentre l' fixupoperazione manterrà il messaggio originale e scarterà il messaggio dal commit di fixup.


6
Puoi leggere di più su rebasee squash / fixup nella documentazione di Git .

Questa è un'ottima risposta. Mi sono sempre chiesto perché ricevessi messaggi di commit della combinazione.
jedd.ahyoung

66

In poche parole, quando si ribassa una serie di commit, ogni commit contrassegnato come a squash, ti dà l'opportunità di usare il suo messaggio come parte di unpick o di rewordmessaggio di commit.

Quando usi fixupil messaggio da quel commit viene scartato.


Per quale messaggio viene conservato fixupallora?
IgorGanapolsky

2
@IgorGanapolsky Il messaggio dal commit successivo nell'albero git. Fondamentalmente "unisci" il tuo impegno in esso.
Alexander Haroldo da Rocha il

15

Dal documento git-rebase, sezione "modalità interattiva" :

Se si desidera piegare due o più commit in uno, sostituire il comando "pick" per il secondo e i successivi commit con "squash" o "fixup". Se i commit hanno autori diversi, il commit piegato verrà attribuito all'autore del primo commit. Il messaggio di commit suggerito per il commit piegato è la concatenazione dei messaggi di commit del primo commit e di quelli con il comando "squash", ma omette i messaggi di commit dei commit con il comando "fixup".


13

Se la domanda è qual è la differenza tra squashe fixupin git quando si esegue git rebase --interactive , la risposta è il messaggio di commit .

s, squash <commit> = usa il commit, ma si fonde con il commit precedente

f, fixup <commit>= come "squash", ma elimina il messaggio di log di questo commit


Per esempio:

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

Il messaggio di commit dopo il rebase nel caso 1 sarebbe:

father commit message

child commit message

mentre il messaggio di commit nel caso 2 è:

father commit message
# no sub messages

1

Ho armeggiato con le estensioni git e non sono riuscito a comprimere molti commit in uno solo. Per farlo, ho dovuto ricorrere alla riga di comando e ho trovato utile questo post

git rebase -i Head~2

Questo è un rebase interattivo e nota quanto segue:

  • ~ 2 qui si riferisce al numero di commit che si desidera coinvolgere in questa operazione, compreso l'attuale head
  • Devi modificare la finestra di modifica interattiva successiva, lasciare il primo elemento come "pick" e sostituire le righe successive con "squash". Le istruzioni nel collegamento sopra sono molto più chiare se questo è opaco.

Il post a cui ti colleghi riguarda la spiegazione più chiara che ho visto di squash e correzione. Grazie!
Simon Tewsi

0

Perché non chiedere a git stesso? Quando ribassi con git-bash, dice:

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

Come vedi:

s, squash = usa il commit, ma si fonde con il commit precedente

f, fixup = like "squash", ma elimina il messaggio di log di questo commit

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.