2010-01-11 47 views
17

我使用bzr进行一项非常简单的任务:获取GNU Emacs的开发版本。在最初的bzr branch之后,我想让我的本地版本保持最新状态。我阅读了关于bzr pullbzr merge的文档,但无法理解。我试了bzr merge几天,发现bzr merge通常导致无法解决的冲突。请注意,我没有进行任何本地更改。推荐的方式是bzr pullbzr拉vs bzr合并

EDIT 1(添加从Chris Conway被盗图):

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

我明白Git和的darcs,但没有关于BZR知识。类比git或darcs会有很大帮助。

编辑2:是update应该只与checkout一起使用?在branch中做update似乎没有做任何事情。

+1

我取出emacs的标签并添加版本控制,因为它更多的是与Emacs的本身。 – 2010-01-12 14:09:39

回答

35

请注意,我没有做出任何本地 的更改。是bzr pull推荐的 的方式?

是的,它听起来像是bzr pull是适合您使用的命令。 pull需要一个远程源分支,并将其中的任何更改复制到较旧版本的本地目标分支。 (我用“远程”和“本地”在这里的意思是“源”和“目的地”。任何两个分支都行,甚至是两个地方分支机构)。

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

一个pull只有工作,如果两个分支避风港”如果目的地的修改是源的旧修订版,那么它就会发生分歧。 push只是相反的操作:它将本地分支中的更改复制到旧版本的远程分支。当你要复制的变化已经从远程分支分出一个本地分支

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

一个merge使用。

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

这里,Z包括所有的从D的变化和从Y的变化。 A pull在这种情况下是不可能的。请注意,在merge之后您必须commit才能保存新的合并修订,而拉动会自动将分支移至保存的修订点。

A checkout允许您在类似于CVS/SVN的模式下使用bzr:本地分支将“附加”到远程分支; commit s会自动push ed;如果远程分支发散,则提交将失败; update只是来自“附属的”远程分支的merge

+0

不错的ascii艺术,谢谢。我不明白为什么'合并'会导致冲突,即使没有本地变更? – 2010-01-12 07:18:06

+2

即使在第一次“合并”时,或者只是在多次合并之后才会发生冲突吗?你在每次“合并”之后提交吗?合并算法很复杂,而且它没有冲突就能解决并且无法解决的问题通常令人惊讶。 – 2010-01-12 14:02:37

+2

我不止一次合并了。每次合并后我都没有提交。这一切现在都有道理。 – 2010-01-12 16:33:07

4

合并用于合并两个不同分支,而不是副本(本地和远程)。 使用拉。