2010-01-11 6 views
17

Sto usando bzr per un compito molto semplice: ottenere la versione di sviluppo di GNU Emacs. Dopo l'iniziale bzr branch, vorrei mantenere la versione locale aggiornata. Ho letto della documentazione su bzr pull e bzr merge, ma non ne ho avuto il senso. Ho provato bzr merge per alcuni giorni e ho riscontrato che bzr merge spesso si traduceva in conflitti irrisolvibili. Si noti che non ho apportato alcuna modifica locale. bzr pull nel modo consigliato?bzr pull vs bzr merge

EDIT 1 (aggiunto un diagramma rubato da Chris Conway):

remote: A --> B --> C --> D 
     \     \ 
     (branch)   (merge) 
      \     \ 
local:  \--> A (no change) \--> why conflicts? 

capisco git e darcs, ma non hanno alcuna conoscenza di bzr. Le analogie con git o darcs aiuteranno molto.

MODIFICA 2: È il update che deve funzionare solo con checkout? Fare un update in un branch non sembra fare nulla.

+1

sto rimuovendo il tag emacs e aggiungendo la versione di controllo dal momento che è più a che fare con quel Emacs stesso. –

risposta

35

Si noti che non sono state apportate modifiche locali a . È bzr pull il modo consigliato ?

Sì, sembra che bzr pull sia il comando appropriato per l'utilizzo. pull prende un ramo di origine remoto e copia eventuali modifiche da esso a un ramo di destinazione locale a una revisione precedente. (Io uso "a distanza" e "locale" qui il significato di "fonte" e "destinazione". Ogni due rami farà, anche due sezioni locali.)

remote: A --> B --> C --> D 
     \     \ 
     (branch)   (pull) 
      \     \ 
local:  \--> A (no change) \--> D 

Un pull funziona solo se i due rami rifugio' t divergenti, cioè se la revisione della destinazione è una vecchia revisione della sorgente. push è l'operazione opposta: copia le modifiche in un ramo locale a un ramo remoto con una revisione precedente.

remote: A  (no change)  --> C 
     \     /
     (branch)    (push) 
      \    /
local:  \--> A --> B --> C 

Un merge viene utilizzato quando si desidera copiare le modifiche a un ramo locale che si è discostato dal ramo remoto.

remote: A --> B --> C --> D 
     \     \ 
     (branch)   (merge) 
      \     \ 
local:  \--> A --> X --> Y --> Z 

Qui, Z include tutti i cambiamenti da D ei cambiamenti da Y. In questo caso non è possibile un pull. Si noti che è necessario commit dopo un merge per salvare la nuova revisione unita, mentre un pull porta automaticamente il ramo a un punto di revisione salvato.

A checkout A consente di utilizzare bzr in una modalità simile a CVS/SVN: il ramo locale verrà "collegato" a un ramo remoto; commit s sarà automaticamente push ed; se il ramo remoto è divergente, il commit fallirà; un update è solo un merge dal ramo remoto "collegato".

+0

Bella arte ascii, grazie. Ciò che non mi è chiaro, è perché l'unione genera conflitti anche se non ci sono cambiamenti locali? –

+2

Hai conflitti anche nel primo 'unire ', o solo dopo averli' uniti più volte? Ti impegni dopo ogni operazione di unione? L'algoritmo di fusione è complicato e ciò che può e non può risolvere senza conflitti è spesso sorprendente. –

+2

Dopo l'unione di più di una volta. Non ho eseguito il commit dopo ogni operazione di unione. Tutto ciò ha senso ora. –

4

Unisci consente di unire due rami diversi, non copie (locali e remote). Usa pull.

1

$ bzr help pull

Scopo: Trasforma questo ramo in uno specchio di un altro ramo.

--overwrite Ignora le differenze tra i rami e sovrascrive incondizionatamente.

Se si desidera sostituire le modifiche locali e si desidera che il ramo corrisponda a quello remoto, utilizzare pull --overwrite. Funzionerà anche se i due rami sono divergenti.

in modo da poter utilizzare:

$ bzr pull --overwrite