[svnbook commit] r1849 - trunk/src/zh/book

rocksun svnbook-dev at red-bean.com
Tue Nov 22 06:11:44 CST 2005


Author: rocksun
Date: Tue Nov 22 06:11:43 2005
New Revision: 1849

Modified:
   trunk/src/zh/book/ch04.xml

Log:
* zh/book/ch04.xml: nearly the last modification

Modified: trunk/src/zh/book/ch04.xml
==============================================================================
--- trunk/src/zh/book/ch04.xml	(original)
+++ trunk/src/zh/book/ch04.xml	Tue Nov 22 06:11:43 2005
@@ -5,7 +5,7 @@
 
     <para>分支、标签和合并是所有版本控制系统的共同概念,如果你并不熟悉这些概念,我们会在这一章里很好的介绍,如果你很熟悉,非常希望你有兴趣知道Subversion是怎样实现这些概念的。</para>
 
-    <para>分支是版本控制的基础组成部分,如果你允许Subversion来管理你的数据,这个特性将是你所必须依赖的 ,这一章假定你已经熟悉了subversion的基本概念(<xref linkend="svn-ch-2"/>)。</para>
+    <para>分支是版本控制的基础组成部分,如果你允许Subversion来管理你的数据,这个特性将是你所必须依赖的 ,这一章假定你已经熟悉了Subversion的基本概念(<xref linkend="svn-ch-2"/>)。</para>
 
   </simplesect>
 
@@ -17,7 +17,7 @@
 
     <para>假设你的工作是维护本公司一个部门的手册文档,一天,另一个部门问你要相同的手册,但一些地方会有<quote>区别</quote>,因为他们有不同的需要。</para>
 
-    <para>这种情况下你会怎样做?显而易见的方法是:作一个版本的拷贝,然后分别维护两个版本,只要任何一个部门告诉你做一些小修改,你必须在两个版本都作相应的更改。</para>
+    <para>这种情况下你会怎样做?显而易见的方法是:作一个版本的拷贝,然后分别维护两个版本,只要任何一个部门告诉要做一些小修改,你必须选择在对应的版本进行更改。</para>
 
     <para>你也许希望在两个版本同时作修改,举个例子,你在第一个版本发现了一个拼写错误,很显然这个错误也会出现在第二个版本里。两份文档几乎相同,毕竟,只有许多特定的微小区别。</para>
 
@@ -40,25 +40,25 @@
 
     <para>在这一点上,你必须理解每一次提交是怎样建立整个新的文件系统树(叫做<quote>修订版本</quote>)的,如果没有,可以回头去读<xref linkend="svn-ch-2-sect-3.2"/>。</para>
 
-    <para>对于本章节,我们会回到第2章同一个例子,还记得你和你的合作者Sally分享一个包含两个项目的版本库,<filename>paint</filename>和<filename>calc</filename>。注意<xref linkend="svn-ch-4-dia-2"/>,然而,现在每个项目的都有一个<filename>trunk</filename>和<filename>branches</filename>子目录,它们存在的理由很快就会清晰起来。</para>
+    <para>对于本章节,我们会回到第2章的同一个例子,还记得你和你的合作者Sally分享一个包含两个项目的版本库,<filename>paint</filename>和<filename>calc</filename>。注意<xref linkend="svn-ch-4-dia-2"/>,然而,现在每个项目的都有一个<filename>trunk</filename>和<filename>branches</filename>子目录,它们存在的理由很快就会清晰起来。</para>
     
       <figure id="svn-ch-4-dia-2">
         <title>开始规划版本库</title>
         <graphic fileref="images/ch04dia2.png"/>
       </figure>
 
-    <para>像以前一样,假定Sally和你都有<quote>calc</quote>项目的一份拷贝,更准确地说,你有一份<filename>/calc/trunk</filename>的工作拷贝,这个项目的所有的文件在这个子目录,而不是在<filename>/calc</filename>下,因为你的小组决定使用<filename>/calc/trunk</filename>作为开发使用的<quote>主线</quote>。</para>
+    <para>像以前一样,假定Sally和你都有<quote>calc</quote>项目的一份拷贝,更准确地说,你有一份<filename>/calc/trunk</filename>的工作拷贝,这个项目的所有的文件在这个子目录里,而不是在<filename>/calc</filename>下,因为你的小组决定使用<filename>/calc/trunk</filename>作为开发使用的<quote>主线</quote>。</para>
 
     <para>假定你有一个任务,将要对项目做基本的重新组织,这需要花费大量时间来完成,会影响项目的所有文件,问题是你不会希望打扰Sally,她正在处理这样或那样的程序小Bug,一直使用整个项目(<filename>/calc/trunk</filename>)的最新版本,如果你一点一点的提交你的修改,你一定会干扰Sally的工作。</para>
 
-    <para>一种策略是自己闭门造车:你和Sally可以停止一个到两个星期的共享,也就是说,开始作出本质上的修改和重新组织工作拷贝的文件,但是在完成这个任务之前不做提交和更新。这样会有很多问题,首先,这样并不安全,许多人习惯频繁的保存修改到版本库,工作拷贝一定有许多意外的修改。第二,这样并不灵活,如果你的工作在不同的计算机(或许你在不同的机器有两份<filename>/calc/trunk</filename>的工作拷贝),你需要手工的来回拷贝修改,或者只在一个计算机上工作,这时很难做到共享你即时的修改,一项软件开发的<quote>最佳实践</quote>就是允许审核你做过的工作,如果没有人看到你的提交,你失去了潜在的反馈。最后,当你完成了公司主干代码的修改工作,你会发现合并你的工作拷贝和公司的主干代码会是一件非常困难的事情,Sally(或者其他人)也许也许对版本库做了许多修改,已经很难和你的工作拷贝结合—就是当你在几周的单独工作后运行<command>svn update</command>。</para>
+    <para>一种策略是自己闭门造车:你和Sally可以停止一个到两个星期的共享,也就是说,开始作出本质上的修改和重新组织工作拷贝的文件,但是在完成这个任务之前不做提交和更新。这样会有很多问题,首先,这样并不安全,许多人习惯频繁的保存修改到版本库,工作拷贝一定有许多意外的修改。第二,这样并不灵活,如果你的工作在不同的计算机(或许你在不同的机器有两份<filename>/calc/trunk</filename>的工作拷贝),你需要手工的来回拷贝修改,或者只在一个计算机上工作,这时很难做到共享你即时的修改,一项软件开发的<quote>最佳实践</quote>就是允许审核你做过的工作,如果没有人看到你的提交,你失去了潜在的反馈。最后,当你完成了公司主干代码的修改工作,你会发现合并你的工作拷贝和公司的主干代码会是一件非常困难的事情,Sally(或者其他人)也许已经对版本库做了许多修改,已经很难和你的工作拷贝结合—当你单独工作几周后运行<command>svn update</command>时就会发现这一点。</para>
 
     <para>最佳方案是创建你自己的分支,或者是版本库的开发线。这允许你保存破坏了一半的工作而不打扰别人,尽管你仍可以选择性的同你的合作者分享信息,你将会看到这是怎样工作的。</para>
 
     <sect2 id="svn-ch-4-sect-2.1">
       <title>创建分支</title> 
       
-      <para>建立分支非常的简单—使用<command>svn      copy</command>命令给你的工程做个拷贝,Subversion不仅可以拷贝单个文件,也可以拷贝整个目录,在目前情况下,你希望作<filename>/calc/trunk</filename>的拷贝,新的拷贝应该在哪里?在你希望的任何地方—它只关心项目的政策,我们假设你们项目的政策是在<filename>/calc/branches</filename>建立分支,并且你希望把你的分支叫做<literal>my-calc-branch</literal>,你希望建立一个新的目录<filename>/calc/branches/my-calc-branch</filename>,作为/calc/trunk的拷贝开始它的生命周期。</para>
+      <para>建立分支非常的简单—使用<command>svn      copy</command>命令给你的工程做个拷贝,Subversion不仅可以拷贝单个文件,也可以拷贝整个目录,在目前情况下,你希望作<filename>/calc/trunk</filename>的拷贝,新的拷贝应该在哪里?在你希望的任何地方—它只是在于项目的政策,我们假设你们项目的政策是在<filename>/calc/branches</filename>建立分支,并且你希望把你的分支叫做<literal>my-calc-branch</literal>,你希望建立一个新的目录<filename>/calc/branches/my-calc-branch</filename>,作为/calc/trunk的拷贝开始它的生命周期。</para>
 
       <para>有两个方法作拷贝,我们首先介绍一个混乱的方法,只是让概念更清楚,作为开始,取出一个工程的根目录,<filename>/calc</filename>:</para>
 
@@ -114,9 +114,9 @@
       <sidebar>
         <title>代价低廉的拷贝</title>
                 
-        <para>Subversion的版本库有特殊的设计,当你复制一个目录,你不需要担心版本库会变得十分巨大—Subversion并不是拷贝所有的数据,相反,它建立了一个<emphasis>已存在</emphasis>目录树的入口,如果你是Unix用户,这就像硬链接是同一个概念,在这里,这个拷贝被可以被认为是<quote>懒的</quote>,如果你提交一个文件的修改,只有这个文件改变了—余下的文件还是作为原来目录的链接存在。</para>
+        <para>Subversion的版本库有特殊的设计,当你复制一个目录,你不需要担心版本库会变得十分巨大—Subversion并不是拷贝所有的数据,相反,它建立了一个<emphasis>已存在</emphasis>目录树的入口,如果你是Unix用户,可以把它理解成硬链接,在这里,这个拷贝被可以被认为是<quote>懒的</quote>,如果你提交一个文件的修改,只有这个文件改变了—余下的文件还是作为原来文件的链接存在。</para>
       
-        <para>这就是为什么经常听到Subversion用户谈论<quote>廉价的拷贝</quote>,与目录的大小无关—这个操作会使用很少的时间,事实上,这个特性是subversion提交工作的基础:每一次版本都是前一个版本的一个<quote>廉价的拷贝</quote>,只有少数项目修改了。(要阅读更多关于这部分的内容,访问subversion网站并且阅读设计文档中的<quote>bubble up</quote>方法)。</para>
+        <para>这就是为什么经常听到Subversion用户谈论<quote>廉价的拷贝</quote>,与目录的大小无关—这个操作会使用很少的时间,事实上,这个特性是Subversion提交工作的基础:每一次版本都是前一个版本的一个<quote>廉价的拷贝</quote>,只有少数项目修改了。(要阅读更多关于这部分的内容,访问Subversion网站并且阅读设计文档中的<quote>bubble up</quote>方法)。</para>
 
         <para> 当然,拷贝与分享的内部机制对用户来讲是不可见的,用户只是看到拷贝树,这里的要点是拷贝的时间与空间代价很小,所以你可以随意做想要的分支。</para>
       </sidebar>
@@ -143,19 +143,16 @@
 
       <itemizedlist>
         <listitem><para>
-        你修改<filename>/calc/branches/my-calc-branch/button.c</filename>,生成版本号342。
+        你修改了<filename>/calc/branches/my-calc-branch/button.c</filename>,生成版本号342。
         </para>
         </listitem>
 
         <listitem><para>
-           你修改了
-          <filename>/calc/branches/my-calc-branch/integer.c</filename>,
-          生成版本号343。</para>
+           你修改了<filename>/calc/branches/my-calc-branch/integer.c</filename>,生成版本号343。</para>
         </listitem>
 
         <listitem><para>
-          Sally修改了
-          <filename>/calc/trunk/integer.c</filename>生成了版本号344。
+          Sally修改了<filename>/calc/trunk/integer.c</filename>,生成了版本号344。
           </para>
         </listitem>
       </itemizedlist>
@@ -241,17 +238,17 @@
     </sect2>
 
     <sect2 id="svn-ch-4-sect-2.3">
-      <title>分支后面的关键概念</title> 
+      <title>分支背后的关键概念</title> 
 
-      <para>在这个章节你需要记住两个重要的课程。
+      <para>在这个章节你需要记住两个重要的经验。
       </para>
 
       <orderedlist>
         <listitem>
-          <para>不像其他版本控制系统,Subversion的分支存在于真实的<emphasis>正常文件系统</emphasis>,并不是存在于另外的维度,这些目录只是恰巧保留了额外的历史信息。</para>
+          <para>不像其他版本控制系统,Subversion的分支存在于真实的<emphasis>正常文件系统</emphasis>中,并不是存在于另外的维度,这些目录只是恰巧保留了额外的历史信息。</para>
         </listitem>
         <listitem>
-          <para>Subversion并没有内在的分支概念—只有拷贝,当你拷贝一个目录,这个结果目录就是一个<quote>分支</quote>,只是因为你给他这样一个含义。你可以换一种角度考虑,或者特别处理,但是对于Subversion它只是一个普通的拷贝的结果。</para>
+          <para>Subversion并没有内在的分支概念—只有拷贝,当你拷贝一个目录,这个结果目录就是一个<quote>分支</quote>,只是因为你给了它这样一个含义而已。你可以换一种角度考虑,或者特别处理,但是对于Subversion它只是一个普通的拷贝的结果。</para>
         </listitem>
       </orderedlist>
 
@@ -269,18 +266,18 @@
 
     <para>由于有众多的人参与项目,大多数人拥有主干拷贝是很正常的,任何人如果进行一个长周期的修改会使得主干陷入混乱,所以通常的做法是建立一个私有分支,提交修改到自己的分支,直到这阶段工作结束。</para>
 
-    <para>所以,好消息就是你和Sally不会互相打扰,坏消息是有时候分离会<emphasis>太</emphasis>远。记住<quote>在洞中爬行</quote>策略的问题,当你完成你的分支后,可能因为太多冲突,已经无法轻易合并你的分支和主干的修改。</para>
+    <para>所以,好消息就是你和Sally不会互相打扰,坏消息是有时候分离会<emphasis>太</emphasis>远。记住<quote>闭门造车</quote>策略的问题,当你完成你的分支后,可能因为太多冲突,已经无法轻易合并你的分支和主干的修改。</para>
     
-    <para>相反,当你工作的时候你和Sally可以继续分享修改,这依赖于你决定什么值得分享,Subversion给你在分支间选择性<quote>拷贝</quote>修改的能力,当你完成了分支上的所有工作,所有的分支修改可以被拷贝回到主干。</para>
+    <para>相反,在你工作的时候你和Sally仍然可以继续分享修改,这依赖于你决定什么值得分享,Subversion给你在分支间选择性<quote>拷贝</quote>修改的能力,当你完成了分支上的所有工作,所有的分支修改可以被拷贝回到主干。</para>
     
 
     <sect2 id="svn-ch-4-sect-3.1">
       <title>拷贝特定的修改</title>
       
 
-      <para>在上一章节,我们提到你和Sally对<filename>integer.c</filename>在不同的分支上做过修改,,如果你看了Sally的344版本的日志信息,你会知道她修正了一些拼写错误,毋庸置疑,你的拷贝的文件也一定存在这些拼写错误,所以你以后的对这个文件修改也会保留这些拼写错误,所以你会在将来合并时得到许多冲突。最好是现在接收Sally的修改,而不是作了许多工作之后才来做。</para>
+      <para>在上一章节,我们提到你和Sally对<filename>integer.c</filename>在不同的分支上做过修改,如果你看了Sally的344版本的日志信息,你会知道她修正了一些拼写错误,毋庸置疑,你的拷贝的文件也一定存在这些拼写错误,所以你以后的对这个文件修改也会保留这些拼写错误,所以你会在将来合并时得到许多冲突。最好是现在接收Sally的修改,而不是作了许多工作之后才来做。</para>
 
-      <para>是时间使用<command>svn merge</command>命令,这个命令的结果非常像<command>svn diff</command>命令的表亲(在第3章的内容),两个命令都可以比较版本库中的任何两个对象并且描述其区别,举个例子,你可以使用<command>svn diff</command>来查看Sally在版本344作的修改:</para>
+      <para>是时间使用<command>svn merge</command>命令,这个命令的结果非常类似<command>svn diff</command>命令(在第3章的内容),两个命令都可以比较版本库中的任何两个对象并且描述其区别,举个例子,你可以使用<command>svn diff</command>来查看Sally在版本344作的修改:</para>
 
 <screen>
 $ svn diff -r 343:344 http://svn.example.com/repos/calc/trunk
@@ -405,7 +402,7 @@
 
       <para>你已经看到了<command>svn merge</command>命令的例子,你将会看到更多,如果你对合并是如何工作的感到迷惑,这并不奇怪,很多人和你一样。许多新用户(特别是对版本控制很陌生的用户)会对这个命令的正确语法感到不知所措,不知道怎样和什么时候使用这个特性,不要害怕,这个命令实际上比你想象的简单!有一个简单的技巧来帮助你理解<command>svn merge</command>的行为。</para>
 
-      <para>迷惑的主要原因是这个命令的<emphasis>名称</emphasis>,术语<quote>合并</quote>不知什么原因被用来表明分支的组合,或者是其他什么神奇的数据混合,这不是事实,一个更好的名称是<command>svn
+      <para>迷惑的主要原因是这个命令的<emphasis>名称</emphasis>,术语<quote>合并</quote>不知什么原因被用来表明分支的组合,或者是其他什么神奇的数据混合,这不是事实,一个更好的名称应该是<command>svn
         diff-and-apply</command>,这是发生的所有事件:首先两个版本库树比较,然后将区别应用到本地拷贝。</para>
 
       <para>这个命令包括三个参数:</para>
@@ -421,7 +418,7 @@
       </orderedlist>
 
       <para>一旦这三个参数指定以后,两个目录树将要做比较,比较结果将会作为本地修改应用到目标工作拷贝,当命令结束后,结果同你手工修改或者是使用<command>svn
-        add</command>或<command>svn delete</command>没有什么区别,,如果你喜欢这结果,你可以提交,如果不喜欢,你可以使用<command>svn
+        add</command>或<command>svn delete</command>没有什么区别,如果你喜欢这结果,你可以提交,如果不喜欢,你可以使用<command>svn
         revert</command>恢复修改。</para>
 
       <para><command>svn merge</command>的语法允许非常灵活的指定参数,如下是一些例子:</para>
@@ -451,7 +448,7 @@
 
         <para>理想情况下,你的版本控制系统应该会阻止对一个分支做两次改变操作,必须自动的记住那一个分支的修改已经接收了,并且可以显示出来,用来尽可能帮助自动化的合并。</para>
 
-        <para>不幸的是,Subversion不是这样一个系统,像CVS,subversion并不记录任何合并操作,当你提交本地修改,版本库并不能判断出你是通过<command>svn merge</command>还是手工修改得到这些文件。</para>
+        <para>不幸的是,Subversion不是这样一个系统,类似于CVS,Subversion并不记录任何合并操作,当你提交本地修改,版本库并不能判断出你是通过<command>svn merge</command>还是手工修改得到这些文件。</para>
 
         <para>这对你这样的用户意味着什么?这意味着除非Subversion以后发展这个特性,你必须手工的记录这些信息。最佳的方式是使用提交日志信息,像前面的例子提到的,推荐你在日志信息中说明合并的特定版本号(或是版本号的范围),之后,你可以运行<command>svn log</command>来查看你的分支包含哪些修改。这可以帮助你小心的依序运行<command>svn merge</command>命令而不会进行多余的合并。</para>
 
@@ -486,13 +483,13 @@
 
         <para>每一个人对于<quote>修改集</quote>的概念都有些不一样,至少对于版本控制系统的<quote>修改集特性</quote>这一概念有着不同的期望,根据我们的用途,可以说修改集只是一个有唯一名字的一系列修改集合,修改也许包括文件内容的修改,目录树结构的修改,或是元数据的调整,更通常的说法,一个修改集就是我们可以引用的有名字的补丁。</para>
 
-        <para>在Subversion里,一个全局的修订版本号N标示一个版本库中的树:它代表版本库在N次提交后的样子,它也是一个修改集的隐含名称:如果你比较树N与树N-1,你可以得到你提交的补丁。出于这个原因,想象<quote>版本N</quote>并不只是一棵树,也是一个修改集。如果你使用一个问题追踪工具来管理bug,你可以使用版本号来表示特定的补丁修正了bug—举个例子,<quote>这个问题是在版本9238修正的</quote>,然后其他人可以运行<command>svn log -r9238</command>来查看修正这个bug的修改集,或者使用<command>svn diff -r9237:9238</command>来看补丁本身。Subversion合并命令也使用版本号,可以从合并两个分支特定的修改集:<command>svn merge -r9237:9238</command>将会合并修改集#9238到本地拷贝。</para>
+        <para>在Subversion里,一个全局的修订版本号N标示一个版本库中的树:它代表版本库在N次提交后的样子,它也是一个修改集的隐含名称:如果你比较树N与树N-1,你可以得到你提交的补丁。出于这个原因,想象<quote>版本N</quote>并不只是一棵树,也是一个修改集。如果你使用一个问题追踪工具来管理bug,你可以使用版本号来表示特定的补丁修正了bug—举个例子,<quote>这个问题是在版本9238修正的</quote>,然后其他人可以运行<command>svn log -r9238</command>来查看修正这个bug的修改集,或者使用<command>svn diff -r9237:9238</command>来看补丁本身。Subversion合并命令也使用版本号作为参数,可以将特定修改集从一个分支合到另一个分支:<command>svn merge -r9237:9238</command>将会合并修改集#9238到本地拷贝。</para>
       </sidebar>
 
       <sect3 id="svn-ch-4-sect-3.3.3">
         <title>合并冲突</title>
 
-        <para>就像<command>svn update</command>命令,<command>svn merge</command>会将修改应用到工作拷贝,因此它也会造成冲突,因为<command>svn
+        <para>就像<command>svn update</command>命令,<command>svn merge</command>会把修改应用到工作拷贝,因此它也会造成冲突,因为<command>svn
           merge</command>造成的冲突有时候会有些不同,本小节会解释这些区别。</para>
 
         <para>作为开始,我们假定本地没有修改,当你<command>svn update</command>到一个特定修订版本时,修改会<quote>干净的</quote>应用到工作拷贝,服务器产生比较两树的增量数据:一个工作拷贝和你关注的版本树的虚拟快照,因为比较的左边同你拥有的完全相同,增量数据确保你把工作拷贝转化到右边的树。</para>
@@ -514,7 +511,7 @@
 
         <para>也应当注意前一个例子显示<filename>glorb.h</filename>发生了冲突,我们已经规定本地拷贝没有修改:冲突怎么会发生呢?因为用户可以使用<command>svn merge</command>将过去的任何变化应用到当前工作拷贝,变化包含的文本修改也许并不能干净的应用到工作拷贝文件,即使这些文件没有本地修改。</para>
 
-        <para>另一个<command>svn update</command>和<command>svn merge</command>的小区别是因为冲突产生的全文本文件的名字不同,在<xref linkend="svn-ch-3-sect-5.4"/>,我们看到过更新产生的文件名字为<filename>filename.mine</filename>、<filename>filename.rOLDREV</filename>和<filename>filename.rNEWREV</filename>,当<command>svn merge</command>产生冲突,它会产生三个文件分别为 <filename>filename.working</filename>、<filename>filename.left</filename>和<filename>filename.right</filename>。在这种情况下,术语<quote>left</quote>和<quote>right</quote>表示了两棵树比较时的两边,在任何情况下,不同的名字会帮助你区分冲突是因为更新造成的还是合并造成的。</para>
+        <para>另一个<command>svn update</command>和<command>svn merge</command>的小区别是冲突产生的文件的名字不同,在<xref linkend="svn-ch-3-sect-5.4"/>,我们看到过更新产生的文件名字为<filename>filename.mine</filename>、<filename>filename.rOLDREV</filename>和<filename>filename.rNEWREV</filename>,当<command>svn merge</command>产生冲突时,它产生的三个文件分别为 <filename>filename.working</filename>、<filename>filename.left</filename>和<filename>filename.right</filename>。在这种情况下,术语<quote>left</quote>和<quote>right</quote>表示了两棵树比较时的两边,在两种情况下,不同的名字会帮助你区分冲突是因为更新造成的还是合并造成的。</para>
 
       </sect3>
       
@@ -527,7 +524,7 @@
 
         <para>指出<command>svn diff</command>和<command>svn merge</command>区别的重要性在于,前一个命令忽略祖先,如果你询问<command>svn diff</command>来比较文件<filename>foo.c</filename>的版本99和102,你会看到行为基础的区别,区别命令只是盲目的比较两条路径,但是如果你使用<command>svn merge</command>是比较同样的两个对象,它会注意到他们是不关联的,而且首先尝试删除旧文件,然后添加新文件,你会看到<literal>A foo.c</literal>后面紧跟<literal>D  foo.c</literal>。</para>
 
-        <para>大多数合并包括比较包括祖先关联的两条树,因此<command>svn merge</command>这样运作,然而,你也许会希望合并命令能够比较两个不相关的目录树,举个例子,你有两个目录树分别代表了不同的卖主的软件项目(见<xref linkend="svn-ch-7-sect-4"/>),如果你使用<command>svn merge</command>进行比较,你会看到第一个目录树被删除,而第二个树添加上!</para>
+        <para>大多数合并包括比较包括祖先关联的两条树,因此<command>svn merge</command>这样运作,然而,你也许会希望合并命令能够比较两个不相关的目录树,举个例子,你有两个目录树分别代表了卖主软件项目的不同版本(见<xref linkend="svn-ch-7-sect-4"/>),如果你使用<command>svn merge</command>进行比较,你会看到第一个目录树被删除,而第二个树添加上!</para>
 
         <para>在这个情况下,你只是希望<command>svn merge</command>能够做一个以路径为基础的比较,忽略所有文件和目录的关系,增加<option>--ignore-ancestry</option>选项会导致命令象<command>svn
           diff</command>一样。(相应的,<option>--notice-ancestry</option>选项会使<command>svn diff</command>象合并命令一样行事。)</para>
@@ -546,7 +543,7 @@
     <title>常见用例</title>
 
     <para>分支和<command>svn
-      merge</command>有很多不同的用法,这个小节描述了你会喜欢用到的一部分。</para>
+      merge</command>有很多不同的用法,这个小节描述了最常见的用法。</para>
 
     <sect2 id="svn-ch-4-sect-4.1">
       <title>合并一条分支到另一支</title>
@@ -555,7 +552,7 @@
 
       <para>这种情况下如何使用<command>svn merge</command>?记住这个命令比较两个目录树,然后应用比较结果到工作拷贝,所以要接受这种变化,你需要主干的工作拷贝,我们假设你有一个最初的主干工作拷贝(完全更新),或者是你最近取出了<filename>/calc/trunk</filename>的一个干净的工作拷贝。</para>
 
-      <para>但是要哪两个树进行比较呢?乍一看,回答很明确,只要比较最新的主干与分支。但是你要意识到—这个假设是<emphasis>错误的</emphasis>,毁掉了许多新用户!因为<command>svn merge</command>的操作很像<command>svn diff</command>,比较最新的主干和分支树不仅仅会描述你在分支上所作的修改,这样的比较会展示太多的不同,不仅包括分支上的增加,也包括了主干上的删除操作,而这些删除根本就没有在分支上发生过。</para>
+      <para>但是要哪两个树进行比较呢?乍一看,回答很明确,只要比较最新的主干与分支。但是你要意识到—这个想法是<emphasis>错误的</emphasis>,伤害了许多新用户!因为<command>svn merge</command>的操作很像<command>svn diff</command>,比较最新的主干和分支树不仅仅会描述你在分支上所作的修改,这样的比较会展示太多的不同,不仅包括分支上的增加,也包括了主干上的删除操作,而这些删除根本就没有在分支上发生过。</para>
 
       <para>为了表示你的分支上的修改,你只需要比较分支的初始状态与最终状态,在你的分支上使用<command>svn log</command>命令,你可以看到你的分支在341版本建立,你的分支最终的状态用<literal>HEAD</literal>版本表示,这意味着你希望能够比较版本341和<literal>HEAD</literal>的分支目录,然后应用这些分支的修改到主干目录的工作拷贝。</para>
 
@@ -626,7 +623,7 @@
 …
 </screen>
       
-      <para>阿,因为所有分支341到405之间的修改已经在版本406合并了,现在你只需要合并分支在此之后的修改—通过比较406和<literal>HEAD</literal>。</para>
+      <para>阿哈!因为分支上341到405之间的所有修改已经在版本406合并了,现在你只需要合并分支在此之后的修改—通过比较406和<literal>HEAD</literal>。</para>
 
 <screen>
 $ cd calc/trunk
@@ -648,7 +645,7 @@
 Committed revision 481.
 </screen>
 
-      <para>现在主干有了分支上第二波完全的修改结果,此刻,你可以删除你的分支(我们会在以后讨论),或是继续在你分支上工作,重复这个步骤。</para>
+      <para>现在主干有了分支上第二波修改的完全结果,此刻,你可以删除你的分支(我们会在以后讨论),或是继续在你分支上工作,重复这个步骤。</para>
 
     </sect2>
 
@@ -683,11 +680,11 @@
       <para>记住回滚修改和任何一个<command>svn merge</command>命令都一样,所以你应该使用<command>svn status</command>或是<command>svn
         diff</command>来确定你的工作处于期望的状态中,然后使用<command>svn commit</command>来提交,提交之后,这个特定修改集不会反映到<literal>HEAD</literal>版本了。</para>
 
-      <para>继续,你也许会想:好吧,这不是真的取消提交吧!,是吧?版本303还依然存在着修改,如果任何人取出<filename>calc</filename>的303-349版本,他还会得到错误的修改,对吧?</para>
+      <para>继续,你也许会想:好吧,这不是真的取消提交吧!是吧?版本303还依然存在着修改,如果任何人取出<filename>calc</filename>的303-349版本,他还会得到错误的修改,对吧?</para>
 
       <para>是的,这是对的。当我们说<quote>删除</quote>一个修改时,我们只是说从<literal>HEAD</literal>删除,原始的修改还保存在版本库历史中,在多数情况下,这是足够好的。大多数人只是对追踪<literal>HEAD</literal>版本感兴趣,在一些特定情况下,你也许希望毁掉所有提交的证据(或许某个人提交了一个秘密文件),这不是很容易的,因为Subversion设计用来不丢失任何信息,每个修订版本都是不可变的目录树 ,从历史删除一个版本会导致多米诺效应,会在后面的版本导致混乱甚至会影响所有的工作拷贝。
         <footnote>
-          <para>Subversion项目有计划,不管用什么方式,总有一天要实现<command>svnadmin obliterate</command>命令来永久删除,而此时可以看<xref linkend="svn-ch-5-sect-3.1.3"/>。</para>
+          <para>Subversion项目有计划,不管用什么方式,总有一天要实现<command>svnadmin obliterate</command>命令来进行永久删除操作,而此时可以看<xref linkend="svn-ch-5-sect-3.1.3"/>。</para>
         </footnote>
       </para>
 
@@ -696,7 +693,7 @@
     <sect2 id="svn-ch-4-sect-4.3">
       <title>找回删除的项目</title>
 
-      <para>版本控制系统非常重要的一个特性就是它的信息从不丢失,即使当你删除了文件或目录,它也许从HEAD版本消失了 ,但这个对象依然存在于历史的早期版本 ,一个新手经常问到的问题是<quote>怎样找回我的文件和目录?</quote>。</para>
+      <para>版本控制系统非常重要的一个特性就是它的信息从不丢失,即使当你删除了文件或目录,它也许从HEAD版本消失了 ,但这个对象依然存在于历史的早期版本 ,一个新手经常问到的问题是<quote>怎样找回我的文件和目录?</quote></para>
 
       <para>第一步首先要知道需要拯救的项目是<emphasis role="bold">什么</emphasis>,这里有个很有用的比喻:你可以认为任何存在于版本库的对象生活在一个二维的坐标系统里,第一维是一个特定的版本树,第二维是在树中的路径,所以你的文件或目录的任何版本可以有这样一对坐标定义。</para>
 
@@ -704,7 +701,7 @@
         <footnote>
           <para>因为CVS没有版本树,它会在每个版本库目录创建一个<filename>古典</filename>区域用来保存增量数据。</para>
         </footnote>
-        所以你需要<command>svn log</command>来察看你需要找回的坐标对,一个好的策略是使用<command>svn log --verbose</command>来察看你删除的项目,--verbose选项显示所有改变的项目的每一个版本 ,你只需要你删除文件或目录的那一个版本,你可以使用另一种工具来检查日志的输出 (通过<command>grep</command>或是在编辑器里增量查找)。</para>
+        所以你需要<command>svn log</command>来察看你需要找回的坐标对,一个好的策略是使用<command>svn log --verbose</command>来察看你删除的项目,--verbose选项显示所有改变的项目的每一个版本 ,你只需要找出你删除文件或目录的那一个版本。你可以通过目测找出这个版本,也可以使用另一种工具来检查日志的输出 (通过<command>grep</command>或是在编辑器里增量查找)。</para>
 
       <screen>
 $ cd parent-dir
@@ -721,7 +718,7 @@
 …
 </screen>
 
-      <para>在这个例子里,你可以假定你正在找已经删除了的文件<filename>real.c</filename>,通过查找父目录的历史 ,你知道这个文件在808版本被删除,所以存在这个对象的版本在此之前 ,结论:你想从版本807找回<filename>/calc/trunk/real.c</filename>。</para>
+      <para>在这个例子里,你可以假定你正在找已经删除了的文件<filename>real.c</filename>,通过查找父目录的历史 ,你知道这个文件在808版本被删除,所以存在这个对象的版本在此之前 。结论:你想从版本807找回<filename>/calc/trunk/real.c</filename>。</para>
 
       <para>以上是最重要的部分—重新找到你需要恢复的对象。现在你已经知道该恢复的文件,而你有两种选择。</para>
       
@@ -730,7 +727,7 @@
 
       <para>在这个例子里,这不是一个好的策略,这样做不仅把<filename>real.c</filename>加入添加到计划,也取消了对<filename>integer.c</filename>的修改,而这不是你期望的。确实,你可以恢复到版本808,然后对<filename>integer.c</filename>执行取消<command>svn revert</command>操作,但这样的操作无法扩大使用,因为如果从版本808修改了90个文件怎么办?</para>
 
-      <para>所以第二个方法是不使用<command>svn merge</command>而是使用<command>svn copy</command>命令,精确的拷贝版本和路径<quote>坐标对</quote>到你的工作拷贝:</para>
+      <para>所以第二个方法不是使用<command>svn merge</command>,而是使用<command>svn copy</command>命令,精确的拷贝版本和路径<quote>坐标对</quote>到你的工作拷贝:</para>
 
       <screen>
 $ svn copy --revision 807 \
@@ -745,7 +742,7 @@
 Committed revision 1390.
 </screen>
 
-      <para>加号标志表明这个项目不仅仅是计划增加中,而且还包含了历史,Subversion记住了他是从那里拷贝过来的。在将来,对这个文件运行<command>svn log</command>会看到这个文件在版本807之前的历史,换句话说,<filename>real.c</filename>不是新的,而是原先删除的那一个的后代。</para>
+      <para>加号标志表明这个项目不仅仅是计划增加中,而且还包含了历史,Subversion记住了它是从哪个拷贝过来的。在将来,对这个文件运行<command>svn log</command>会看到这个文件在版本807之前的历史,换句话说,<filename>real.c</filename>不是新的,而是原先删除的那一个的后代。</para>
 
       <para>尽管我们的例子告诉我们如何找回文件,对于恢复删除的目录也是一样的。</para>
 
@@ -754,12 +751,12 @@
     <sect2 id="svn-ch-4-sect-4.4">
       <title>常用分支模式</title>
 
-      <para>版本控制在软件开发中广泛使用,这里是团队里程序员最常用的两种分支/合并模式的介绍,如果你不是使用Subversion软件开发,可随意跳过本小节,如果你是第一次使用版本控制的软件开发者,请更加注意,以下模式被许多老兵认为使最佳实践,这个过程并不只是针对Subversion,在任何版本控制系统中都一样,但是在这里使用Subversion术语会感觉更方便一点。</para>
+      <para>版本控制在软件开发中广泛使用,这里是团队里程序员最常用的两种分支/合并模式的介绍,如果你不是使用Subversion软件开发,可随意跳过本小节,如果你是第一次使用版本控制的软件开发者,请更加注意,以下模式被许多老兵当作最佳实践,这个过程并不只是针对Subversion,在任何版本控制系统中都一样,但是在这里使用Subversion术语会感觉更方便一点。</para>
       
       <sect3 id="svn-ch-4-sect-4.4.1">
         <title>发布分支</title>
       
-        <para>大多数软件存在这样一个生命周期:编码、测试、发布,继续。这样有两个问题,第一,开发者需要在质量保证小组测试假定稳定版本时继续开发新特性,新工作在软件测试时不可以中断,第二,小组必须一直支持老的发布版本和软件;如果一个bug在最新的代码中发现,它一定也存在已发布的版本中,客户希望立刻得到错误修正而不必等到新版本发布。</para>
+        <para>大多数软件存在这样一个生命周期:编码、测试、发布,然后重复。这样有两个问题,第一,开发者需要在质量保证小组测试假定稳定版本时继续开发新特性,新工作在软件测试时不可以中断,第二,小组必须一直支持老的发布版本和软件;如果一个bug在最新的代码中发现,它一定也存在已发布的版本中,客户希望立刻得到错误修正而不必等到新版本发布。</para>
 
         <para>这是版本控制可以做的帮助,典型的过程如下:</para>
 
@@ -768,7 +765,7 @@
         <listitem>
           <para><emphasis>开发者提交所有的新特性到主干。</emphasis>
 
-              每日的修改提交到<filename>/trunk</filename>:新特性,错误修正和其他。</para>
+              每日的修改提交到<filename>/trunk</filename>:新特性,bug修正和其他。</para>
         </listitem>
 
         <listitem>
@@ -778,7 +775,7 @@
         </listitem>
 
         <listitem>
-          <para><emphasis>项目组继续并行工作,</emphasis>一个小组开始对分支进行严酷的测试,同时另一个小组在<filename>/trunk</filename>继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送,即使那个过程已经结束,分支会为发布前的最终测试而<quote>停滞</quote>。</para>
+          <para><emphasis>项目组继续并行工作,</emphasis>一个小组开始对分支进行严酷的测试,同时另一个小组在<filename>/trunk</filename>继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送。然而这个过程有时候也会结束,例如分支已经为发布前的最终测试<quote>停滞</quote>了。</para>
         </listitem>
           
         <listitem>
@@ -798,17 +795,17 @@
       <sect3 id="svn-ch-4-sect-4.4.2">
         <title>特性分支</title>
       
-        <para>一个<firstterm>特性分支</firstterm>是本章中那个重要例子中的分支,你正在那个分支上工作,而Sally还在<filename>/trunk</filename>继续工作,这是一个临时分支,用来作复杂的修改而不会干扰<filename>/trunk</filename>的稳定性,不象发布分支(也许要永远支持),特性分支出生,使用了一段时间,合并到主干,然后最终被删除掉,它们有有限的用处。</para>
+        <para>一个<firstterm>特性分支</firstterm>是本章中那个重要例子中的分支,你正在那个分支上工作,而Sally还在<filename>/trunk</filename>继续工作,这是一个临时分支,用来作复杂的修改而不会干扰<filename>/trunk</filename>的稳定性,不象发布分支(也许要永远支持),特性分支出生,使用了一段时间,合并到主干,然后最终被删除掉,它们在有限的时间里有用。</para>
 
-        <para>还有,关于是否创建特性分支的项目政策也变化广泛,一些项目永远不使用特性分支:大家都可以提交到<filename>/trunk</filename>,好处是系统的简单—没有人需要知道分支和合并,坏处是主干会经常不稳定或者不可用,另外一些项目使用分支达到极限:没有修改<emphasis>曾经</emphasis>直接提交到主干,即使最细小的修改都要创建短暂的分支,然后小心的审核合并到主干,然后删除分支,这样系统保持主干一直稳定和可用,但是但造成了巨大的负担。</para>
+        <para>还有,关于是否创建特性分支的项目政策也变化广泛,一些项目永远不使用特性分支:大家都可以提交到<filename>/trunk</filename>,好处是系统的简单—没有人需要知道分支和合并,坏处是主干会经常不稳定或者不可用,另外一些项目使用分支达到极限:没有修改<emphasis>曾经</emphasis>直接提交到主干,即使最细小的修改都要创建短暂的分支,然后小心的审核合并到主干,然后删除分支,这样系统保持主干一直稳定和可用,但是造成了巨大的负担。</para>
 
         <para>许多项目采用折中的方式,坚持每次编译<filename>/trunk</filename>并进行回归测试,只有需要多次不稳定提交时才需要一个特性分支,这个规则可以用这样一个问题检验:如果开发者在好几天里独立工作,一次提交大量修改(这样<filename>/trunk</filename>就不会不稳定。),是否会有太多的修改要来回顾?如果答案是<quote>是</quote>,这些修改应该在特性分支上进行,因为开发者增量的提交修改,你可以容易的回头检查。</para>
 
-        <para>最终,有一个问题就是怎样保持一个特性分支<quote>同步</quote>于工作中的主干,在前面提到过,在一个分枝上工作数周或几个月是很有风险的,主干的修改也许会持续涌入,因为这一点,两条线的开发会区别巨大,合并分支回到主干会成为一个噩梦。</para>
+        <para>最终,有一个问题就是怎样保持一个特性分支<quote>同步</quote>于工作中的主干,在前面提到过,在一个分支上工作数周或几个月是很有风险的,主干的修改也许会持续涌入,因为这一点,两条线的开发会区别巨大,合并分支回到主干会成为一个噩梦。</para>
 
         <para>这种情况最好通过有规律的将主干合并到分支来避免,制定这样一个政策:每周将上周的修改合并到分支,注意这样做时需要小心,需要手工记录合并的过程,以避免重复的合并(在<xref linkend="svn-ch-4-sect-3.3.1"/>描述过),你需要小心的撰写合并的日志信息,精确的描述合并包括的范围(在<xref linkend="svn-ch-4-sect-4.1"/>中描述过),这看起来像是胁迫,可是实际上是容易做到的。</para>
 
-        <para>在一些时候,你已经准备好了将<quote>同步的</quote>特性分支合并回到主干,为此,开始做一次将主干最新修改和分支的最终合并,这样后,最新的分支和主干将会绝对一致,除了你的分支修改,所以在这个特别的例子里,你会通过比较分支和主干来进行合并:</para>
+        <para>在一些时候,你已经准备好了将<quote>同步的</quote>特性分支合并回到主干,为此,开始做一次将主干最新修改和分支的最终合并,这样以后,除了你的分支修改的部分,最新的分支和主干将会绝对一致,所以在这个特别的例子里,你会通过直接比较分支和主干来进行合并:</para>
 
         <screen>
 $ cd trunk-working-copy
@@ -827,7 +824,7 @@
 
         <para>通过比较<literal>HEAD</literal>修订版本的主干和<literal>HEAD</literal>修订版本的分支,你确定了只在分支上的增量信息,两条开发线都有了分枝的修改。</para>
 
-        <para>可以用另一种考虑这种模式,你每周按时对你的同步分支到主干,类似于在工作拷贝执行<command>svn update</command>的命令,最终的合并操作类似于在工作拷贝运行<command>svn
+        <para>可以用另一种考虑这种模式,你每周按时同步分支到主干,类似于在工作拷贝执行<command>svn update</command>的命令,最终的合并操作类似于在工作拷贝运行<command>svn
           commit</command>,毕竟,工作拷贝不就是一个非常浅的分支吗?只是它一次只可以保存一个修改。</para>
 
       </sect3>
@@ -875,7 +872,7 @@
         </listitem>
       </orderedlist>
     
-    <para>换句话说,如果一个用户知道分支工作只发生在部分子目录,我们使用<command>svn switch</command>来跳转部分目录(有时候只是单个文件),这样的话,他们依然可以继续得到普通的<quote>trunk</quote>主干的更新,但是已经跳转的部分则被免去了更新(除了分支中有更新)。这个特性给<quote>混合工作拷贝</quote>概念添加了新的维度—不仅工作拷贝的版本可以混合,在版本库中的位置也可以混合。</para>
+    <para>换句话说,如果一个用户知道分支工作只发生在部分子目录,我们使用<command>svn switch</command>来跳转部分目录(有时候只是单个文件),这样的话,他们依然可以继续得到普通的<quote>trunk</quote>主干的更新,但是已经跳转的部分则被免去了更新(除非分支上有更新)。这个特性给<quote>混合工作拷贝</quote>概念添加了新的维度—不仅工作拷贝的版本可以混合,在版本库中的位置也可以混合。</para>
     
     <para>如果你的工作拷贝包含许多来自不同版本库目录跳转的子树,它会工作如常。当你更新时,你会得到每一个目录适当的补丁,当你提交时,你的本地修改会一直作为一个单独的原子修改提交到版本库。</para>
 
@@ -889,11 +886,11 @@
       <para>你注意到<command>svn
         switch</command>和<command>svn update</command>的输出很像?switch命令只是update命令的一个超集。</para>
 
-      <para>当你运行<command>svn update</command>时,你会告诉版本库比较两个目录树,版本库这样做,并且返回客户区别的描述, ,<command>svn
+      <para>当你运行<command>svn update</command>时,你会告诉版本库比较两个目录树,版本库这样做,并且返回给客户区别的描述,<command>svn
         switch</command>和<command>svn update</command>两个命令唯一区别就是<command>svn update</command>会一直比较同一路径。</para>
       
       <para>也就是了,如果你的工作拷贝是<filename>/calc/trunk</filename>的一个镜像,当运行<command>svn
-        update</command>时会自动地比较你的工作拷贝的<filename>/calc/trunk</filename>与HEAD版本的<filename>/calc/trunk</filename>。如果你使用<command>svn switch</command>跳转工作拷贝到分支,则会比较你的工作拷贝的<filename>/calc/trunk</filename>与HEAD版本的相应分支目录HEAD版本。</para>
+        update</command>时会自动地比较你的工作拷贝的<filename>/calc/trunk</filename>与HEAD版本的<filename>/calc/trunk</filename>。如果你使用<command>svn switch</command>跳转工作拷贝到分支,则会比较你的工作拷贝的<filename>/calc/trunk</filename>与相应分支目录的HEAD版本。</para>
 
       <para>换句话说,一个更新通过时间移动你的工作拷贝,一个转换通过时间和空间移动工作拷贝。</para>
     </sidebar>
@@ -901,7 +898,7 @@
     <para>因为<command>svn switch</command>是<command>svn update</command>的一个变种,具有相同的行为,当新的数据到达时,任何工作拷贝的已经完成的本地修改会被保存,这里允许你作各种聪明的把戏。</para>
 
     <para>举个例子,你的工作拷贝目录是<filename>/calc/trunk</filename>,你已经做了很多修改,然后你突然发现应该在分支上修改更好,没问题!你可以使用<command>svn
-      switch</command>,而你本地修改还会保留,你可以测试并提交他们到分支。</para>
+      switch</command>,而你本地修改还会保留,你可以测试并提交它们到分支。</para>
 
   </sect1>
 
@@ -912,14 +909,14 @@
   <sect1 id="svn-ch-4-sect-6">
     <title>标签</title>
 
-    <para>另一个常见的版本控制系统概念是标签<firstterm>tag</firstterm>,一个标签只是一个项目某一时间的<quote>快照</quote>,在Subversion里这个概念无处不在—每一次提交的修订版本都是一个精确的快照。</para>
+    <para>另一个常见的版本控制系统概念是标签(<firstterm>tag</firstterm>),一个标签只是一个项目某一时间的<quote>快照</quote>,在Subversion里这个概念无处不在—每一次提交的修订版本都是一个精确的快照。</para>
 
     <para>然而人们希望更人性化的标签名称,像<literal>release-1.0</literal>。他们也希望可以对一个子目录快照,毕竟,记住release-1.0是修订版本4822的某一小部分不是件很容易的事。</para>
 
     <sect2 id="svn-ch-4-sect-6.1">
       <title>建立最简单的标签</title>
 
-      <para>再一次,<command>svn copy</command>是来救援的,你希望建立一个<filename>/calc/trunk</filename>的一个快照,就像<literal>HEAD</literal>修订版本,建立这样一个拷贝:</para>
+      <para><command>svn copy</command>再次登场,你希望建立一个<filename>/calc/trunk</filename>的一个快照,就像<literal>HEAD</literal>修订版本,建立这样一个拷贝:</para>
 
 <screen>
 $ svn copy http://svn.example.com/repos/calc/trunk \
@@ -931,9 +928,9 @@
 
       <para>这个例子假定<filename>/calc/tags</filename>目录已经存在(如果不是,见<xref linkend="svn-ch-9-sect-1.2-re-mkdir"/>),拷贝完成之后,一个表示当时<literal>HEAD</literal>版本的/calc/trunk目录的镜像已经永久的拷贝到<filename>release-1.0</filename>目录。当然,你会希望更精确一点,以防其他人在你不注意的时候提交修改,所以,如果你知道<filename>/calc/trunk</filename>的版本350是你想要的快照,你可以使用<command>svn copy</command>加参数 <option>-r 350</option>。</para>
 
-      <para>但是等一下:标签的产生过程与建立分支是一样的?是的,实际上在Subversion标签与分支没有区别,都是普通的目录,通过copy命令得到,与分支一样,一个目录之所以是标签只是<emphasis>人们</emphasis>决定这样使用它,只要没有人提交这个目录,它永远是一个快照,但如果人们开始提交,它就变成了分支。</para>
+      <para>但是等一下:标签的产生过程与建立分支是一样的?是的,实际上在Subversion中标签与分支没有区别,都是普通的目录,通过copy命令得到,与分支一样,一个目录之所以是标签只是<emphasis>人们</emphasis>决定这样使用它,只要没有人提交这个目录,它永远是一个快照,但如果人们开始提交,它就变成了分支。</para>
 
-      <para>如果你管理一个版本库,你有两种方式管理标签,第一种方法是禁止命令:作为项目的政策,我们要决定标签所在的位置,确定所有用户知道如何处理拷贝的目录(也就是确保他们不会提交他们),第二种方法看来很疯狂:使用访问控制脚本来阻止任何想对标签目录做的非拷贝的操作(见<xref linkend="svn-ch-6"/>)这种方法通常是不必要的,如果一个人不小心提交了到标签目录一个修改,你可以简单的取消,毕竟这是版本控制啊。</para>
+      <para>如果你管理一个版本库,你有两种方式管理标签,第一种方法是禁止命令:作为项目的政策,我们要决定标签所在的位置,确定所有用户知道如何处理拷贝的目录(也就是确保他们不会提交他们),第二种方法看来很过分:使用访问控制脚本来阻止任何想对标签目录做的非拷贝的操作(见<xref linkend="svn-ch-6"/>)这种方法通常是不必要的,如果一个人不小心提交了到标签目录一个修改,你可以简单的取消,毕竟这是版本控制啊。</para>
 
     </sect2>
     
@@ -946,7 +943,7 @@
         -r</command>)来实现,或者转换文件和目录到特定分支(使用<command>svn
         switch</command>),这样做之后,你的工作拷贝成为版本库不同版本和分支的司令部,但是经过测试,你会知道这是你需要的一种精确数据组合。</para>
 
-      <para>是时候进行快照了,拷贝URL在这里不能工作,在这个例子里,你希望把本地拷贝的布局做镜像并且保存到版本库中,幸运的是,<command>svn copy</command>包括四种不同的使用方式(在第9章可以可以详细阅读),包括拷贝工作拷贝到版本库:</para>
+      <para>是时候进行快照了,拷贝URL在这里不能工作,在这个例子里,你希望把本地拷贝的布局做镜像并且保存到版本库中,幸运的是,<command>svn copy</command>包括四种不同的使用方式(在第9章可以详细阅读),包括拷贝工作拷贝到版本库:</para>
 
 <screen>
 $ ls
@@ -1009,7 +1006,7 @@
     <sect2 id="svn-ch-4-sect-7.2">
       <title>数据的生命周期</title>
 
-      <para>另一个Subversion模型的可爱特性是分支和标签可以有有限的生命周期,就像其他的版本化的项目,举个例子,假定你最终完成了<filename>calc</filename>项目你的个人分支上的所有工作,在合并了你的所有修改到<filename>/calc/trunk</filename>后,没有必要继续保留你的私有分支目录:</para>
+      <para>另一个Subversion模型的可爱特性是分支和标签可以有有限的生命周期,就像其它的版本化的项目,举个例子,假定你最终完成了<filename>calc</filename>项目你的个人分支上的所有工作,在合并了你的所有修改到<filename>/calc/trunk</filename>后,没有必要继续保留你的私有分支目录:</para>
 
 <screen>
 $ svn delete http://svn.example.com/repos/calc/branches/my-calc-branch \
@@ -1039,7 +1036,7 @@
 Committed revision 377.
 </screen>
 
-      <para>而且开发者可以自由的继续添加新的(试验的)特性到<filename>/calc/trunk</filename>,你可以宣布这样一种政策,只有bug修正提交到<filename>/calc/branches/stable-1.0</filename>,这样的话,人们继续在主干上工作,某个人会选择在稳定分支上做出一些Bug修正,甚至在稳定版本发布之后,你或许会在这个维护分支上工作很长时间—也就是说,你会一直继续为客户提供这个版本的支持。</para>
+      <para>而且开发者可以自由的继续添加新的(试验的)特性到<filename>/calc/trunk</filename>,你可以宣布这样一种政策,只有bug修正提交到<filename>/calc/branches/stable-1.0</filename>,这样的话,人们继续在主干上工作,某个人会选择在稳定分支上做出一些Bug修正,甚至在稳定版本发布之后。你或许会在这个维护分支上工作很长时间—也就是说,你会一直继续为客户提供这个版本的支持。</para>
 
     </sect2>
 




More information about the svnbook-dev mailing list