﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-www.testage.net---软件测试---RedHat Linux测试环境搭建---MYLIFE-随笔分类-开源测试工具</title><link>http://www.cnitblog.com/jakiegu/category/6582.html</link><description>测试时代的gufeng</description><language>zh-cn</language><lastBuildDate>Thu, 29 Sep 2011 15:42:36 GMT</lastBuildDate><pubDate>Thu, 29 Sep 2011 15:42:36 GMT</pubDate><ttl>60</ttl><item><title>Git版本管理工具中文教程连载3 </title><link>http://www.cnitblog.com/jakiegu/archive/2008/09/09/48874.html</link><dc:creator>Test8848-谷峰</dc:creator><author>Test8848-谷峰</author><pubDate>Tue, 09 Sep 2008 03:44:00 GMT</pubDate><guid>http://www.cnitblog.com/jakiegu/archive/2008/09/09/48874.html</guid><wfw:comment>http://www.cnitblog.com/jakiegu/comments/48874.html</wfw:comment><comments>http://www.cnitblog.com/jakiegu/archive/2008/09/09/48874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/jakiegu/comments/commentRss/48874.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/jakiegu/services/trackbacks/48874.html</trackback:ping><description><![CDATA[&nbsp;
<p align=left><span>1d2fa05b13b63e<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="39" UnitName="F">39f</st1:chmetcnv>621d8ee911817df0662d9b7 Some fun</span></p>
<p align=left><span>d2659fcf690ec<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="693" UnitName="C">693c</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="4" UnitName="C">04c</st1:chmetcnv>82b03202fc5530d50960 some work</span></p>
<p align=left><span>found 1 common ancestor(s):</span></p>
<p align=left><span>3ecebc0cb<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="4894" UnitName="a">4894a</st1:chmetcnv>33208dfa<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="7" UnitName="C">7c</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="7" UnitName="C">7c</st1:chmetcnv>6fc8b<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="5" UnitName="F">5f</st1:chmetcnv>9da0eda a new day for git</span></p>
<p align=left><span>Auto-merging hello</span></p>
<p align=left><span>CONFLICT (content): Merge conflict in hello</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>Automatic merge failed; fix up by hand</span></p>
<p align=left><span>git </span><span>的提示指出，在合并作用于文件</span><span> hello </span><span>的</span><span> 'Some fun' </span><span>和</span><span> 'some work' </span><span>这两个对象时有冲突，具体通俗点说，就是在</span><span> </span><span>master</span><span>, </span><span>robin</span><span> </span><span>这两个分支中的</span><span> hello </span><span>文件的某些相同的行中的内容不一样。我们需要手动解决这些冲突，现在先让我们看看现在的</span><span> hello </span><span>文件中的内容。</span><span> </span></p>
<p align=left><span>$ cat hello</span></p>
<p align=left><span>此时的</span><span> hello </span><span>文件应是这样的，用过其他的版本控制系统的朋友应该很容易看出这个典型的冲突表示格式：</span><span> </span></p>
<p align=left><span>Hello World</span></p>
<p align=left><span>It's a new day for git</span></p>
<p align=left><span>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD/hello</span></p>
<p align=left><span>Play, play, play</span></p>
<p align=left><span>=======</span></p>
<p align=left><span>Work, work, work</span></p>
<p align=left><span>&gt;&gt;&gt;&gt;&gt;&gt;&gt; d2659fcf690ec<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="693" UnitName="C">693c</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="4" UnitName="C">04c</st1:chmetcnv>82b03202fc5530d50960/hello</span></p>
<p align=left><span>我们用编辑器将</span><span> hello </span><span>文件改为：</span><span> </span></p>
<p align=left><span>Hello World</span></p>
<p align=left><span>It's a new day for git</span></p>
<p align=left><span>Play, play, play</span></p>
<p align=left><span>Work, work, work</span></p>
<p align=left><span>现在可以将手动解决了冲突的文件提交了。</span><span> </span></p>
<p align=left><span>$ git-commit -i hello</span></p>
<p align=left><span>以上是典型的两路合并（</span><span>2-way merge</span><span>）算法，绝大多数情况下已经够用。但是还有更复杂的三路合并和多内容树合并的情况。详情可参看：</span><span> <span><a href="http://www.kernel.org/pub/software/scm/git/docs/git-read-tree.html" target=_blank>git-read-tree</a></span></span><span>，</span><span> <span><a href="http://www.kernel.org/pub/software/scm/git/docs/git-merge.html" target=_blank>git-merge</a> </span></span><span>等文档。</span><span> </span></p>
<div>
<p align=left><strong><span>逆转与恢复：</span></strong><strong><span>git-reset</span></strong></p>
</div>
<p align=left><span>项目跟踪工具的一个重要任务之一，就是使我们能够随时逆转（</span><span>Undo</span><span>）和恢复（</span><span>Redo</span><span>）某一阶段的工作。</span><span> </span></p>
<p align=left><span><a href="http://www.kernel.org/pub/software/scm/git/docs/git-reset.html" target=_blank>git-reset </a></span><span>命令就是为这样的任务准备的。它将当前的工作分支的</span><span> </span><em><span>头</span></em><span> </span><span>定位到以前提交的任何版本中，它有三个重置的算法选项。</span><span> </span></p>
<p align=left><strong><span>命令形式：</span></strong><strong></strong></p>
<p align=left><strong><span>git-reset [--mixed | --soft | --hard] [&lt;commit-ish&gt;] </span></strong></p>
<p align=left><strong><span>命令的选项：</span></strong><strong></strong></p>
<p align=left><em><span>--mixed </span></em></p>
<p align=left><span>仅是重置索引的位置，而不改变你的工作树中的任何东西（即，文件中的所有变化都会被保留，也不标记他们为待提交状态），并且提示什么内容还没有被更新了。这个是默认的选项。</span><span> </span></p>
<p align=left><em><span>--soft </span></em></p>
<p align=left><span>既不触动索引的位置，也不改变工作树中的任何内容，我们只是要求这些内容成为一份好的内容（之后才成为真正的提交内容）。这个选项使你可以将已经提交的东西重新逆转至</span><span>&#8220;</span><span>已更新但未提交（</span><span>Updated but not Check in</span><span>）</span><span>&#8221;</span><span>的状态。就像已经执行过</span><span> </span><span>git-update-index</span><span> </span><span>命令，但是还没有执行</span><span> </span><span>git-commit</span><span> </span><span>命令一样。</span><span> </span></p>
<p align=left><em><span>--hard </span></em></p>
<p align=left><span>将工作树中的内容和头索引都切换至指定的版本位置中，也就是说自</span><span> &lt;commit-ish&gt; </span><span>之后的所有的跟踪内容和工作树中的内容都会全部丢失。因此，这个选项要慎用，除非你已经非常确定你的确不想再看到那些东西了。</span><span> </span></p>
<p align=left><strong><span>一个重要技巧－－逆转提交与恢复</span></strong><strong></strong></p>
<p align=left><span>可能有人会问，</span><span>--soft </span><span>选项既不重置头索引的位置，也不改变工作树中的内容，那么它有什么用呢？现在我们介绍一个</span><span> --soft </span><span>选项的使用技巧。下面我们用例子来说明：</span><span> </span></p>
<p align=left><span>$ git-checkout master</span></p>
<p align=left><span>$ git-checkout -b softreset</span></p>
<p align=left><span>$ git-show-branch</span></p>
<p align=left><span>这里我们创建了一个</span><span> </span><span>master</span><span> </span><span>的拷贝分支</span><span> </span><span>softreset</span><span>，现在我们可以看到两个分支是在同一起跑线上的。</span><span> </span></p>
<p align=left><span>! [master] Merge branch 'robin'</span></p>
<p align=left><span>&nbsp;! [robin] some work</span></p>
<p align=left><span>&nbsp;* [softreset] Merge branch 'robin'</span></p>
<p align=left><span>---</span></p>
<p align=left><span>- - [master] Merge branch 'robin'</span></p>
<p align=left><span>+ * [master^] Some fun</span></p>
<p align=left><span>++* [robin] some work</span></p>
<p align=left><span>我们为</span><span> </span><span>文件增加一些内容并提交。</span><span> </span></p>
<p align=left><span>$ echo "Botch, botch, botch" &gt;&gt; hello</span></p>
<p align=left><span>$ git-commit -a -m "some botch"</span></p>
<p align=left><span>$ git-show-branch</span></p>
<p align=left><span>我们可以看到此时</span><span> </span><span>softreset</span><span> </span><span>比</span><span> </span><span>master</span><span> </span><span>推进了一个版本</span><span> "some botch" </span><span>。</span><span> </span></p>
<p align=left><span>! [master] Merge branch 'robin'</span></p>
<p align=left><span>&nbsp;! [robin] some work</span></p>
<p align=left><span>&nbsp;* [softreset] some botch</span></p>
<p align=left><span>---</span></p>
<p align=left><span>&nbsp;* [softreset] some botch</span></p>
<p align=left><span>- - [master] Merge branch 'robin'</span></p>
<p align=left><span>+ * [master^] Some fun</span></p>
<p align=left><span>++* [robin] some work</span></p>
<p align=left><span>现在让我们来考虑这样的一种情况，假如我们现在对刚刚提交的内容不满意，那么我们再编辑项目的内容，再提交的话，那么</span><span> "some botch" </span><span>的内容就会留在版本库中了。我们当然不希望将有明显问题的内容留在版本库中，这个时候</span><span> </span><span>--soft</span><span> </span><span>选项就很有用了。为了深入了解</span><span> </span><span>--soft</span><span> </span><span>的机制，我们看看现在</span><span> softreset </span><span>分支的头和</span><span> ORIG_HEAD </span><span>保存的索引。</span><span> </span></p>
<p align=left><span>$ cat .git/refs/heads/softreset .git/ORIG_HEAD</span></p>
<p align=left><span>结果如下：</span><span> </span></p>
<p align=left><span>5e7cf906233e052bdca<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="8" UnitName="C">8c</st1:chmetcnv>598cad2cb<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="5478" UnitName="F">5478f</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="9540" UnitName="a">9540a</st1:chmetcnv></span></p>
<p align=left><span>7bbd1370e<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">2c</st1:chmetcnv>667d955b<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="6" UnitName="F">6f</st1:chmetcnv>6652bf8274efdc1fbd3</span></p>
<p align=left><span>现在用</span><span> </span><span>--soft</span><span> </span><span>选项逆转刚才提交的内容：</span><span> </span></p>
<p align=left><span>git-reset --soft HEAD^</span></p>
<p align=left><span>现在让我们再看看</span><span> .git/ORIG_HEAD </span><span>的中保存了什么？</span><span> </span></p>
<p align=left><span>$ cat .git/ORIG_HEAD</span></p>
<p align=left><span>结果如下：</span><span> </span></p>
<p align=left><span>5e7cf906233e052bdca<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="8" UnitName="C">8c</st1:chmetcnv>598cad2cb<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="5478" UnitName="F">5478f</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="9540" UnitName="a">9540a</st1:chmetcnv></span></p>
<p align=left><span>看！现在的</span><span> .git/ORIG_HEAD </span><span>等于逆转前的</span><span> .git/refs/heads/softreset </span><span>。也就是说，</span><span>git-reset --soft HEAD^</span><span> </span><span>命令逆转了刚才提交的版本进度，但是它将那次提交的对象的索引拷贝到了</span><span> .git/ORIG_HEAD </span><span>中。</span><span> </span></p>
<p align=left><span>我们再编辑</span><span> hello </span><span>文件成为下面的内容：</span><span> </span></p>
<p align=left><span>Hello World</span></p>
<p align=left><span>It's a new day for git</span></p>
<p align=left><span>Play, play, play</span></p>
<p align=left><span>Work, work, work</span></p>
<p align=left><span>Nice, nice, nice</span></p>
<p align=left><span>我们甚至可以比较一下现在的工作树中的内容和被取消了的那次提交的内容有什么差异：</span><span> </span></p>
<p align=left><span>$ git-diff ORIG_HEAD</span></p>
<p align=left><span>结果如下：</span><span> </span></p>
<p align=left><span>diff --git a/hello b/hello</span></p>
<p align=left><span>index f978676..dd<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="2" UnitName="C">02c</st1:chmetcnv>32 100644</span></p>
<p align=left><span>--- a/hello</span></p>
<p align=left><span>+++ b/hello</span></p>
<p align=left><span>@@ -2,4 +2,4 @@ Hello World</span></p>
<p align=left><span>&nbsp;It's a new day for git</span></p>
<p align=left><span>&nbsp;Play, play, play</span></p>
<p align=left><span>&nbsp;Work, work, work</span></p>
<p align=left><span>-Botch, botch, botch</span></p>
<p align=left><span>+Nice, nice, nice</span></p>
<p align=left><span>接着，我们可以恢复刚才被取消了的那次提交了。</span><span> </span></p>
<p align=left><span>$ git-commit -a -c ORIG_HEAD</span></p>
<p align=left><span>注意，这个命令会打开默认的文本编辑器以编辑原来提交的版本日志信息，我们改为</span><span> "nice work" </span><span>。大家可以自行用</span><span> </span><span>git-show-branch</span><span> </span><span>命令来查看一下现在的分支状态。并且我们还可以不断地重复上述的步骤，一直修改到你对这个版本进度满意为止。</span><span> </span></p>
<p align=left><span>git-reset </span><span>命令还有很多的用途和技巧，请参考</span><span> <span><a href="http://www.kernel.org/pub/software/scm/git/docs/git-reset.html" target=_blank>git-reset </a></span></span><span>，以及</span><span> <span><a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html" target=_blank>Everyday GIT with 20 commands or So </a></span></span><span>。</span><span> </span></p>
<img src ="http://www.cnitblog.com/jakiegu/aggbug/48874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/jakiegu/" target="_blank">Test8848-谷峰</a> 2008-09-09 11:44 <a href="http://www.cnitblog.com/jakiegu/archive/2008/09/09/48874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Git版本管理工具中文教程连载2</title><link>http://www.cnitblog.com/jakiegu/archive/2008/09/09/48873.html</link><dc:creator>Test8848-谷峰</dc:creator><author>Test8848-谷峰</author><pubDate>Tue, 09 Sep 2008 03:42:00 GMT</pubDate><guid>http://www.cnitblog.com/jakiegu/archive/2008/09/09/48873.html</guid><wfw:comment>http://www.cnitblog.com/jakiegu/comments/48873.html</wfw:comment><comments>http://www.cnitblog.com/jakiegu/archive/2008/09/09/48873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/jakiegu/comments/commentRss/48873.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/jakiegu/services/trackbacks/48873.html</trackback:ping><description><![CDATA[<span>此时，我们可以再次使用组合命令</span><span> </span><span>git-update-index</span><span> </span><span>和</span><span> </span><span>git-commit</span><span> </span><span>将我们的工作提交到版本库中。</span><span> </span>
<p align=left><span>$ git-update-index hello</span></p>
<p align=left><span>$ git-commit -m "new day for git"</span></p>
<p align=left><span>实际上，如果要提交的文件都是已经纳入</span><span> git </span><span>版本库的文件，那么不必为这些文件都应用</span><span> </span><span>git-update-index</span><span> </span><span>命令之后再进行提交，下面的命令更简捷并且和上面的命令是等价的。</span><span> </span></p>
<p align=left><span>$ git-commit -a -m "new day for git"</span></p>
<div>
<p align=left><strong><span>管理分支：</span></strong><strong><span>git-branch</span></strong></p>
</div>
<p align=left><span>直至现在为止，我们的项目版本库一直都是只有一个分支</span><span> </span><span>master</span><span>。在</span><span> git </span><span>版本库中创建分支的成本几乎为零，所以，不必吝啬多创建几个分支。下面列举一些常见的分支策略，仅供大家参考：</span><span> </span></p>
<p align=left><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>创建一个属于自己的个人工作分支，以避免对主分支</span><span> </span><span>master</span><span> </span><span>造成太多的干扰，也方便与他人交流协作。</span><span> </span></p>
<p align=left><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>当进行高风险的工作时，创建一个试验性的分支，扔掉一个烂摊子总比收拾一个烂摊子好得多。</span><span> </span></p>
<p align=left><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>合并别人的工作的时候，最好是创建一个临时的分支，关于如何用临时分支合并别人的工作的技巧，将会在后面讲述。</span><span> </span></p>
<p align=left><strong><span>创建分支</span></strong><strong></strong></p>
<p align=left><span>下面的命令将创建我自己的工作分支，名叫</span><span> robin</span><span>，并且将以后的工作转移到这个分支上开展。</span><span> </span></p>
<p align=left><span>$ git-branch robin</span></p>
<p align=left><span>$ git-checkout robin</span></p>
<p align=left><strong><span>删除分支</span></strong><strong></strong></p>
<p align=left><span>要删除版本库中的某个分支，使用</span><span> </span><span>git-branch -D</span><span> </span><span>命令就可以了，例如：</span><span> </span></p>
<p align=left><span>$ git-branch -D branch-name</span></p>
<p align=left><strong><span>查看分支</span></strong><strong></strong></p>
<p align=left><span>运行下面的命令可以得到你当前工作目录的分支列表：</span><span> </span></p>
<p align=left><span>$ git-branch</span></p>
<p align=left><span>如果你忘记了你现在工作在哪个分支上，运行下面的命令可以告诉你：</span><span> </span></p>
<p align=left><span>$ cat .git/HEAD </span></p>
<div>
<p align=left><strong><span>查看项目的发展变化和比较差异</span></strong><strong></strong></p>
</div>
<p align=left><span>这一节介绍几个查看项目的版本库的发展变化以及比较差异的很有用的命令： </span></p>
<p align=left><strong><span>git-show-branch</span></strong></p>
<p align=left><strong><span>git-diff</span></strong></p>
<p align=left><strong><span>git-whatchanged</span></strong></p>
<p align=left>&nbsp;</p>
<p align=left><span>我们现在为 <span>robin</span><span>, <span>master</span> </span>两个分支都增加一些内容。 </span></p>
<p align=left><span>$ git-checkout robin</span></p>
<p align=left><span>$ echo "Work, work, workd" &gt;&gt; hello</span></p>
<p align=left><span>$ git-commit -m "Some workd" -i hello</span></p>
<p align=left><span>$ git-checkout master</span></p>
<p align=left><span>$ echo "Play, play, play" &gt;&gt; hello</span></p>
<p align=left><span>$ echo "Lots of fun" &gt;&gt; example</span></p>
<p align=left><span>$ git-commit -m "Some fun" -i hello example</span></p>
<p align=left><span>git-show-branch</span><span> </span><span>命令可以使我们看到版本库中每个分支的世系发展状态，并且可以看到每次提交的内容是否已进入每个分支。 </span></p>
<p align=left><span>$ git-show-branch </span></p>
<p align=left><span>这个命令让我们看到版本库的发展记录。 </span></p>
<p align=left><span>* [master] Some fun</span></p>
<p align=left><span>&nbsp;! [robin] some work</span></p>
<p align=left><span>--</span></p>
<p align=left><span>*&nbsp;[master] Some fun</span></p>
<p align=left><span>&nbsp;+ [robin] some work</span></p>
<p align=left><span>*+ [master^] a new day for git</span></p>
<p align=left><span>譬如我们要查看世系标号为 <span>master^</span><span> </span>和 <span>robin</span><span> </span>的版本的差异情况，我们可以使用这样的命令： </span></p>
<p align=left><span>$ git-diff master^ robin</span></p>
<p align=left><span>我们可以看到这两个版本的差异： </span></p>
<p align=left><span>diff --git a/hello b/hello</span></p>
<p align=left><span>index <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="263414" UnitName="F">263414f</st1:chmetcnv>..cc<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="44" UnitName="C">44c</st1:chmetcnv>73 100644</span></p>
<p align=left><span>--- a/hello</span></p>
<p align=left><span>+++ b/hello</span></p>
<p align=left><span>@@ -1,2 +1,3 @@</span></p>
<p align=left><span>&nbsp;Hello World</span></p>
<p align=left><span>&nbsp;It's a new day for git</span></p>
<p align=left><span>+Work, work, work</span></p>
<table cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top>
            <p align=left><strong><u><span>Note</span></u></strong></p>
            </td>
            <td>
            <p align=left><span>关于<span> GIT </span>版本世系编号的定义，请参看 <span><a href="http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html" target=_blank>git-rev-parse </a></span>。 </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left><span>我们现在再用 <span>git-whatchanged</span><span> </span>命令来看看 <span>master</span><span> </span>分支是怎么发展的。 </span></p>
<p align=left><span>$ git-checkout master</span></p>
<p align=left><span>$ git-whatchanged </span></p>
<p align=left><span>diff-tree 1d2fa05... (from 3ecebc0...)</span></p>
<p align=left><span>Author: Vortune.Robin </span></p>
<p align=left><span>Date:<span>&nbsp;&nbsp; </span>Tue Mar 21 02:24:31 2006 +0800</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>Some fun</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>:100644 <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="True" SourceValue="100644" UnitName="F">100644 f</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="24" UnitName="C">24c</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="74" UnitName="a">74a</st1:chmetcnv>... <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="7" UnitName="F">7f</st1:chmetcnv>8b141... M&nbsp;example</span></p>
<p align=left><span>:100644 100644 <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="263414" UnitName="F">263414f</st1:chmetcnv>... 06fa<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="6" UnitName="a">6a</st1:chmetcnv>2... M&nbsp;hello</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>diff-tree 3ecebc0... (from <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="895" UnitName="F">895f</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="9" UnitName="a">09a</st1:chmetcnv>...)</span></p>
<p align=left><span>Author: Vortune.Robin </span></p>
<p align=left><span>Date:<span>&nbsp;&nbsp; </span>Tue Mar 21 02:17:23 2006 +0800</span></p>
<p align=left>&nbsp;</p>
<p align=left><span><span>&nbsp;&nbsp;&nbsp; </span>a new day for git</span></p>
<p align=left>&nbsp;</p>
<p align=left><span>:100644 100644 557db03... <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="263414" UnitName="F">263414f</st1:chmetcnv>... M&nbsp;hello</span></p>
<p align=left><span>从上面的内容中我们可以看到，在 <span>robin</span><span> </span>分支中的日志为<span> "Some work" </span>的内容<span>, </span>并没有在 <span>master</span><span> </span>分支中出现。 </span></p>
<div>
<p align=left><strong><span>合并两个分支：</span></strong><strong><span>git-merge</span></strong></p>
</div>
<p align=left><span>既然我们为项目创建了不同的分支，那么我们就要经常地将自己或者是别人在一个分支上的工作合并到其他的分支上去。现在我们看看怎么将</span><span> </span><span>robin</span><span> </span><span>分支上的工作合并到</span><span> </span><span>master</span><span> </span><span>分支中。现在转移我们当前的工作分支到</span><span> </span><span>master</span><span>，并且将</span><span> </span><span>robin</span><span> </span><span>分支上的工作合并进来。</span><span> </span></p>
<p align=left><span>$ git-checkout master</span></p>
<p align=left><span>$ git-merge "Merge work in robin" HEAD robin</span></p>
<p align=left><span>合并两个分支，还有一个更简便的方式，下面的命令和上面的命令是等价的。</span><span> </span></p>
<p align=left><span>$ git-checkout master</span></p>
<p align=left><span>$ git-pull . robin</span></p>
<p align=left><span>但是，此时</span><span> git </span><span>会出现合并冲突提示：</span><span> </span></p>
<p align=left><span>Trying really trivial in-index merge...</span></p>
<p align=left><span>fatal: Merge requires file-level merging</span></p>
<p align=left><span>Nope.</span></p>
<p align=left><span>Merging HEAD with d2659fcf690ec<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="693" UnitName="C">693c</st1:chmetcnv><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="4" UnitName="C">04c</st1:chmetcnv>82b03202fc5530d50960</span></p>
<p align=left><span>Merging:</span></p>
<img src ="http://www.cnitblog.com/jakiegu/aggbug/48873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/jakiegu/" target="_blank">Test8848-谷峰</a> 2008-09-09 11:42 <a href="http://www.cnitblog.com/jakiegu/archive/2008/09/09/48873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Git版本管理工具中文教程连载1</title><link>http://www.cnitblog.com/jakiegu/archive/2008/09/09/snooker.html</link><dc:creator>Test8848-谷峰</dc:creator><author>Test8848-谷峰</author><pubDate>Tue, 09 Sep 2008 03:40:00 GMT</pubDate><guid>http://www.cnitblog.com/jakiegu/archive/2008/09/09/snooker.html</guid><wfw:comment>http://www.cnitblog.com/jakiegu/comments/48872.html</wfw:comment><comments>http://www.cnitblog.com/jakiegu/archive/2008/09/09/snooker.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/jakiegu/comments/commentRss/48872.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/jakiegu/services/trackbacks/48872.html</trackback:ping><description><![CDATA[&nbsp;<span>Git --- The stupid content tracker, </span><span>傻瓜内容跟踪器。</span><span>Linus </span><span>是这样给我们介绍</span><span> <span>Git </span></span><span>的。</span><span> </span>
<p align=left><span>Git </span><span>是用于</span><span> Linux </span><span>内核开发的版本控制工具。与常用的版本控制工具</span><span> CVS, Subversion </span><span>等不同，它采用了分布式版本库的方式，不必服务器端软件支持，使源代码的发布和交流极其方便。</span><span> Git </span><span>的速度很快，这对于诸如</span><span> Linux kernel </span><span>这样的大项目来说自然很重要。</span><span> Git </span><span>最为出色的是它的合并跟踪（</span><span>merge tracing</span><span>）能力。</span><span> </span></p>
<p align=left><span>实际上内核开发团队决定开始开发和使用</span><span> Git </span><span>来作为内核开发的版本控制系统的时候，世界开源社群的反对声音不少，最大的理由是</span><span> Git </span><span>太艰涩难懂，从</span><span> Git </span><span>的内部工作机制来说，的确是这样。但是随着开发的深入，</span><span>Git </span><span>的正常使用都由一些友好的脚本命令来执行，使</span><span> Git </span><span>变得非常好用，即使是用来管理我们自己的开发项目，</span><span>Git </span><span>都是一个友好，有力的工具。现在，越来越多的著名项目采用</span><span> Git </span><span>来管理项目开发，例如：</span><span>wine, U-boot </span><span>等，详情看</span><span> <span><a href="http://www.kernel.org/git" target=_blank>http://www.kernel.org/git</a> </span></span></p>
<p align=left><span>作为开源自由原教旨主义项目，</span><span>Git </span><span>没有对版本库的浏览和修改做任何的权限限制。它只适用于</span><span> Linux / Unix </span><span>平台，没有</span><span> Windows </span><span>版本，目前也没有这样的开发计划。</span><span> </span></p>
<p align=left><span>本文将以</span><span> Git </span><span>官方文档</span><span> <span><a href="http://www.kernel.org/pub/software/scm/git/docs/tutorial.html" target=_blank>Tutorial</a></span></span><span>，</span><span> <span><a href="http://www.kernel.org/pub/software/scm/git/docs/core-tutorial.html" target=_blank>core-tutorial</a> </span></span><span>和</span><span> <span><a href="http://www.kernel.org/pub/software/scm/git/docs/everyday.html" target=_blank>Everyday GIT</a> </span></span><span>作为蓝本翻译整理，但是暂时去掉了对</span><span> Git </span><span>内部工作机制的阐述，力求简明扼要，并加入了作者使用</span><span> Git </span><span>的过程中的一些心得体会，注意事项，以及更多的例子。建议你最好通过你所使用的</span><span> Unix / Linux </span><span>发行版的安装包来安装</span><span> Git, </span><span>你可以</span><span><a href="http://www.bitsun.com/documents/gittutorcn.htm"><span><span>在线浏览本文</span></span></a> </span><span>，也可以通过下面的命令来得到本文最新的版本库，并且通过后面的学习用</span><span> Git </span><span>作为工具参加到本文的创作中来。</span></p>
<p align=left><span>$ git-clone http://www.bitsun.com/git/gittutorcn.git</span></p>
<div>
<p align=left><strong><span>创建一个版本库：</span></strong><strong><span>git-init-db</span></strong></p>
</div>
<p align=left><span>创建一个</span><span> Git </span><span>版本库是很容易的，只要用命令</span><span> </span><span>git-init-db</span><span> </span><span>就可以了。现在我们来为本文的写作创建一个版本库：</span></p>
<p align=left><span>$ mkdir gittutorcn</span></p>
<p align=left><span>$ cd gittutorcn</span></p>
<p align=left><span>$ git-init-db</span></p>
<p align=left><span>git </span><span>将会作出以下的回应</span></p>
<p align=left><span>defaulting to local storage area</span></p>
<p align=left><span>这样，一个空的版本库就创建好了，并在当前目录中创建一个叫<span> .git </span>的子目录。你可以用 <span>ls -a</span><span> </span>查看一下，并请注意其中的三项内容： </span></p>
<p align=left><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一个叫<span> HEAD </span>的文件，我们现在来查看一下它的内容： </span></p>
<p align=left><span>$ cat .git/HEAD</span></p>
<p align=left><span>现在<span> HEAD </span>的内容应该是这样： </span></p>
<p align=left><span>ref: refs/heads/master</span></p>
<p align=left><span>我们可以看到，<span>HEAD </span>文件中的内容其实只是包含了一个索引信息，并且，这个索引将总是指向你的项目中的当前开发分支。</span></p>
<p align=left><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一个叫<span> objects </span>的子目录，它包含了你的项目中的所有对象，我们不必直接地了解到这些对象内容，我们应该关心是存放在这些对象中的项目的数据。</span></p>
<table cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top>
            <p align=left><strong><u><span>Note</span></u></strong></p>
            </td>
            <td>
            <p align=left><span>关于<span> git </span>对象的分类，以及<span> git </span>对象数据库的说明，请参看 <span><a href="http://www.kernel.org/pub/software/scm/git/docs/#Discussion," target=_blank>[Discussion]</a> </span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>一个叫<span> refs </span>的子目录，它用来保存指向对象的索引。</span></p>
<p align=left><span>具体地说，子目录 <span>refs</span><span> </span>包含着两个子目录叫 <span>heads</span><span> </span>和 <span>tags</span>，就像他们的名字所表达的意味一样：他们存放了不同的开发分支的<em>头</em>的索引<span>, </span>或者是你用来标定版本的<em>标签</em>的索引。 </span></p>
<p align=left><span>请注意：<span>master</span><span> </span>是默认的分支，这也是为什么 <span>.git/HEAD</span><span> </span>创建的时候就指向 <span>master</span><span> </span>的原因，尽管目前它其实并不存在。<span> git </span>将假设你会在 <span>master</span><span> </span>上开始并展开你以后的工作，除非你自己创建你自己的分支。 </span></p>
<p align=left><span>另外，这只是一个约定俗成的习惯而已，实际上你可以将你的工作分支叫任何名字，而不必在版本库中一定要有一个叫 <span>master</span><span> </span>的分支，尽管很多<span> git </span>工具都认为 <span>master</span><span> </span>分支是存在的。 </span></p>
<p align=left><span>现在已经创建好了一个<span> git </span>版本库，但是它是空的，还不能做任何事情，下一步就是怎么向版本库植入数据了。 </span></p>
<div>
<p align=left><strong><span>植入内容跟踪信息：</span></strong><strong><span>git-add</span></strong></p>
</div>
<p align=left><span>为了简明起见，我们创建两个文件作为练习：</span><span> </span></p>
<p align=left><span>$ echo "Hello world" &gt; hello</span></p>
<p align=left><span>$ echo "Silly example" &gt; example</span></p>
<p align=left><span>我们再用</span><span> </span><span>git-add</span><span> </span><span>命令将这两个文件加入到版本库文件索引当中：</span><span> </span></p>
<p align=left><span>$ git-add hello example</span></p>
<p align=left><span>git-add </span><span>实际上是个脚本命令，它是对</span><span> git </span><span>内核命令</span><span> </span><span>git-update-index</span><span> </span><span>的调用。因此上面的命令和下面的命令其实是等价的：</span><span> </span></p>
<p align=left><span>$ git-update-index --add hello example</span></p>
<p align=left><span>如果你要将某个文件从</span><span> git </span><span>的目录跟踪系统中清除出去，同样可以用</span><span> </span><span>git-update-index</span><span> </span><span>命令。例如：</span><span> </span></p>
<p align=left><span>$ git-update-index --force-remove foo.c</span></p>
<table cellPadding=0 border=0>
    <tbody>
        <tr>
            <td vAlign=top>
            <p align=left><strong><u><span>Note</span></u></strong></p>
            </td>
            <td>
            <p align=left><span>git-add</span><span> </span><span>可以将某个目录下的所有内容全都纳入内容跟踪之下，例如： <span>git-add ./path/to/your/wanted</span><span> </span>。但是在这样做之前，应该注意先将一些我们不希望跟踪的文件清理掉，例如，<span>gcc </span>编译出来的<span> *.o </span>文件，<span>vim </span>的交换文件<span> .*.swp </span>之类。 </span></p>
            </td>
        </tr>
    </tbody>
</table>
<p align=left><span>应该建立一个清晰的概念就是，</span><span>git-add</span><span> </span><span>和</span><span> </span><span>git-update-index</span><span> </span><span>只是刷新了</span><span> git </span><span>的跟踪信息，</span><span>hello </span><span>和</span><span> example </span><span>这两个文件中的内容并没有提交到</span><span> git </span><span>的内容跟踪范畴之内。</span><span> </span></p>
<div>
<p align=left><strong><span>提交内容到版本库：</span></strong><strong><span>git-commit</span></strong></p>
</div>
<p align=left><span>既然我们刷新了</span><span> Git </span><span>的跟踪信息，现在我们看看版本库的状态：</span><span> </span></p>
<p align=left><span>$ git-status</span></p>
<p align=left><span>我们能看到</span><span> git </span><span>的状态提示：</span><span> </span></p>
<p align=left><span>#</span></p>
<p align=left><span># Initial commit</span></p>
<p align=left><span>#</span></p>
<p align=left><span>#</span></p>
<p align=left><span># Updated but not checked in:</span></p>
<p align=left><span>#<span>&nbsp;&nbsp; </span>(will commit)</span></p>
<p align=left><span>#</span></p>
<p align=left><span>#<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new file: example</span></p>
<p align=left><span>#<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>new file: hello</span></p>
<p align=left><span>#</span></p>
<p align=left><span>提示信息告诉我们版本库中加入了两个新的文件，并且</span><span> git </span><span>提示我们提交这些文件，我们可以通过</span><span> </span><span>git-commit</span><span> </span><span>命令来提交：</span><span> </span></p>
<p align=left><span>$ git-commit -m "Initial commit of gittutor reposistory"</span></p>
<div>
<p align=left><strong><span>查看当前的工作：</span></strong><strong><span>git-diff</span></strong></p>
</div>
<p align=left><span>git-diff</span><span> </span><span>命令将比较当前的工作目录和版本库数据库中的差异。现在我们编辑一些文件来体验一下</span><span> git </span><span>的跟踪功能。</span><span> </span></p>
<p align=left><span>$ echo "It's a new day for git" &gt;&gt; hello</span></p>
<p align=left><span>我们再来比较一下，当前的工作目录和版本库中的数据的差别。</span><span> </span></p>
<p align=left><span>$ git-diff</span></p>
<p align=left><span>差异将以典型的</span><span> patch </span><span>方式表示出来：</span><span> </span></p>
<p align=left><span>diff --git a/hello b/hello</span></p>
<p align=left><span>index a<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="5" UnitName="C">5c</st1:chmetcnv>1966..bd<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="9212" UnitName="C">9212c</st1:chmetcnv> 100644</span></p>
<p align=left><span>--- a/hello</span></p>
<p align=left><span>+++ b/hello</span></p>
<p align=left><span>@@ -1 +1,2 @@</span></p>
<p align=left><span>&nbsp;Hello, world</span></p>
<p align=left><span>+It's a new day for git</span></p>
<img src ="http://www.cnitblog.com/jakiegu/aggbug/48872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/jakiegu/" target="_blank">Test8848-谷峰</a> 2008-09-09 11:40 <a href="http://www.cnitblog.com/jakiegu/archive/2008/09/09/snooker.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用xml语言自动导入测试需求到开源测试工具testlink</title><link>http://www.cnitblog.com/jakiegu/archive/2007/11/28/36991.html</link><dc:creator>Test8848-谷峰</dc:creator><author>Test8848-谷峰</author><pubDate>Wed, 28 Nov 2007 07:54:00 GMT</pubDate><guid>http://www.cnitblog.com/jakiegu/archive/2007/11/28/36991.html</guid><wfw:comment>http://www.cnitblog.com/jakiegu/comments/36991.html</wfw:comment><comments>http://www.cnitblog.com/jakiegu/archive/2007/11/28/36991.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnitblog.com/jakiegu/comments/commentRss/36991.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/jakiegu/services/trackbacks/36991.html</trackback:ping><description><![CDATA[<p>对于<a href="http://www.testage.net/">开源工具测试管理工具</a>testlink，想必大家都不陌生，这个工具非常小巧，安装起来也比较简单，是基于WAMP/LAMP的一个B/S结构的软件，至于什么是WAMP/LAMP，我就不用解释了，开源中应用非常广泛的架构。<br>testlink的下载地址<a href="http://bbs.testage.net/thread-10037-1-1.html">http://bbs.testage.net/thread-10037-1-1.html</a><br>testlink的安装视频过几天也会发布，欢迎广大网友随时关注测试时代的论坛开源工具板块<a href="http://bbs.testage.net/forum-11-1.html">http://bbs.testage.net/forum-11-1.html</a><br></p>
<p><br>1.关于使用的过程，我这里不在重复，网上的教程也很多，关于需求我先贴副图出来<br><img src="http://www.cnitblog.com/images/cnitblog_com/jakiegu/1.png" border=0></p>
<p>这里可以并不能看出如何去自动导入需求，在这里我们只能先自己创建需求的类型&#8220;功能需求&#8221;、&#8220;性能需求&#8221;、&#8220;安全性需求&#8221;、&#8220;其他需求&#8221;等等。自动导入需求只能针对下一级模块<br><br><img src="http://www.cnitblog.com/images/cnitblog_com/jakiegu/2.png" border=0><br>2.Testlink &#8220;Import&#8221;目前可以支持三种倒入模式CVS、CVS（doors）、XML三种模式，我们就重点来看一下XML模式，要想使用XML导入测试需求，首先要对XML有一些了解才行<br><br>XML介绍<a href="http://baike.baidu.com/view/63.htm">http://baike.baidu.com/view/63.htm</a>，另外大家可以下载一个XML的语法看看，和html非常类似，假如你没有这方面经验的话可以利用我已经写好的XML模板，我一般会使用我一般会使用Ultraedit来编辑我的测试需求<br><img src="http://www.cnitblog.com/images/cnitblog_com/jakiegu/3.png" border=0><br>大家可以看到我把基本的语法都标示出来了，不过更高级的应用还需要多多了解一下XML的语法。最后贴图来看一下效果<br><img src="http://www.cnitblog.com/images/cnitblog_com/jakiegu/4.png" border=0></p>
建议大家把每一个需求都分门别类，如xxx项目-----测试需求-----功能需求、性能需求、安全性需求等等，如果有想要xml语法的朋友，请留下邮件地址，我会统一发给大家。 
<img src ="http://www.cnitblog.com/jakiegu/aggbug/36991.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/jakiegu/" target="_blank">Test8848-谷峰</a> 2007-11-28 15:54 <a href="http://www.cnitblog.com/jakiegu/archive/2007/11/28/36991.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>