Differences between revisions 6 and 7
Revision 6 as of 2009-10-20 03:14:03
Size: 12661
Editor: JamesFang
Comment:
Revision 7 as of 2009-10-20 03:18:06
Size: 12576
Editor: JamesFang
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
Mercurial's decentralized development model can be confusing to new users. This page attempts to illustrate some of the basic concepts.
See the [[Tutorial]] for step-by-step instructions.中文翻译

''(Translations:
[[BrazilianPortugueseUnderstandingMercurial|Brazilian Portuguese]],
[[ChineseUnderstandingMercurial|中文(简体)]],
[[FrenchUnderstandingMercurial|French]],
[[GermanUnderstandingMercurial|German]],
[[ItalianUnderstandingMercurial|Italian]],
[[JapaneseUnderstandingMercurial|Japanese]],
[[KoreanUnderstandingMercurial|Korean]],
[[RussianUnderstandingMercurial|Russian]],
[[SpanishUnderstandingMercurial|Spanish]],
[[ThaiUnderstandingMercurial|Thai]]
)''
Mercurial's decentralized development model can be confusing to new users. This page attempts to illustrate some of the basic concepts. See the [[Tutorial]] for step-by-step instructions.中文翻译

''(Translations: [[BrazilianPortugueseUnderstandingMercurial|Brazilian Portuguese]], [[ChineseUnderstandingMercurial|中文(简体)]], [[FrenchUnderstandingMercurial|French]], [[GermanUnderstandingMercurial|German]], [[ItalianUnderstandingMercurial|Italian]], [[JapaneseUnderstandingMercurial|Japanese]], [[KoreanUnderstandingMercurial|Korean]], [[RussianUnderstandingMercurial|Russian]], [[SpanishUnderstandingMercurial|Spanish]], [[ThaiUnderstandingMercurial|Thai]] )''
Line 21: Line 8:
Line 48: Line 34:

store保存了项目'''完整的'''历史记录. 与传统的[[版本控制系统|SCMs]]不同的是, where there's only one central copy of this history,
every working directory is paired with a private copy of the history. This allows development to go on in parallel.
store保存了项目'''完整的'''历史记录. 与传统的[[版本控制系统|SCMs]]不同的是, where there's only one central copy of this history,  every working directory is paired with a private copy of the history. This allows development to go on in parallel.
Line 57: Line 41:

When you [[Commit|commit]], the state of the working directory relative to its [[Parent|parents]] is recorded as a new [[ChangeSet|changeset]] (also called a new "[[Revision|revision]]"):
[[Commit|提交]]操作后,工作目录的 [[Parent|parents]] 就成了刚刚提交的新的 [[ChangeSet|changeset]] (也称为新 "[[Revision|版本]]"):
When you [[Commit|commit]], the state of the working directory relative to its [[Parent|parents]] is recorded as a new [[ChangeSet|changeset]] (also called a new "[[Revision|revision]]"): [[Commit|提交]]操作后,工作目录的 [[Parent|parents]] 就成了刚刚提交的新的 [[ChangeSet|changeset]] (也称为新 "[[Revision|版本]]"):
Line 87: Line 69:
Line 91: Line 72:

Mercurial groups related changes to multiple files into single atomic [[ChangeSet|changesets]], which are revisions of the whole project.
These each get a sequential [[RevisionNumber|revision number]]. Because Mercurial allows distributed parallel development, these revision numbers may disagree between users. So Mercurial also assigns each revision a global [[ChangeSetID|changeset ID]]. Changeset IDs are 40-digit hexadecimal numbers, but they can be abbreviated to any unambiguous prefix, like "e38487".

Mercurial中多个文件的相关修改称为[[ChangeSet|变更集]], 每个revision对应一个变更集.
每个变更集会分配一个递增的整数 [[RevisionNumber|版本号]]. 在分布式开发过程中, 各个用户的版本号会产生冲突. 因此每个变更及也会被分配一个全局唯一的[[ChangeSetID|变更集ID]]. 变更集ID是四十位的16进制数字, 如果前缀相同,也可以省略前缀,简写成"e38487"的形式.
Mercurial groups related changes to multiple files into single atomic [[ChangeSet|changesets]], which are revisions of the whole project.  These each get a sequential [[RevisionNumber|revision number]]. Because Mercurial allows distributed parallel development, these revision numbers may disagree between users. So Mercurial also assigns each revision a global [[ChangeSetID|changeset ID]]. Changeset IDs are 40-digit hexadecimal numbers, but they can be abbreviated to any unambiguous prefix, like "e38487".

Mercurial中多个文件的相关修改称为[[ChangeSet|变更集]], 每个revision对应一个变更集.  每个变更集会分配一个递增的整数 [[RevisionNumber|版本号]]. 在分布式开发过程中, 各个用户的版本号会产生冲突. 因此每个变更及也会被分配一个全局唯一的[[ChangeSetID|变更集ID]]. 变更集ID是四十位的16进制数字, 如果前缀相同,也可以省略前缀,简写成"e38487"的形式.
Line 121: Line 99:

Branches and [[Merge|merges]] in the revision history can occur at any point. Each unmerged branch creates a new [[Head|head]] of the revision history.
可以再任何时候进行分支和[[Merge|合并]]操作. 每个未合并的分支会创建一个新的[[Head|head]].

Here, revisions 5 and 6 are heads. Mercurial considers revision 6 to be the [[Tip|tip]] of the repository, the head with the highest revision number.
上图中的rev 5和rev 6是head. 版本号最大的head被称为[[Tip|tip]], 如上图中的rev 6.
rev 4有''两个''parent(rev 2 和rev 3),它是个[[MergeChangeset|合并变更集]].
Branches and [[Merge|merges]] in the revision history can occur at any point. Each unmerged branch creates a new [[Head|head]] of the revision history. 可以再任何时候进行分支和[[Merge|合并]]操作. 每个未合并的分支会创建一个新的[[Head|head]].

Here, revisions 5 and 6 are heads. Mercurial considers revision 6 to be the [[Tip|tip]] of the repository, the head with the highest revision number. 上图中的rev 5和rev 6是head. 版本号最大的head被称为[[Tip|tip]], 如上图中的rev 6. rev 4有''两个''parent(rev 2 和rev 3),它是个[[MergeChangeset|合并变更集]].
Line 130: Line 104:
Line 141: Line 114:
Line 152: Line 124:
Line 165: Line 136:
Line 177: Line 147:

Bob then [[Pull|pulls]] Alice's repo to synchronize. This copies all of Alice's changes into Bob's repository store
(here, it's just a single change g). Note that Bob's working directory is '''not''' changed
by the pull:
Bob使用[[Pull|pulls]]操作将Alice的repo同步到本地. 这个操作将Alice的所有修改集更新到Bob的repository store中
(这个例子中只有一个修改集g). 需要注意的是,这个操作并 '''没有''' 更改Bob的工作目录:
Bob then [[Pull|pulls]] Alice's repo to synchronize. This copies all of Alice's changes into Bob's repository store (here, it's just a single change g). Note that Bob's working directory is '''not''' changed by the pull: Bob使用[[Pull|pulls]]操作将Alice的repo同步到本地. 这个操作将Alice的所有修改集更新到Bob的repository store中 (这个例子中只有一个修改集g). 需要注意的是,这个操作并 '''没有''' 更改Bob的工作目录:
Line 196: Line 161:

Because Alice's '''g''' is the newest head in Bob's repository, it's now the '''tip'''.
因为Alice's '''g''' 版本是最新的head, 因此此版本也是 '''tip'''.

Bob then does a [[Merge|merge]], which combines the last change he was working on (f) with the
tip in his repository. Now, his working directory has two parent revisions (f and g):
Bob随后进行了 [[Merge|合并]] 操作, 将其本地修改(f)与repository中的tip进行合并. 这时, 他的工作目录具有两个parent(f和g):
Because Alice's '''g''' is the newest head in Bob's repository, it's now the '''tip'''. 因为Alice's '''g''' 版本是最新的head, 因此此版本也是 '''tip'''.

Bob then does a [[Merge|merge]], which combines the last change he was working on (f) with the tip in his repository. Now, his working directory has two parent revisions (f and g): Bob随后进行了 [[Merge|合并]] 操作, 将其本地修改(f)与repository中的tip进行合并. 这时, 他的工作目录具有两个parent(f和g):
Line 219: Line 179:

After examining the result of the merge in his working directory and making sure the merge is
perfect, Bob commits the result and ends up with a new [[MergeChangeset|merge changeset]] h in his
store:
查看并确认合并操作成功后, Bob提交合并结果,得到了一个新的 [[MergeChangeset|合并变更集]] h:
After examining the result of the merge in his working directory and making sure the merge is perfect, Bob commits the result and ends up with a new [[MergeChangeset|merge changeset]] h in his store: 查看并确认合并操作成功后, Bob提交合并结果,得到了一个新的 [[MergeChangeset|合并变更集]] h:
Line 241: Line 197:

Now if Alice '''pulls''' from Bob, she will get Bob's changes e, f, and h into her store:
现在,如果Alice '''pulls''' from Bob, 她会得到Bob的变更e, f和h:
Now if Alice '''pulls''' from Bob, she will get Bob's changes e, f, and h into her store: 现在,如果Alice '''pulls''' from Bob, 她会得到Bob的变更e, f和h:
Line 261: Line 215:

Note that Alice's working directory was not changed by the pull. She has to do an [[Update|update]] to synchronize
her working directory to the merge changset h. This changes the parent changeset of her working directory to
changeset h and updates the files in her working directory to revision h.
Note that Alice's working directory was not changed by the pull. She has to do an [[Update|update]] to synchronize her working directory to the merge changset h. This changes the parent changeset of her working directory to changeset h and updates the files in her working directory to revision h.
Line 282: Line 233:
Line 285: Line 235:
Line 287: Line 236:

Mercurial is a completely decentralized system, and thus has no internal notion of a central repository. Thus users are free to define their own topologies for sharing changes (see CommunicatingChanges):
Mercurial是一个完全的分布式系统, 因此没有所谓的集中式repository概念. 这也意味着用户可以自由的定义协同工作的组织结构 (参阅 CommunicatingChanges):
Mercurial is a completely decentralized system, and thus has no internal notion of a central repository. Thus users are free to define their own topologies for sharing changes (see CommunicatingChanges): Mercurial是一个完全的分布式系统, 因此没有所谓的集中式repository概念. 这也意味着用户可以自由的定义协同工作的组织结构 (参阅 CommunicatingChanges):
Line 308: Line 255:

Unlike a centralized version control system in which experimentation
can be disastrous, with a DVCS like Mercurial, you just clone and
experiment. If you like the results, push them back, otherwise
wipe the cloned repository and try something else.
在一个集中式版本管理系统中提交实验性的修改可能会造成较大的负面影响, 但对于Mercurial之类的DVCS来说, 可以肆意的进行试验性操作,
大不了删除本地工作目录,因为在别的地方还有若干。
Unlike a centralized version control system in which experimentation  can be disastrous, with a DVCS like Mercurial, you just clone and  experiment. If you like the results, push them back, otherwise  wipe the cloned repository and try something else. 在一个集中式版本管理系统中提交实验性的修改可能会造成较大的负面影响, 但对于Mercurial之类的DVCS来说, 可以肆意的进行试验性操作, 大不了删除本地工作目录,因为在别的地方还有若干。
Line 317: Line 258:

Many SVN/CVS users expect to host related projects together in one repository. This is really not what hg was made for, so you should try a different way of working. This especially means, that you cannot check out only one directory of a repository.
SVN/CVS用户会将多个相关的项目放在同一个repository里. This is really not what hg was made for, so you should try a different way of working. 也就是说,只能签出整个repository,而不是其中的某个目录.
If you absolutely need to host multiple projects in a kind of meta-repository though, you could try the [[subrepos|Subrepositories]] feature that was introduced with Mercurial 1.3 or the older ForestExtension.
如果确实想要将多个项目放在同一个repository中, 可以使用1.3版本中的[[subrepos|Subrepositories]] 功能或者更老版本的ForestExtension.
Many SVN/CVS users expect to host related projects together in one repository. This is really not what hg was made for, so you should try a different way of working. This especially means, that you cannot check out only one directory of a repository. SVN/CVS用户会将多个相关的项目放在同一个repository里. This is really not what hg was made for, so you should try a different way of working. 也就是说,只能签出整个repository,而不是其中的某个目录. If you absolutely need to host multiple projects in a kind of meta-repository though, you could try the [[subrepos|Subrepositories]] feature that was introduced with Mercurial 1.3 or the older ForestExtension. 如果确实想要将多个项目放在同一个repository中, 可以使用1.3版本中的[[subrepos|Subrepositories]] 功能或者更老版本的ForestExtension.

Mercurial's decentralized development model can be confusing to new users. This page attempts to illustrate some of the basic concepts. See the Tutorial for step-by-step instructions.中文翻译

(Translations: Brazilian Portuguese, 中文(简体), French, German, Italian, Japanese, Korean, Russian, Spanish, Thai )

What's in a Repository

Mercurial repositoriesworking directory (工作目录)内部包含了store:

store保存了项目完整的历史记录. 与传统的SCMs不同的是, where there's only one central copy of this history, every working directory is paired with a private copy of the history. This allows development to go on in parallel.

working directory记录的是项目文件在某个时间点的状态(比如上图中的rev 2). Mercurial中的标签ignored files 也被版本控制,所以他们也包括在上图中.

Mercurial中的每个版本和工作目录都有parent,比如上图中rev 2的parent是rev 1,而工作目录的parent是rev 2.

Committing Changes

When you commit, the state of the working directory relative to its parents is recorded as a new changeset (also called a new "revision"): 提交操作后,工作目录的 parents 就成了刚刚提交的新的 changeset (也称为新 "版本"):

上图中的re 4是rev 2的一个分支, 同时工作目录的版本也更新为rev 4. 现在rev 4是工作目录的parent.

Revisions, Changesets, Heads, and Tip

Mercurial groups related changes to multiple files into single atomic changesets, which are revisions of the whole project. These each get a sequential revision number. Because Mercurial allows distributed parallel development, these revision numbers may disagree between users. So Mercurial also assigns each revision a global changeset ID. Changeset IDs are 40-digit hexadecimal numbers, but they can be abbreviated to any unambiguous prefix, like "e38487".

Mercurial中多个文件的相关修改称为变更集, 每个revision对应一个变更集. 每个变更集会分配一个递增的整数 版本号. 在分布式开发过程中, 各个用户的版本号会产生冲突. 因此每个变更及也会被分配一个全局唯一的变更集ID. 变更集ID是四十位的16进制数字, 如果前缀相同,也可以省略前缀,简写成"e38487"的形式.

Branches and merges in the revision history can occur at any point. Each unmerged branch creates a new head of the revision history. 可以再任何时候进行分支和合并操作. 每个未合并的分支会创建一个新的head.

Here, revisions 5 and 6 are heads. Mercurial considers revision 6 to be the tip of the repository, the head with the highest revision number. 上图中的rev 5和rev 6是head. 版本号最大的head被称为tip, 如上图中的rev 6. rev 4有两个parent(rev 2 和rev 3),它是个合并变更集.

Cloning, Making Changes, Merging, Pulling and Updating

假设用户Alice有如下所示的repository:

Bob 拷贝 了这个repo, 得到了Alice的store的一个完整、独立的本地拷贝。本地拷贝进行签出操作,他的工作目录对应到tip版本.

Bob提交两个修改e和f:

同时,Alice提交了她的修改g, 因此她的repository与Bob的不同了, 也就是说,她创建了一个 分支:

Bob then pulls Alice's repo to synchronize. This copies all of Alice's changes into Bob's repository store (here, it's just a single change g). Note that Bob's working directory is not changed by the pull: Bob使用pulls操作将Alice的repo同步到本地. 这个操作将Alice的所有修改集更新到Bob的repository store中 (这个例子中只有一个修改集g). 需要注意的是,这个操作并 没有 更改Bob的工作目录:

Because Alice's g is the newest head in Bob's repository, it's now the tip. 因为Alice's g 版本是最新的head, 因此此版本也是 tip.

Bob then does a merge, which combines the last change he was working on (f) with the tip in his repository. Now, his working directory has two parent revisions (f and g): Bob随后进行了 合并 操作, 将其本地修改(f)与repository中的tip进行合并. 这时, 他的工作目录具有两个parent(f和g):

After examining the result of the merge in his working directory and making sure the merge is perfect, Bob commits the result and ends up with a new merge changeset h in his store: 查看并确认合并操作成功后, Bob提交合并结果,得到了一个新的 合并变更集 h:

Now if Alice pulls from Bob, she will get Bob's changes e, f, and h into her store: 现在,如果Alice pulls from Bob, 她会得到Bob的变更e, f和h:

Note that Alice's working directory was not changed by the pull. She has to do an update to synchronize her working directory to the merge changset h. This changes the parent changeset of her working directory to changeset h and updates the files in her working directory to revision h.

Now Alice and Bob are fully synchronized again.

A Decentralized System

Mercurial is a completely decentralized system, and thus has no internal notion of a central repository. Thus users are free to define their own topologies for sharing changes (see CommunicatingChanges): Mercurial是一个完全的分布式系统, 因此没有所谓的集中式repository概念. 这也意味着用户可以自由的定义协同工作的组织结构 (参阅 CommunicatingChanges):

Unlike a centralized version control system in which experimentation can be disastrous, with a DVCS like Mercurial, you just clone and experiment. If you like the results, push them back, otherwise wipe the cloned repository and try something else. 在一个集中式版本管理系统中提交实验性的修改可能会造成较大的负面影响, 但对于Mercurial之类的DVCS来说, 可以肆意的进行试验性操作, 大不了删除本地工作目录,因为在别的地方还有若干。

What Mercurial can't do

Many SVN/CVS users expect to host related projects together in one repository. This is really not what hg was made for, so you should try a different way of working. This especially means, that you cannot check out only one directory of a repository. SVN/CVS用户会将多个相关的项目放在同一个repository里. This is really not what hg was made for, so you should try a different way of working. 也就是说,只能签出整个repository,而不是其中的某个目录. If you absolutely need to host multiple projects in a kind of meta-repository though, you could try the Subrepositories feature that was introduced with Mercurial 1.3 or the older ForestExtension. 如果确实想要将多个项目放在同一个repository中, 可以使用1.3版本中的Subrepositories 功能或者更老版本的ForestExtension.

关于Mercurial的入门操作, 请参阅 Tutorial.

ChineseUnderstandingMercurial (last edited 2012-11-11 13:29:56 by abuehl)