2012-03-07 29 views
48

Come dice il titolo, non sono molto chiaro sulle differenze tra uno git merge --squash e uno git merge --no-commit.Differenze tra Git merge --squash e --no-commit

Per quanto riguarda la pagina di aiuto per git merge, entrambi i comandi mi lascerebbero in un albero di lavoro aggiornato, in cui è ancora possibile modificare e quindi eseguire un commit finale (o più commit).

Qualcuno potrebbe chiarire le differenze tra queste 2 opzioni? Quando dovrei usare uno invece dell'altro?

risposta

65
git merge --no-commit 

Questo è proprio come una normale unione ma non crea un merge-commit. Questo commit sarà un commit di unione: quando guardi la cronologia, il tuo commit apparirà come una normale unione.

git merge --squash 

Questo unirà le modifiche nel proprio albero di lavoro senza creare un commit di unione. Quando si commettono le modifiche unite, sembrerà un nuovo commit "normale" sul ramo: senza un commit di unione nella cronologia. È quasi come se tu avessi fatto un cherry-pick su tutte le modifiche unite.

+0

Quindi un merge-commit mostrerebbe come nella cronologia? Dal momento che posso modificare il messaggio di commit, come potrei vedere che si trattava di un merge-commit? – quaylar

+2

@quaylar Un merge-commit non è in realtà un commit speciale, tranne che ha più genitori. Puoi vedere i genitori per un commit, ad esempio con 'git log --parents' (e' git log --merges' mostra solo tali commit). –

+5

@PhilippWendler Quindi in sostanza: avendo un merge-commit che avrei sempre saputo guardando la cronologia, che questo commit era il risultato di un'unione (sono anche le informazioni che i rami hanno contribuito a questa fusione?). Usando --squash non c'è modo di sapere che questo commit è il risultato di una fusione. Lo capisco correttamente? – quaylar