Il motivo principale da quello che posso vedere è il seguente:
- L'interfaccia utente di GitHub per l'unione delle richieste pull attualmente (ottobre 2015) non consente di modificare la prima riga del messaggio di commit, forzandolo
Merge pull request #123 from joebloggs/fix-snafoo
- L'interfaccia utente di GitHub per la navigazione nella cronologia di commit attualmente non consente di visualizzare la cronologia della filiale dal
--first-parent
punto di vista
- L'interfaccia utente di GitHub per guardare la colpa su un file attualmente non ti consente di visualizzare la colpa del file con il
--first-parent
punto di vista (nota che questo è stato risolto solo in Git 2.6.2, quindi potremmo perdonare GitHub per non averlo a disposizione)
Quindi, quando si combinano tutte e tre queste situazioni sopra, si ottiene una situazione in cui i commit non eliminati si uniscono brutti dall'interfaccia utente di GitHub.
La tua storia con commit schiacciati avrà un aspetto simile
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... Hotfix for android display issue
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... Implemented pop-up to select language
Considerando che senza impegni schiacciati la storia avrà un aspetto simile
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... hotfix for #5849564648
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Quando hai un sacco di commit in una traccia PR in cui è avvenuta una modifica può diventare un po 'un incubo se ti limiti a utilizzare l'interfaccia utente di GitHub .
Ad esempio, trovi un puntatore nullo che viene de-referenziato da qualche parte in un file ... quindi dici "chi è stato e quando? Quali versioni di versione sono interessate?". Quindi ti avvicini alla vista della colpa nell'interfaccia utente di GitHub e vedi che la linea è stata cambiata789fdfffdf
... "oh, ma aspetta un secondo, quella riga stava appena cambiando il suo rientro per adattarsi al resto del codice", quindi ora devi navigare nello stato dell'albero per quel file nel commit genitore e visitare nuovamente la pagina della colpa ... alla fine trovi il commit ... è un commit di 6 mesi fa ... "oh **** questo potrebbe influenzare gli utenti per 6 mesi" dici ... ah ma aspetta, quel commit era in realtà in una richiesta pull ed è stato unito solo ieri e nessuno ha ancora rilasciato un comunicato ... "Accidenti a voi per aver unito i commit senza schiacciare la storia" è il grido che di solito può essere ascoltato dopo circa 2 o 3 spedizioni di codice archeologico tramite il Interfaccia utente di GitHub
Ora consideriamo come funziona se usi la riga di comando Git (e la super 2.6.2 che ha la correzione per git blame --first-parent
)
- Se si utilizzava la riga di comando Git, si sarebbe in grado di controllare completamente il messaggio di commit unione e quindi il commit unione potrebbe avere una bella riga di riepilogo.
Quindi la nostra cronologia di commit sarebbe simile
$ git log
1256556316... #423 Added new slideshow feature
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... #324 Hotfix for android display issue
787g8fgf78... hotfix for #5849564648
f56556316e... #28 Implemented pop-up to select language
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Ma possiamo anche fare
$ git log --first-parent
1256556316... #423 Added new slideshow feature
56556316ad... #324 Hotfix for android display issue
f56556316e... #28 Implemented pop-up to select language
(In altre parole: la Gi CLI ti consente di avere la tua torta e mangiarla anche tu)
Ora, quando colpiamo il problema del puntatore nullo ... beh, lo usiamo git blame --first-parent -w dodgy-file.c
e ci viene dato immediatamente il commit esatto in cui il de-riferimento del puntatore null è stato introdotto nel ramo master ignorando le semplici modifiche degli spazi bianchi.
Naturalmente se stai eseguendo le fusioni utilizzando l'interfaccia utente di GitHub, allora git log --first-parent
è davvero scadente grazie a GitHub che impone la prima riga del messaggio di commit unione:
1256556316... Merge pull request #423 from jrandom/add-slideshows
56556316ad... Merge pull request #324 from ahacker/fix-android-display
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
Quindi, per farla breve:
L'interfaccia utente di GitHub (ottobre 2015) presenta una serie di carenze nel modo in cui unisce le richieste pull, in che modo presenta la cronologia del commit e in che modo attribuisce le informazioni sulla colpa. L'attuale modo migliore per aggirare questi difetti nell'interfaccia utente di GitHub è richiedere alle persone di eliminare i propri impegni prima di unirsi.
L'interfaccia della riga di comando di Git non presenta questi problemi e puoi facilmente scegliere quale vista vuoi vedere, così puoi scoprire sia il motivo per cui una particolare modifica è stata fatta in quel modo (guardando la cronologia dei commit non annullati) sia vedere gli commit effettivamente schiacciati.
Post Script
L'ultimo motivo spesso citato per i commit di compressione è quello di rendere più semplice il backport ... se hai solo un commit per il back port (cioè il commit schiacciato) allora è facile scegliere ...
Bene, se stai guardando la storia di git con git log --first-parent
allora puoi semplicemente scegliere la commit di fusione. La maggior parte delle persone si confondono con la raccolta delle ciliegie. I commit di merge perché devi specificare l' -m N
opzione ma se hai ricevuto il commit git log --first-parent
allora sai che è il primo genitore che vuoi seguire, quindi saràgit cherry-pick -m 1 ...