Esiste in realtà una terza possibilità, e molto probabilmente molte altre, poiché GIT è più un'implementazione di un framework SCM che un'implementazione di una metodologia SCM. Questa terza possibilità è basata su rebase
.
Il rebase
sottocomando GIT accetta una serie di commit (in genere dal punto di diramazione alla punta del ramo di argomento topic
) e li riproduce altrove (in genere alla punta del ramo di integrazione, ad esempio master
). Il rebase
sottocomando produce nuovi commit, il che offre l'opportunità di riorganizzare i commit in una forma che è più facile da rivedere. Ciò produce una nuova serie di commit, simile a quello che topic
era una volta ma che appariva radicato nella parte superiore del ramo di integrazione. Questo nuovo ramo è ancora chiamato topic
da GIT, quindi il vecchio riferimento viene scartato. Etichetta in modo informale topic-0
lo stato originale della tua filiale topic-1
e così via i suoi vari refactoring.
Ecco il mio suggerimento per il tuo topic
ramo:
(Passaggio facoltativo) Reimpostare interattivamente il ramo dell'argomento topic
sul suo punto di diramazione (vedere l' --fixup
opzione per commit
e le opzioni -i
e --autosquash
su rebase
), che offre l'opportunità di riscrivere i commit in un modo che sia più facile da rivedere. Ciò si traduce in un ramo topic-1
.
Rifiuta il ramo tematico nella parte superiore del ramo di integrazione, è simile a un'unione, ma "non inquina" la storia con un'unione che è semplicemente un artefatto di ingegneria del software. Ciò si traduce in un ramo topic-2
.
Invia topic-2
a un compagno di squadra che lo rivede sulla punta di master
.
Se topic-2
va bene, quindi uniscilo al master.
NOTA I rami — dove ramo si riferisce all'albero di commit — saranno tutti chiamati uguali da GIT, quindi, alla fine del processo, solo il ramo topic-2
ha un nome in GIT.
Professionisti:
- Nessun codice obsoleto in revisione.
- Nessuna recensione falsa di "fusioni straniere" (il fenomeno che hai descritto al 1 °).
- L'opportunità di riscrivere si impegna in modo pulito.
Contro:
- Invece di un ramo
topic-0
, ci sono tre artefatti rami topic-0
, topic-1
e topic-2
che vengono creati nella struttura di commit. (Anche se in qualsiasi momento, solo uno di loro ha un nome in GIT.)
Nel tuo primo scenario «se qualcuno fondesse qualcosa tra" 1 " e "2." »si riferisce al tempo che intercorre tra la creazione del punto di diramazione e il momento in cui si decide di unire. In questo scenario «se qualcuno fondesse qualcosa tra" 1 " e "2." »si riferisce al tempo che intercorre tra il rebase e l'unione, che di solito è molto breve. Pertanto, nello scenario da me fornito, è possibile «bloccare» il master
ramo per il momento dell'unione senza disturbare in modo significativo il flusso di lavoro, mentre non è pratico nel 1 ° scenario.
Se stai facendo revisioni sistematiche del codice, è probabilmente una buona idea riorganizzare gli commit in modo adeguato (passaggio facoltativo).
La gestione degli artefatti del ramo intermedio presenta una difficoltà solo se li si condivide tra i repository.