2010-01-11 11 views
17

Estoy usando bzr para una tarea muy simple: obtener la versión de desarrollo de GNU Emacs. Después de la inicial bzr branch, me gustaría mantener mi versión local actualizada. Leí sobre la documentación en bzr pull y bzr merge, pero no pude encontrarle sentido. Intenté bzr merge durante unos días y descubrí que bzr merge solía provocar conflictos no resueltos. Tenga en cuenta que no hice ningún cambio local. ¿Es bzr pull la forma recomendada?bzr pull vs bzr merge

EDIT 1 (añadió un diagrama robado de Chris Conway):

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

I entender Git y darcs, pero no tienen ningún conocimiento sobre bzr. Las analogías con git o darcs ayudarán mucho.

EDIT 2: ¿Es update supone que funciona sólo con checkout? Hacer un update en un branch no parece hacer nada.

+1

estoy quitando la etiqueta emacs y la adición de control de versiones, ya que es más que ver con que el propio Emacs. –

Respuesta

35

Tenga en cuenta que no realicé ningún cambio local de . ¿Es bzr pull la forma recomendada ?

Sí, parece que bzr pull es el comando adecuado para su uso. pull toma una rama fuente remota y copia cualquier cambio de ella a una rama de destino local en una revisión anterior. (Yo uso "a distancia" y "local" aquí significa "fuente" y "destino". Cualquiera de las dos ramas van a hacer, incluso dos ramas locales.)

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

Un pull sólo funciona si las dos ramas paraíso' t divergió, es decir, si la revisión del destino es una revisión antigua de la fuente. push es exactamente la operación opuesta: copia los cambios en una sucursal local en una sucursal remota en una revisión anterior.

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

Un merge se utiliza cuando se desea copiar los cambios en una rama local que ha divergido de la rama remota.

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

Aquí, Z incluye todos los cambios de D y los cambios de Y. A pull no es posible en este caso. Tenga en cuenta que debe commit después de merge para guardar la nueva revisión combinada, mientras que una extracción lleva automáticamente la rama a un punto de revisión guardado.

A checkout le permite usar bzr en un modo que es similar a CVS/SVN: la rama local se "conectará" a una sucursal remota; commit s será automáticamente push ed; si la rama remota ha divergido, la confirmación fallará; un update es solo un merge desde la rama remota "adjunta".

+0

Nice ascii art, gracias. Lo que no me queda claro es por qué 'merge' causa conflictos incluso si no hay cambios locales. –

+2

¿Tienes conflictos incluso en la primera 'fusión', o solo después de que' hayas 'fusionado más de una vez? ¿'Commit'' después de cada' merge'? El algoritmo de fusión es complicado, y lo que puede y no puede resolver sin conflictos es a menudo sorprendente. –

+2

Después de 'fundir'd más de una vez. No 'cometí' después de cada 'fusión '. Todo esto tiene sentido ahora. –

4

Merge es para unir dos ramas diferentes, no copias (local y remota). Usar extracción.

1

$ bzr help pull

Propósito: Activar esta rama en un espejo de la otra rama.

--overwrite Ignora las diferencias entre ramas y sobrescribe incondicionalmente.

Si desea reemplazar los cambios locales y solo desea que su rama coincida con la remota, use pull --overwrite. Esto funcionará incluso si las dos ramas han divergido.

esta manera puede utilizar:

$ bzr pull --overwrite

Cuestiones relacionadas