dvcs - è "clonare in un ramo" un flusso di lavoro comune?

9

Recentemente stavo discutendo di dvcs con un collega, perché il nostro ufficio sta iniziando a prendere in considerazione il passaggio da TFS (siamo un negozio di MS). Nel processo, sono diventato molto confuso perché ha detto che sebbene usi Mercurial, non aveva sentito parlare di un comando "branch" o "checkout", e questi termini non gli erano familiari. Dopo essersi chiesto come fosse possibile che non ne fosse a conoscenza e che spiegasse come i rami di dvcs funzionassero "in posizione" sui file locali, era piuttosto confuso.

Ha spiegato che, proprio come funziona TFS, quando vuole creare un "ramo" lo fa clonando, quindi ha una copia intera del suo repository. Mi è sembrato molto strano, ma il vantaggio, che devo ammettere, è che puoi guardare o lavorare su due rami contemporaneamente perché i file sono separati.

Nella ricerca di questo sito per vedere se questo è stato chiesto prima ho visto un commento che molte risorse online promuovono questa metodologia "da clone a ramo", allo sgomento del poster. È davvero comune nella comunità di dvcs? E quali sono alcuni dei pro e contro di andare in questo modo? Non lo farei mai visto che non ho bisogno di vedere più rami contemporaneamente, il passaggio è veloce e non ho bisogno che tutti i cloni riempiano il mio disco.

    
posta Tesserex 07.06.2012 - 17:17
fonte

3 risposte

3

A parte il vantaggio / svantaggio generale di poter vedere entrambi i rami, penso che ci sia un vantaggio specifico Mercurial nel farlo.

Se cloni di creare un ramo, puoi eliminare il clone in un secondo momento se non vuoi mantenere le tue modifiche. Se decidi di unirli, il fatto che tu abbia deciso di separare le tue modifiche in questo modo non è visibile a nessun altro.

Al contrario, se si utilizza hg branch per creare un nuovo ramo con nome, il nome del ramo viene registrato nella cronologia quando si commette, è visibile a tutti gli altri e deve essere abbastanza unico per evitare una potenziale confusione in seguito . Questo potrebbe non essere appropriato se il tuo ramo è per lo sviluppo di alcune funzionalità sperimentali o per una modifica che potrebbe rivelarsi piccola.

Se usi le branch nominate per mantenere le versioni rilasciate del tuo software e le usi per sviluppare funzionalità a breve termine o bugfix, è facile confondersi perché non c'è modo (oltre alle convenzioni di denominazione) per mantenere questi due tipi di rami separata.

Il link lo spiega in maggior dettaglio. Vale anche la pena ricordare che dal momento che Mercurial 1.8 è possibile creare un segnalibro ( hg bookmark ), un nome usa e getta per un ramo di breve durata. I segnalibri possono essere spinti, tirati, spostati e cancellati.

    
risposta data 07.06.2012 - 21:48
fonte
2

Ogni volta che esegui un commit in un DVCS stai tecnicamente facendo un ramo nella cronologia, ogni volta che lo rimandi al repository benedetto lo reintegri, ecco la parte interessante:

  • Se nessuno ha apportato modifiche durante il commit, non assomiglierà a un ramo nel DAG (grafico aciclico diretto)
  • Se qualcun altro ha apportato una modifica durante il commit, apparirà come un ramo nel DAG, solo senza nome

Ricorda il pulsante "fork" in Bitbucket / github ?, il biforcarsi può essere considerato come un sinonimo di diramazione e ciò che il pulsante "fork" fa è solo un clone di quel repository sul tuo account.

L'unico vantaggio di "clonare in un ramo" è poter lavorare contemporaneamente su due punti della cronologia e ironicamente per il tuo collega, è un flusso di lavoro comune per lavorare contemporaneamente su diversi rami (senza dover andare avanti e indietro).

Dì al tuo collega di imparare come ramo , è molto facile, qui, avere un tutorial:

D:\>mkdir lol

D:\>cd lol

D:\lol>hg init

D:\lol>hg branch
default

D:\lol>touch lol

D:\lol>hg add lol

D:\lol>hg commit -m "lol"

D:\lol>hg branch lol
marked working directory as branch lol
(branches are permanent and global, did you want a bookmark?)

D:\lol>hg branches
default                        0:35d562fafaf2

D:\lol>echo "lol" > lol

D:\lol>hg commit -m "New lol branch"

D:\lol>hg branches
lol                            1:9384f923e78d
default                        0:35d562fafaf2 (inactive)

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg update lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

D:\lol>hg update default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
default

D:\lol>hg merge lol
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

D:\lol>hg commit -m "lol merge"

D:\lol>hg branch
default

D:\lol>hg update lol
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branch
lol

"La clonazione al ramo" ha senso quando lavori in rami diversi allo stesso tempo , oppure, quando vuoi prova un esperimento senza creare un ramo permanente nella storia e sarà comunque in grado di integrarlo in un ramo già esistente.

Personalmente non mi piace questa pratica e preferisco fare rami e chiuderli se necessario. Ecco, ecco come lo fai:

D:\lol>hg branches
default                        2:46420aca1612
lol                            1:9384f923e78d (inactive)

D:\lol>hg branch
lol

D:\lol>hg commit --close-branch -m "Obai, glorious lol branch"

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branch
lol

D:\lol>hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\lol>hg branches
default                        2:46420aca1612

D:\lol>hg branches --closed
default                        2:46420aca1612
lol                            3:4b79c577e029 (closed)

Spero che questo chiarisca i dubbi sulla ramificazione di DVCS, qui i rami non sono più spaventosi.

    
risposta data 08.06.2012 - 01:53
fonte
0

Non mi preoccuperei personalmente del codice che riempie il mio disco ... prima di tutto, è solo codice, e in secondo luogo, non manterrai tutti i tuoi cloni in giro per sempre.

Questa metodologia è promossa in molte risorse online, specialmente per Hg. Non l'ho mai visto usato in produzione, negli ambienti CI è molto più comune avere branch di funzionalità di breve durata rispetto ai cloni di repository aggiuntivi. Non vedo il vantaggio di farlo, semmai renderà la tua storia più confusa, non meno, e non ti farà guadagnare nulla. Se vuoi guardare il tuo nuovo codice fianco a fianco con il vecchio codice puoi usare uno strumento diff / merge per guardare i due commit l'uno accanto all'altro, con l'ulteriore vantaggio che vedrai le tue modifiche evidenziate.

    
risposta data 07.06.2012 - 21:31
fonte

Leggi altre domande sui tag