一)What is Git
我的日常Git使用
原创
©著作权归作者所有:来自51CTO博客作者gota的原创作品,请联系作者获取转载授权,否则将追究法律责任
关于什么是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...
我这里只是使用了版本管理器的一部份作用,而版本控制器的伟大功效在前面的参考书中都有提到。但是通过这一点点的开发,就可以解决课设中出现的上述问题。而在公司里的生产环境肯定是离不开版本控制器的。其实我们在大学里完全就可以像公司里一样,自己给自己构建实际的生产环境,这样在以后出去工作,那就是工作经验。
上一篇:【转】Linux中自动运行程序
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
git的使用
git的学习记录
git 推送 远程库 -
GIt使用教程
Git 基本应用
git 使用教程 fish -
GIT 的日常使用记录
记录日常的 git 操作
git 远程分支 堆栈 -
git日常使用教程
git日常使用参考网站:Git 实用技巧记录日常使用git的流程如下当修改
git 远程仓库 工作区 -
Git 使用详解,日常使用 | 什么是git
Git 使用官方文档: https://git-scm.com/docGit与Github关
git vcs github 版本控制系统 暂存区 -
git创建分支及日常使用
git创建分支
git 远程仓库 提交代码