2010-01-11 4 views
17

Я использую bzr для очень простой задачи: получить версию для разработки GNU Emacs. После начального bzr branch, я бы хотел обновить свою локальную версию. Я прочитал о документации по bzr pull и bzr merge, но не мог понять. Я пробовал bzr merge в течение нескольких дней и обнаружил, что bzr merge часто приводил к неразрешимым конфликтам. Обратите внимание, что я не внес никаких локальных изменений. Является ли bzr pull рекомендуемым способом?bzr pull vs bzr merge

EDIT 1 (добавлена ​​схема украденную из Chris Conway):

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

Я понимаю, мерзавец и Darcs, но не имеют знаний о Bzr. Аналогии с git или darcs помогут много.

EDIT 2: Is update Предполагается работать только с checkout? Выполнение update в branch, кажется, ничего не делает.

+1

Я удаление Emacs тегов и добавление контроля версий, так как это больше, чтобы сделать с этим самого Emacs. –

ответ

35

Отметьте, что я не делал никаких локальных изменений . Есть bzr pull Рекомендуемый способ ?

Да, это звучит как bzr pull - это подходящая команда для вашего использования. pull берет удаленную ветвь источника и копирует любые изменения из нее в локальную ветку назначения при более ранней версии. (Я использую «удаленный» и «местный» здесь означает «источник» и «назначение». Любые две ветви будут делать, даже две местные отделения.)

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

pull работает только тогда, когда две ветви гаванью» t расходится, т. е. если пересмотр адресата является старой ревизией источника. push - это просто противоположная операция: она копирует изменения в локальной ветви в удаленную ветку с более старой версией.

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

A merge используется, когда вы хотите скопировать изменения в местное отделение, которое расходилось от удаленного филиала.

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

Здесь Z включает в себя все изменения от D и изменений от Y. A pull в этом случае невозможно. Обратите внимание, что вы должны commit после merge, чтобы сохранить новую объединенную ревизию, в то время как pull автоматически приносит ветку в сохраненную точку пересмотра.

A checkout позволяет использовать bzr в режиме, аналогичном CVS/SVN: локальная ветка будет «прикреплена» к удаленной ветви; commit s будет автоматически push ред; если удаленная ветвь расходится, коммит будет терпеть неудачу; a update - всего лишь merge от «прикрепленной» удаленной ветви.

+0

Nice ascii art, спасибо. Что мне непонятно, почему «слияние» вызывает конфликты, даже если нет локальных изменений? –

+2

У вас возникают конфликты даже при первом «слиянии» или только после того, как вы «сменили» более одного раза? Вы «совершаете» после каждого «слияния»? Алгоритм слияния сложный, и то, что он может и не может решить без конфликтов, часто удивляет. –

+2

После того, как я «объединил» несколько раз. После каждого «слияния» я не выполнял «фиксацию». Теперь все это имеет смысл. –

4

Merge предназначен для объединения двух разных ветвей, а не копий (локальных и удаленных). Используйте тягу.

1

$ bzr help pull

Назначение: Включите эту ветку в зеркало другой ветви.

--overwrite Игнорировать различия между ветвями и безоговорочно перезаписать.

Если вы хотите заменить локальные изменения и хотите, чтобы ваша ветка соответствовала удаленной, используйте pull -overwrite. Это будет работать даже , если две ветви расходятся.

так что вы можете использовать:

$ bzr pull --overwrite

Смежные вопросы