Quando è il momento giusto per eliminare un feature branch di git?


88

Non voglio finire con 82 rami di funzionalità in giro , quindi mi chiedo quali siano i potenziali svantaggi della semplice eliminazione del ramo di funzionalità non appena lo unisco al master.

Flusso di lavoro:

git co -b feat-xyz
hack hack
git ci
hack some more
git ci
git co master
git merge feat-xyz
smoke test
git br -d feat-xyz

Eventuali problemi qui?


1
Direi nessun problema perché se ne hai davvero bisogno puoi sempre resuscitare il ramo cancellato in seguito.
slebetman

@slebetman Per quanto ne so un ramo cancellato non può essere resuscitato. Tuttavia, se il ramo è stato completamente unito al master prima di eliminarlo, non dovrebbe più esserci bisogno del ramo.
Simeon

1
@ Simeon Sì che puoi. Git non elimina mai i commit, quindi quando elimini il tuo ramo stai solo eliminando il suo nome. Per resuscitare un ramo cancellato devi solo ricordare l'ultima cosa che hai impegnato in quel ramo e puoi cercarlo git reflog. Quindi controlla l'hash
slebetman

@slebetman che sarà vero solo se il ramo è stato infine unito. se i commit vengono lasciati indietro, alla fine diventeranno irraggiungibili e saranno soggetti a garbage collection dopo un certo periodo di tempo. anche le voci nel reflog verranno eventualmente eliminate, hai circa 90 giorni per impostazione predefinita.
aureo

@ goldenratio: Qualche riferimento per questo?
Slebetman

Risposte:


61

L'eliminazione dopo l'unione è il solito modo. Questo è il motivo git branch -d yourbranchnameper cui verifica che il ramo sia completamente unito prima di eliminarlo.

Ci sono alcuni motivi che mi vengono in mente per mantenere un ramo in giro: potresti volerlo tenere nel caso in cui dovessi avere bug che tornano una volta in produzione, o potresti volere un record storico.

In entrambi i casi, hai la possibilità di taggare il capo del ramo prima di eliminarlo. Un tag è come un ramo in quanto è un puntatore a un commit, tranne per alcune piccole differenze: 1) la porcellana di solito non mostra i tag nei comandi esplorativi come git show-branch o tab-auto complete al checkout, 2) controllarne uno ti mette in una HEAD separata (non ref) 3) puoi lasciare un " messaggio di tagging ", che fa sì che il tag venga salvato come oggetto nell'object store come un commit.

In questo modo conservi la cronologia e, se hai bisogno di correggere i bug, ti consiglio di creare un nuovo ramo dal master per la correzione.


1
Il controllo di un tag imposta HEAD, ma non crea automaticamente un ramo. Una HEAD su un commit senza un branch è ciò che lo rende distaccato.
Binarian

1
Hai ragione, imposta HEAD su un commit id piuttosto che su un ref. Quella parte del mio OP non è corretta. Dovrei aggiornarlo.
masonk

96

Elimino dopo l'unione, ma faccio sempre a git merge --no-ff, per evitare l'avanzamento veloce in modo che la cronologia del ramo sia visibile sul grafico. Mi piace avere la cronologia di dove il ramo delle caratteristiche è partito dal ramo di sviluppo e dove si è unito di nuovo:

Unione con o senza avanzamenti rapidi

Questo è tratto da Un modello di ramificazione Git di successo di Vincent Driessen, un flusso di lavoro molto carino da usare con git che applico per la maggior parte dei miei progetti.


Questo è un altro bel modo per preservare la cronologia, perché puoi selezionare i commit che sono raggiungibili dalla funzionalità ma non dal master: rev ^ 1..rev ^ 2. Il rovescio della medaglia è che rovina qualsiasi rebase che potresti voler fare dal tuo ramo master (ad esempio, se vuoi mantenere il master rebase sul remoto a monte, il che è molto comune).
masonk

1
Non ho avuto quel problema. Il nostro team si sincronizza tramite GitHub e di solito non ho bisogno di rebase, ma non penso che qui sia uno svantaggio. Anche se ribasate il ramo di sviluppo e di funzionalità, il ramo rimane visibile sul grafico e ciò che conta è ciò che è nel ramo di funzionalità rispetto allo sviluppo, non il commit da cui siete partiti originariamente quando avete creato quel ramo.
lkraider

@ Ikraider, grazie per il promemoria. Ho visto quell'articolo quando stavo imparando git per la prima volta, ha più senso per me ora. Riassumo i miei rami di funzionalità, ma torno merge --no-ffal master perché come dici tu puoi vedere la cronologia.
bstpierre

7

Posso pensare a due motivi per cui potresti voler mantenere un ramo di funzionalità per un po ':

  • C'è una possibilità che ti venga restituito per altro lavoro a monte.
  • Altri sviluppatori potrebbero volere quella funzione senza volere tutto il resto in master.

In pratica, la maggior parte delle volte l'eliminazione dopo l'unione va benissimo.


6

Il flusso di lavoro tipico sarà

 // Create new branch
 $ git checkout -b myfeature
 // and then do some changes and commit them

 // Switch to master branch
 $ git checkout master

 // Merge myfeature to master. --no-ff will always keep branch information.
 $ git merge --no-ff myfeature

 // Delete myfeature branch
 $ git branch -d myfeature

 // Push the changes
 $ git push origin master

1

penso che sia il flusso di lavoro tipico (eliminazione dopo l'unione)

EDIT Quindi, piuttosto che unire, almeno per i rami di breve durata, penso che l'idea sia di ricondurli al master. quindi si finisce con una cronologia delle modifiche lineare e l'intero ramo diventa parte del tronco principale. in questo caso hai tutte le modifiche lì quindi chiaramente non hai bisogno di una copia.


Quindi non ha davvero senso mantenere il ramo in giro, giusto?
bstpierre

1
Consiglio vivamente di evitare il "rebase". La ribasatura è generalmente dannosa, utile solo in alcuni casi.
Dietrich Epp

9
Il rebasing è un flusso di lavoro perfettamente ragionevole per le tue filiali private locali. È molto comune mantenersi sincronizzati con il lavoro a monte, ad esempio, rebasing ("rebasing down "). È molto meno comune, e solitamente dannoso, ribasare su *. la risposta di second non ha davvero senso, perché sia ​​che tu stia ribasando o unendo modifiche a monte, devi comunque spingere quella roba "su" in qualche modo. Anche sul tuo ramo locale, dovrai unire la tua funzionalità per padroneggiarla ad un certo punto. Il vantaggio di rimanere ribasati sulle tue funzionalità è che questa unione diventa rapidamente avanti.
masonk

1
C'è qualcosa a cui prestare attenzione nel ribasare i rami, però, che mi ha colpito di recente. È ovvio ora, ma sono andato per mesi su un ramo longevo, ribasando sempre l'intera cosa contro il maestro. Sono finiti intorno a 600 commit piacevoli e granulari, ma master era stato completamente riformulato e completamente cambiato molte volte. Ribasando l'intero ramo ogni volta, stavo tagliando i suoi vecchi commit dalla loro connessione ai commit master che avevano senso per loro. Ora preferisco di gran lunga fondermi in master quando necessario. Ribase solo se la cronologia del ramo non sarà assolutamente influenzata.
Gary Fixler
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.