从VSS到SVN再到Git 记Git的基本操作

bangat 8年前
   <p>Source code control 一直是软件开发过程中重要的环节,从最初的纯文件备份,到使用工具进行管理。Source code control 工具的作用也不仅仅只是单纯的对同一个版本进行管理了。从目前主流的source code control工具当中不难发现里面的Branch, tag等功能的应用场景越来越多,特别是现在多数企业使用的敏捷编程,结合branch和tag等功能真的能够很好的做到多版本开发,快速迭代。</p>    <p>思考: 没有source code control我们如何快速的基于一份代码同时进行多个功能的并行开发。</p>    <p>回过头来说下本人在行业当中所用到的几款source code control工具。</p>    <h2>VSS</h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/d377d1a2803b0ad9ba797e056ddcc28c.jpg"></p>    <p>VSS(Visual Source Salf),是一款微软提供的代码管理工具,作为Visual Studio的一员,在早期的开发过程当中确实能够确保代码不被开发人员错误的修改,也解决了异地开发协作的代码共享管理的难点。但是依旧有一些不足,比如:</p>    <ul>     <li>文件基本以独占的形势进行锁定。如果A在修改的时候B没有办法进行修改。</li>     <li>VSS只支持Windows版本,支持的开发工具仅支持微软系。</li>     <li>基于文件存储,服务器必须共享文件夹。安全性值得考虑。以前一般用于内网开发环境。</li>     <li>收费</li>    </ul>    <h2>SVN</h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/72d2d328fd3e7eaa5ab3d99e387a3996.jpg"></p>    <p>SVN(Subversion),一个开源的source code control system。除开最基本的如VSS提供的代码管理功能外,最大的亮点是提供了分支,且提交内容的级别基于代码行了。也就是说,不用再有独占文件开发的问题了。比如,一个实现接口的代码文件可以由多个开发人员同时修改。谁先做完谁可以先进行提交,不会等到必须所有的人做完后再进行合并。对于不能使用VSS的工程师来说,SVN的出现完全是一个福音,直接从CVS跳到了这么强大的工具上。</p>    <p>总结一下,SVN的优劣如下:</p>    <ul>     <li><strong>优势</strong> :      <ul>       <li>代码一致性高。</li>       <li>支持提交事物性操作。</li>       <li>Diff 功能。</li>       <li>Branch,Tag的引用,方便版本管理。</li>       <li>轻松上手。</li>      </ul> </li>     <li><strong>劣势</strong>      <ul>       <li>必须是联网状态下才可以进行一些数据的读取。</li>       <li>不是分布式的代码库。</li>       <li>SVN服务器崩溃的灾难是巨大的。</li>      </ul> </li>    </ul>    <h2>Git</h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/272251005822e6d82d5cd50ace69a94e.jpg"></p>    <p>随着开源运动的流行(Liunx开发人员的功劳),Git也就这么流行起来的。说是在随着开源运动的流行而流行起Git的呢?这归功于Git的分布式这一特性。试想,如果全世界所有的Liunx爱好者都在几台机器上进行开发和提交,这酸爽不敢想象。抑或是主服务器崩溃了,那么其他的开发人员也只有泪奔。</p>    <p>Git的牛逼之处在于以下:</p>    <ul>     <li>每一次Clone就是从服务器上pull到了所有的内容,包括版本信息。</li>     <li>在本地可以根据不同的需要,本地新建自己的分支。</li>     <li>分支之间的任意切换。</li>     <li>单机上就可以进行分支合并。</li>     <li>牛人+插件加持。</li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/f3ecc3cf5b3902dbb1ff2356fe65e67e.png"></p>    <p>A successful Git branching model</p>    <h3>如何使用Git</h3>    <ol>     <li>安装</li>     <li> <p>$ Brew install git</p> </li>     <li> <p>创建仓库</p> </li>     <li>$ git init</li>     <li> <p>文件操作</p> <p>有了仓库后就可以对文件进行 add , commit, push 和pull等操作了。</p> </li>    </ol>    <table>     <thead>      <tr>       <th>Tables</th>       <th>Are</th>      </tr>     </thead>     <tbody>      <tr>       <td>git add</td>       <td>添加至暂存区</td>      </tr>      <tr>       <td>git add–interactive</td>       <td>交互式添加</td>      </tr>      <tr>       <td>git apply</td>       <td>应用补丁</td>      </tr>      <tr>       <td>git am</td>       <td>应用邮件格式补丁</td>      </tr>      <tr>       <td>git annotate同义词,等同于 git blame</td>      </tr>      <tr>       <td>git archive</td>       <td>文件归档打包</td>      </tr>      <tr>       <td>git bisect</td>       <td>二分查找</td>      </tr>      <tr>       <td>git blame</td>       <td>文件逐行追溯</td>      </tr>      <tr>       <td>git branch</td>       <td>分支管理</td>      </tr>      <tr>       <td>git cat-file</td>       <td>版本库对象研究工具</td>      </tr>      <tr>       <td>git checkout</td>       <td>检出到工作区、切换或创建分支</td>      </tr>      <tr>       <td>git cherry-pick</td>       <td>提交拣选</td>      </tr>      <tr>       <td>git citool</td>       <td>图形化提交,相当于 git gui 命令</td>      </tr>      <tr>       <td>git clean</td>       <td>清除工作区未跟踪文件</td>      </tr>      <tr>       <td>git clone</td>       <td>克隆版本库</td>      </tr>      <tr>       <td>git commit</td>       <td>提交</td>      </tr>      <tr>       <td>git config</td>       <td>查询和修改配置</td>      </tr>      <tr>       <td>git describe</td>       <td>通过里程碑直观地显示提交ID</td>      </tr>      <tr>       <td>git diff</td>       <td>差异比较</td>      </tr>      <tr>       <td>git difftool</td>       <td>调用图形化差异比较工具</td>      </tr>      <tr>       <td>git fetch</td>       <td>获取远程版本库的提交</td>      </tr>      <tr>       <td>git format-patch</td>       <td>创建邮件格式的补丁文件。参见 git am 命令</td>      </tr>      <tr>       <td>git grep</td>       <td>文件内容搜索定位工具</td>      </tr>      <tr>       <td>git gui</td>       <td>基于Tcl/Tk的图形化工具,侧重提交等操作</td>      </tr>      <tr>       <td>git help</td>       <td>帮助</td>      </tr>      <tr>       <td>git init</td>       <td>版本库初始化</td>      </tr>      <tr>       <td>git init-db*</td>       <td>同义词,等同于 git init</td>      </tr>      <tr>       <td>git log</td>       <td>显示提交日志</td>      </tr>      <tr>       <td>git merge</td>       <td>分支合并</td>      </tr>      <tr>       <td>git mergetool</td>       <td>图形化冲突解决</td>      </tr>      <tr>       <td>git mv</td>       <td>重命名</td>      </tr>      <tr>       <td>git pull</td>       <td>拉回远程版本库的提交</td>      </tr>      <tr>       <td>git push</td>       <td>推送至远程版本库</td>      </tr>      <tr>       <td>git rebase</td>       <td>分支变基</td>      </tr>      <tr>       <td>git rebase–interactive</td>       <td>交互式分支变基</td>      </tr>      <tr>       <td>git reflog</td>       <td>分支等引用变更记录管理</td>      </tr>      <tr>       <td>git remote</td>       <td>远程版本库管理</td>      </tr>      <tr>       <td>git repo-config*</td>       <td>同义词,等同于 git config</td>      </tr>      <tr>       <td>git reset</td>       <td>重置改变分支“游标”指向</td>      </tr>      <tr>       <td>git rev-parse</td>       <td>将各种引用表示法转换为哈希值等</td>      </tr>      <tr>       <td>git revert</td>       <td>反转提交</td>      </tr>      <tr>       <td>git rm</td>       <td>删除文件</td>      </tr>      <tr>       <td>git show</td>       <td>显示各种类型的对象</td>      </tr>      <tr>       <td>git stage*</td>       <td>同义词,等同于 git add</td>      </tr>      <tr>       <td>git stash</td>       <td>保存和恢复进度</td>      </tr>      <tr>       <td>git status</td>       <td>显示工作区文件状态</td>      </tr>      <tr>       <td>git tag</td>       <td>里程碑管理</td>      </tr>     </tbody>    </table>    <p>.</p>    <p>.</p>    <h2><em>Best practice</em></h2>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/3d1c30f5042b9b11a70ca22d31566f06.jpg"></p>    <p>建议使用github进行上手实验。使用邮箱注册一次Git hub后即可在Github上创建自己的Repository.</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/72b6509077dcff43f6f0a21ee1956b1d.jpg"></p>    <p>创建完成后,我们会得到一个Repository的地址。有了这个地址我们就可以进行Git的练习了。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/7d888d58e9c2fc11256f9e93bfa893a2.jpg"></p>    <ul>     <li> <p>使用 git clone 将远程仓库clone到本地。</p> <pre>  git clone</pre> </li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/34873571cadd1317afdd330aa8ef00a8.jpg"></p>    <ul>     <li>添加一些文件</li>    </ul>    <pre>  echo "Hello Scott" -> "Hello"   //写了一个文件到Hello    git add Hello // 将Hello文件添加到暂存区。(Index)    git commit -m "this is my first file" // 提交到本地仓库    git push  //推送本地仓库到远程仓库</pre>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0dd71d4f45d97ca45d6b7b5db5cc57f1.jpg"></p>    <p>以上,文件就被推送到了远程仓库。其他工程师如果执行Pull操作的话即可把变动的文件拉到本地。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/9ba774be14987b45bbf511d8d22148d1.jpg"></p>    <ul>     <li>如果有其他工程师修改了文件,需要远程获取下。 <pre>  git pull  //拉取远端文件   git log //可以查看变更历史</pre> </li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/4afd8bc6c8df9d13839be751f580fe5c.jpg"></p>    <ul>     <li> <p>冲突的解决</p> <p>冲突往往是因为版本不一致而产生。如工程师A修改了Hello文件并提交到远端仓库,而B在本地修改了Hello,也想提交。由于A和B的Hello文件并不一致,所以冲突产生了。</p> </li>    </ul>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/0968505bbb0ec28e9e1c72b39faee4ac.jpg"></p>    <p>只需要git pull一次即可。 (注:git pull 会自动merge,但是通常情况下自动merge效果不会太好。比如A和B 都在修改function A (){} )</p>    <p>冲突长这模样。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/875f994097f9da3f2d24d8ab409cf3dc.jpg"></p>    <p>一般手动解决冲突后,重新添加,提交,push即可。</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/d4cb2d94ae76df005ffd89634a4c6516.jpg"></p>    <p>如上描述,手动合并冲突比较麻烦。建议使用工具进行git 的操作,现在一般的工具都提供了分支管理,合并等功能。</p>    <p>推荐 <strong>SourceTree</strong></p>    <h3>分支的管理</h3>    <p>在很多时候会遇到同时需要开发多个功能,开发任务将会交给多个工程师进行开发,这个时候在Git上的实践为-->创建多个分支。 N个工程师从Master或Dev分支进行分支创建。</p>    <pre>  git checkout -b NewFeature   // 分支建好后,会直接切换到该分支。  git push --set-upstream origin NewFeature //与远程分支关联</pre>    <p>完成开发后,需要合并到Master 或Dev 分支。</p>    <pre>  git merge origin/NewFeature  // 将远程分支NewFeature与当前分支合并。</pre>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/f9c4ea8233e67f5097f05f0530116ab2.jpg"></p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/56ff321623c9</p>    <p> </p>