我的日常Git使用

一)What is Git
  关于什么是Git,这个google或者baidu便可以,这里推荐几本书供系统学习Git的使用。首先《Pro Git》,有在线版(http://progit.org/book);第二本可以作为简单使用参考手册的《Pragmatic Version Control Using Git》 (Travis Swicegood)中文名叫《版本控制之道--使用Git》;第三本我们中国人自己写的,谁说中国人参与开源项目不行的?Got Git 中文名《Git 权威指南》,作者是蒋鑫老师,老师参与了Git相关的众多项目,强烈推荐这本书以及他的网站(http://worldhello.net)。在此,我只是在读了上面3本著作后,对自己日常使用Git的常规操作做个总结,以防自己忘了。
二)Why do I use Git
  我用Git,并没有像书中或者是其他对Git的介绍那样去管理一个实际的项目,或者用于实际的项目合作中。可能我还没有体会到版本控制在项目合作中的卓越功效吧,但是我却发现Git解决了我一个重要的问题,可能也是很多大学生尤其计算机专业的同学的问题:自己大二写的链表程序在大三做课设的时候丢失了,每次做课设都要重新拿书去实现链表(当然高手不用找书了,3s内写出来)。还有就是在做课设(或者自己想用Qt写个备忘录)时,因为要确定一个Bug引入的时间,将代码删删改改,结果改不回来了;更有就是,自己想发挥一下,写了个生词本,但是昨天突然发现界面可以用Qt的布局管理器而不用手工布局会更好,于是乎将代码删去一大半(都是写布局的繁琐代码,没有太强的逻辑性,但是得敲很多键盘),后来发现效果还没有之前的好,但是之前的代码已经没有了,于是又得手工敲n多代码,而且都是些类似mark语言的枯燥句子。
  上面提到的代码丢失的问题,我想大家也遇到过,在使用了Git后,我们可以把某个文件夹,或者分区做成Git裸仓库文件服务器,然后将每个练习在其下的子文件夹里建裸仓库。Git的文件传输协议可以把这个文件夹当成文件服务器使用。这样就不用担心把工作目录删掉后文件丢失了。
  我可以把我DS课上的练习放在DS目录,然后在里面git init一下,再git add * ,然后 git commit。就把我实现的不带head节点的单链表存储好了,而后我想将其改为带head节点的,只要git checkout -b with_head即可,当我要在不带head节点的基础上扩展成双向链表时,只要git checkout master ,git checkout -b master。
  使用Git很好的解决了上述的问题,so easy! 我再也不用担心我的代码啦!
三)How do use it
  我用链表练习为例记录使用Git的过程。
1)build my project
  a)假设我用我独立的一个分区,挂在在/media/git下,作为文件服务器,里面放Git仓库。首先建立该练习的文件夹,然后在该文件夹下面建立Git裸仓库。
    <code>
      git init --bare list.git
    </code>
  这样就建立了Git裸仓库list。在该文件夹下会出现一系列的Git仓库文件,不用管他。
  b)到我的工作目录下clone之前建立的list仓库。
    <code>
      cd ~/Workspace/
      git clone /media/git/list.git list
    </code>
  这样会出现
    <show>
      warning: You appear to have cloned an empty repository.
    </show>
  不用管warning。这样我们就可以在工作目录进行我的开发工作了。
2)add and delete
  a)假设我们编辑好了头文件list.h ,.c文件list.c以及测试用的test.c文件和Makefile。这时使用
    <code>
      git add list.h list.c test.c Makefile
    </code>
  就可以将我们的文件放到Stage区了(Stage的概念,参见上面的参考书,这篇文档只记录用法。)。
  可以使用
    <code>
      git status
    </code>
  来查看当前版本库的状态,可以根据提示进行下一步操作。
  也可以使用
    <code>
      git add -i
    </code>
  一个交互界面来添加文件到Stage。
  如果发现把不应该加入的文件加入到了Stage区了,可以使用
    <code>
      git rm --cached Makefile
    </code>
  可以将刚加入到Stage区的Makefile从Stage区中删除。
  而命令
    <code>
      git rm Makefile
    </code>
  则可以从但前的工作区和Stage区都删除掉Makefile文件,等待提交。
3)commit and log
  a)假设已经确定make后可以执行,完成了编码的工作,便可以将Stage区的内容提交到本地的(工作目录)的仓库中了。
    <code>
      git commit
    </code>
  这时根据提示写上提交注释。其格式可以参考git project的代码仓库,其位于github上,可以上去找下。
  这个时候在git status可以看到整洁的代码库。
  如果这次提交的注释写错了,可以使用
    <code>
      git commit --amend
    </code>
  来重新书写上次提交。
  b)当进行了如干次提交后,可以通过命令来查看历次提交的记录,其会显示提交时书写的注释以及作者信息。
    <code>
      git log
    </code>
  从log信息中可以找到每次commit对应的ID信息,以供git reset 以及git checkout 穿越历史使用。
4)branch and tag
  a)分支可以解决很多问题,并且在多人项目合作中也能起到非常重要的作用,而且Git的分支创建较其他版本控制器要高效率。这里不讨论在多人合作项目的使用,仅拿上面的链表练习举例。当我们初次完成单链表的编码工作后,现在要实现带有头节点的单链表。我们可以这样:
    <code>
      git branch head_list
      git checkout head_list
    </code>
  然后进行编码工作,等编码完成后,可以执行git add,git commit命令,将工作提交至仓库。
  若此时又想在之前单链表的基础上实现双向链表,我们可以这样:
    <code>
      git checkout master
    </code>
  这时在进行编码工作,完成后git add,git commit。通过不断的checkout到不同的分支,可以发现工作目录中的代码文件会神奇的切换,而且不会混乱。
  b)tag又称里程碑,通过这个可以标志一次质的变化。
    <code>
      git tag v0.1 -m "链表练习完成"
    <code>
  这样当我们使用:
    <code>
      git tag
    </code>
  就可以看到我们工作成果的记录。

5)push
  在完成了我们的工作后,就可以把代码推送的文件服务器保存了。
    <code>
      git push /media/git/list.git master:master
    </code>
  上面的第二个master可以替换成但前的分支。
  这样我们的代码就保存在文件服务器上了。当我们的当前工作目录被删除时。我们只要这样
    <code>
      git clone /media/git/list.git list
    </code>
  就可以在list目录下得到之前的代码了。
  是不是好像找回丢了的iphone的感觉?呵呵。
6)go through histroy
  版本控制器的神奇之处之一就在于可以穿越历史,可以在瞬间回到1个月以前的工作环境中。
  a) reset主要是用来同步Stage和代码仓库里的存档。
    <code>
      git reset <commit> #用仓库里<commit>指向的所有内容更新Stage,省略<commit>则指HEAD。
      git reset <commit> -- filename #用仓库里<commit>指向的filename更新Stage内内容。省略<commit>则指HEAD。
      git reset --soft HEAD^ #工作区和Stage区内容不变,但是仓库里上次commit消失,而指向前一次。
      git reset HEAD^ #工作区内容不变,而仓库内容取消最近一次commit,而指向前一次,同时用这时的内容更新Stage区。
    git reset --hard HEAD^ #仓库内容取消最近一次commit,而指向前一次,同时用这时的内容更新Stage区和工作目录。
    </code>
  b)checkout 主要用来同步工作区和代码仓库存档。
    <code>
      git checkout . # 用Stage内容更新当前的工作区。
      git checkout -- file #用Stage内的file更新当前工作区内的相应文档
      git checkout <commit> --file #用<commit>内的file更新当前工作区内相应文档
      git checkout <commit> #用<commit>内内容更新当前工作区内内容。
      git checkout branch -- file #用branch内内容更新但前工作区和Stage内相应的文档。
      git checkout branch #用branch内内容更新但前工作区和Stage内容内容。
    </code>
四)I want to say...
  我这里只是使用了版本管理器的一部份作用,而版本控制器的伟大功效在前面的参考书中都有提到。但是通过这一点点的开发,就可以解决课设中出现的上述问题。而在公司里的生产环境肯定是离不开版本控制器的。其实我们在大学里完全就可以像公司里一样,自己给自己构建实际的生产环境,这样在以后出去工作,那就是工作经验。

posted @ 2012-02-17 17:48  G背包  阅读(314)  评论(0编辑  收藏  举报