Il motivo principale da ciò che posso vedere è il seguente:
- L'interfaccia utente GitHub per la fusione delle richieste pull attualmente (ottobre 2015) non consente di modificare la prima riga del messaggio di commit, forzandolo a essere
Merge pull request #123 from joebloggs/fix-snafoo
- L'interfaccia utente di GitHub per la navigazione nella cronologia dei commit attualmente non ti consente di visualizzare la cronologia del ramo dal punto di vista di
--first-parent
- L'interfaccia utente di GitHub per la visualizzazione della colpa su un file al momento non ti consente di visualizzare la colpa del file con il punto di vista di
--first-parent
(nota che questo problema è stato corretto solo in Git 2.6.2, quindi abbiamo potuto perdona GitHub per non averlo disponibile)
Quindi, quando combini tutte e tre queste situazioni sopra, ottieni una situazione in cui i commit non sincronizzati in fase di unione risultano brutti dall'interfaccia utente di GitHub.
La cronologia con commit compressi sarà simile a
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
Mentre senza i commit schiacciati la cronologia sarà simile a
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 un tracciamento del PR in cui un cambiamento è entrato può diventare un po 'un incubo se ti limiti a utilizzare l'interfaccia utente di GitHub .
Ad esempio, si trova un puntatore nullo che viene de-referenziato da qualche parte in un file ... quindi si dice "chi ha fatto questo e quando? quali versioni sono interessate?". Poi vai alla vista della colpa nell'interfaccia utente di GitHub e vedi che la linea è stata cambiata in 789fdfffdf
... "oh, ma aspetta un secondo, quella linea stava 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 rivedere la pagina della colpa ... alla fine trovi il commit ... è un commit di 6 mesi fa ..." oh **** questo potrebbe interessare gli utenti per 6 mesi "tu dici ... ah ma aspetta, quell'impegno era in realtà in una richiesta di pull ed è stato fuso solo ieri e nessuno ha ancora rilasciato una liberatoria ..." Accidenti a voi gente per la fusione dei commit senza distruggere la cronologia "è il grido che di solito può essere ascoltato dopo circa 2 o 3 spedizioni di archeologia in codice tramite l'interfaccia utente di GitHub
Ora consideriamo come funziona se usi la riga di comando di Git (e il super-fantastico 2.6.2 che ha la correzione per git blame --first-parent
)
- Se si stesse usando la riga di comando di Git, si sarebbe in grado di controllare completamente il messaggio di commit di merge e quindi il commit di merge potrebbe avere una bella riga di riepilogo.
Quindi la nostra cronologia dei commit sarà simile a
$ 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 Git CLI ti permette di avere la tua torta e di mangiarla anche tu)
Ora, quando rileviamo il problema con il puntatore nullo ... beh, usiamo solo git blame --first-parent -w dodgy-file.c
e ci viene immediatamente assegnato il commit esatto in cui il de-riferimento del puntatore nullo è stato introdotto al ramo master ignorando le semplici modifiche dello spazio bianco.
Ovviamente se stai facendo unioni usando l'interfaccia utente di GitHub allora git log --first-parent
è davvero schifoso grazie a GitHub che impone la prima riga del messaggio di commit di fusione:
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 GitHub (ottobre 2015) presenta una serie di carenze relative al modo in cui unisce le richieste di pull, come presenta la cronologia del commit e come attribuisce le informazioni di biasimo. L'attuale modo migliore per aggirare questi difetti nell'interfaccia utente di GitHub è di richiedere alle persone di reprimere i loro commit prima di unirli.
La Git CLI non ha questi problemi e puoi facilmente scegliere quale vista vuoi vedere in modo che tu possa entrambi scoprire il motivo per cui un particolare cambiamento è stato fatto in quel modo (osservando la cronologia dei commit non soddisfatti) così come vedere i commit effettivamente schiacciati.
Post script
Il motivo finale spesso citato per il commit dello schiacciamento è rendere il backporting più facile ... se si ha solo un commit alla back port (cioè il commit schiacciato), allora è facile scegliere come ...
Bene, se stai guardando la cronologia git con git log --first-parent
, puoi semplicemente selezionare i commit di unione. La maggior parte delle persone si confonde Il cherry picking merge perché devi specificare l'opzione -m N
ma se hai ottenuto il commit da git log --first-parent
allora sai che è il primo genitore che vuoi seguire in questo modo sarà git cherry-pick -m 1 ...