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 rebasesottocomando 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 rebasesottocomando 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 topicera una volta ma che appariva radicato nella parte superiore del ramo di integrazione. Questo nuovo ramo è ancora chiamato topicda GIT, quindi il vecchio riferimento viene scartato. Etichetta in modo informale topic-0lo stato originale della tua filiale topic-1e così via i suoi vari refactoring.
Ecco il mio suggerimento per il tuo topicramo:
(Passaggio facoltativo) Reimpostare interattivamente il ramo dell'argomento topicsul suo punto di diramazione (vedere l' --fixupopzione per commite le opzioni -ie --autosquashsu 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-2a un compagno di squadra che lo rivede sulla punta di master.
Se topic-2va 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-2ha 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-1e topic-2che 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 masterramo 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.