Domanda Squash la mia ultima X si commette insieme usando Git


Come posso schiacciare i miei ultimi X commit insieme in un commit usando Git?


2312
2018-03-04 04:11


origine


risposte:


Uso git rebase -i <after-this-commit> e sostituire "pick" sul secondo e successivi commit con "squash" o "fixup", come descritto in il manuale.

In questo esempio, <after-this-commit> è l'hash SHA1 o la posizione relativa dell'HEAD del ramo corrente dal quale vengono analizzati i commit per il comando rebase. Ad esempio, se l'utente desidera visualizzare 5 commit dall'attuale HEAD in passato, il comando è git rebase -i HEAD~5.


1267
2018-03-04 04:18



Puoi farlo abbastanza facilmente senza git rebase o git merge --squash. In questo esempio, schiacceremo gli ultimi 3 commit.

Se vuoi scrivere il nuovo messaggio di commit da zero, questo è sufficiente:

git reset --soft HEAD~3 &&
git commit

Se vuoi iniziare a modificare il nuovo messaggio di commit con una concatenazione dei messaggi di commit esistenti (cioè simile a quello di un pick / squash / squash / ... / squash git rebase -i l'elenco delle istruzioni potrebbe iniziare con), quindi è necessario estrarre quei messaggi e passarli a git commit:

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Entrambi questi metodi schiacciano gli ultimi tre commit in un singolo nuovo commit allo stesso modo. Il soft reset riporta nuovamente HEAD all'ultimo commit che non vuoi schiacciare. Né l'indice né l'albero di lavoro vengono toccati dal soft reset, lasciando l'indice nello stato desiderato per il nuovo commit (cioè ha già tutte le modifiche dai commit che stai per "buttare via").


2585
2018-03-05 04:19



Puoi usare git merge --squash per questo, che è leggermente più elegante di git rebase -i. Supponi di essere padrone e di voler schiacciare gli ultimi 12 commit in uno solo.

ATTENZIONE: prima assicurati di impegnare il tuo lavoro, controlla quello git status è pulito (dal git reset --hard butta via i cambiamenti in scena e non modificati)

Poi:

# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit

Il documentazione per git merge descrive il --squash opzione in modo più dettagliato.


Aggiornare: l'unico vero vantaggio di questo metodo rispetto al più semplice git reset --soft HEAD~12 && git commit suggerito da Chris Johnsen in la sua risposta è che ottieni il messaggio di commit prepopolato con ogni messaggio di commit che stai schiacciando.


572
2018-03-04 06:10



Raccomando di evitare git reset quando possibile - specialmente per i novizi Git. A meno che non sia veramente necessario automatizzare un processo basato su a numero di impegni, c'è un modo meno esotico ...

  1. Metti i commit da-schiacciare su un ramo funzionante (se non lo sono già) - usa gitk per questo
  2. Controlla il ramo di destinazione (ad esempio "master")
  3. git merge --squash (working branch name)
  4. git commit

Il messaggio di commit verrà prepopolato in base allo squash.


135
2018-03-14 23:24



Basato su La risposta di Chris Johnsen,

Aggiungi un alias globale "squash" da bash: (o Git Bash su Windows)

git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'

... o usando il prompt dei comandi di Windows:

git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Il tuo ~/.gitconfig dovrebbe ora contenere questo alias:

[alias]
    squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Uso:

git squash N

... che automaticamente schiaccia l'ultimo N commette, incluso.

Nota: il messaggio di commit risultante è una combinazione di tutti i commit schiacciati, nell'ordine. Se non sei soddisfatto, puoi sempre git commit --amendper modificarlo manualmente. (Oppure modifica l'alias in modo che corrisponda ai tuoi gusti).


97
2018-02-19 19:21



Se usi TortoiseGit, puoi utilizzare la funzione Combine to one commit:

  1. Apri il menu di scelta rapida TortoiseGit
  2. Selezionare Show Log
  3. Segna i commit rilevanti nella vista del registro
  4. Selezionare Combine to one commit dal menu di scelta rapida

Combine commits

Questa funzione esegue automaticamente tutti i passaggi necessari di git singoli. Sfortunatamente disponibile solo per Windows.


46
2017-11-06 12:51



Grazie a questo pratico post sul blog Ho scoperto che è possibile utilizzare questo comando per schiacciare gli ultimi 3 commit:

git rebase -i HEAD~3

Questo è utile in quanto funziona anche quando si è su una filiale locale senza informazioni di tracciamento / repo remoto.

Il comando aprirà l'editor rebase interattivo che ti consentirà di riordinare, schiacciare, riformulare, ecc. Come al solito.


46
2018-05-17 06:19



Basato su Questo articolo Ho trovato questo metodo più facile per il mio caso.

Il mio ramo 'dev' era più avanti di 'origin / dev' di 96 commit (quindi questi commit non erano ancora stati inviati al telecomando).

Volevo schiacciare questi commit in uno prima di spingere il cambiamento. Preferisco reimpostare il ramo nello stato di 'origine / dev' (questo lascerà tutte le modifiche da 96 commit non attivate) e quindi eseguire il commit delle modifiche contemporaneamente:

git reset origin/dev
git add --all
git commit -m 'my commit message'

29
2018-05-22 00:41



Per fare ciò puoi usare il seguente comando git.

 git rebase -i HEAD~n

n (= 4 qui) è il numero dell'ultimo commit. Poi hai le seguenti opzioni,

pick 01d1124 Message....
pick 6340aaa Message....
pick ebfd367 Message....
pick 30e0ccb Message....

Aggiornamento come muggito,

p 01d1124 Message....
s 6340aaa Message....
s ebfd367 Message....
s 30e0ccb Message....

Per dettagli clicca sul collegamento

In bocca al lupo!!


24
2018-04-06 05:26