2011-11-07 1 views
5

Leggendo su Mercurial, sembra sempre ramificare e unire i repository completi.In Mercurial, posso unire solo alcuni file tra due rami?

È possibile unire semplicemente alcuni file da un ramo all'altro? (Ad esempio, potrei semplicemente unirmi ai file che risolvono un determinato bug.)

Allo stesso modo posso selezionare alcuni set di modifiche, ma avere ancora un record di unione corretto, quindi se completo l'unione viene eseguita in un secondo momento. corretta?

Sto venendo da una "mentalità" forzata, quindi potrei pensare a questo nel modo sbagliato.

risposta

3

Leggendo su Mercurial, sembra sempre ramificare e unire i repository completi .

E 'possibile unire solo alcuni file da un ramo all'altro? (Per esempio posso solo desiderare di fondersi nei file che fissano una data bug.)

Basta toccare solo "alcuni file" in changeset necessario e si fondono ramo con questo changeset in testa con un altro ramo o trapianto in qualsiasi momento

Allo stesso modo posso ciliegio raccogliere alcuni set di cambiamento, ma hanno ancora un record di fusione corretta, quindi se mi completa unione viene fatto in seguito è corretto?

Sì, è possibile il trapianto | tutti i changeset a un altro ramo, lo stato applicato sarà ricordato e le modifiche non saranno duplicate nell'unione finale

+0

Grazie, non sapevo che i changeset così come i rami potevano essere uniti. Cosa succede se voglio solo alcuni file su un determinato changeset, o alcuni file da un certo numero di set di modifiche. (Sarebbe bello se ogni correzione fosse ben separata, tuttavia la vita reale non è sempre buona) –

+0

Alcuni file da changeset (s) non sono utilizzabili - tu ** sempre ** applica ** full changeset ** a un altro albero . Per cambiare il changeset in repo (maleducazione comunque) puoi dividerlo (mq, histedit) o ​​esportarlo come patch, modificare, applicare, ad esempio –

8

Sì, Mercurial dirama sempre e unisce l'intero albero. Non hai la "flessibilità" che qualcosa come perforce ti consente di selezionare singoli file per un'unione. Questa è una buona cosa (credimi). I changeset sono atomici (non puoi dividerli) e immutabili (non puoi cambiarli). Quindi questo ha bisogno di un po 'di cambiamento di mentalità.

I changeset devono essere assegnati a un task e solo a un'attività. Se stai correggendo un bug, nient'altro va nel changeset a parte la correzione del bug. Hai quindi un changeset che documenta la correzione dei bug e non hai il problema di volerlo dividere. Non avrebbe senso volerlo. Una mezza soluzione di bug è spesso peggio di nessuna correzione di bug.

Quando si tratta di fusione che ci sono un paio di opzioni:

  • Una scuola di pensiero dice che si dovrebbe tornare al punto in cui è stato introdotto il bug. Aggiustalo. Impegnati (creando un piccolo ramo anonimo) e uniscilo in avanti su qualunque cosa desideri (dev, stable, release, whatever). Tuttavia non è sempre pratico.
  • Un altro metodo è la correzione del bug nel ramo di rilascio e quindi l'unione con il ramo di sviluppo. Questo normalmente funziona bene.
  • In alternativa puoi ripararlo all'inizio del tuo ramo di sviluppo, ma poi se lo unisci al tuo ramo di rilascio porterai a termine tutte le tue modifiche di sviluppo. È qui che entra in gioco graft (new in 2.0) e l'estensione precedente transplant.Ti permettono di "selezionare con cura" un singolo o una serie di changeset da un altro ramo e posizionarli su un altro ramo.
+0

Facendo la distinzione che le correzioni di bug vadano nel ramo di rilascio mi ha davvero dato un momento di realizzazione. Grazie. –