【Git】Git学习手册
一直忙于各种琐碎的项目开题报告,编码做PPT等琐碎的工作,博客都好久没更新,罪过罪过!
个人用github有一段时间了,当时学习的时候参照官方的教程,勉强能用,但是有些原理性的东西总是没搞懂,所以很困惑,而网上关于git和github学习的中文文档和学习资料都不是很多,所以打算写一些自己使用github和git的一些心得,让初学者少走弯路。
----------------------------------------------
基本概念:
版本库(Repository)是版本控制系统用来存放所有历史数据的地方,主要存放各个文件的当前状态,历史修改时间,谁做的修改,以及修改的原因。举个简单的例子,就好比银行的保险箱,每次往里存钱,都会记录谁,什么时间,存放多少钱,存入的原因等。对应的版本库(Repository)主要存放代码(文档,数据,图标等),并且每一次更新都要记录谁,什么时间,提交了什么更新,以及更新的原因是什么。
git就是管理我们这个版本库的管家,相当于银行保险箱的管理人员。以前的版本控制入CVS,SVN等都是集中控制管理的,也就是有一个中央服务器,大家都把代码提交到中心节点(入下图),而git是分布式的版本控制工具,也就是说没有中央服务器,每个节点的地位平等,有点P2P的味道,众生平等,谁也别瞧不起谁 ! ^_^
-------------------------------------------------
Git的安装与配置
ubuntu环境:
sudo apt-get build-dep git-core git-doc
make prefix=/usr/local all doc
sudo make install install-doc
检查安装是否成功:git --version
Windows环境:
github网站上又git的原生态安装应用,可以直接“下一步下一步”安装。下载链接:http://windows.github.com/
安装完成后,桌面上会有Github和Github Shell的快捷方式出现。
配置
首先请注册github网站,记住用户名和密码;
然后Ubuntu下请打开Terminal,Windows下请双击Git Shell;
配置用户名和密码:
git config --global user.name "Your name"
git config --global user.email "Your Email used to register"
检查配置是否成功:git config --global --list 查看设置的用户名和Email。
如果上面和下面要讲的任何命令有疑问,使用命令git help
---------------------------------------------
添加与提交:Git基础
好了配置好了,现在让我用git来管理我们的代码吧,日常是如何使用git呢,主要包括添加于提交,理解和使用分支,查询git历史记录,与远程版本库写作,管理本地版本库等,在进入具体的内容之前,强烈建议花几分钟时间阅读图解git这篇文章,用图像的方式解释了git的工作原理,非常容易记住,再次强烈建议。
创建版本库: mkdir test_git //新建目录test_git
cd test_git //进入目录
git init //初始化git,现在git会管理这个目录中的所有内容了
增加文件: touch helloworld.txt //创建文件,在windows下直接到目录新建文件即可
git add helloworld.txt //告诉git我要添加一个文件,但是git并没有把你所添加的文件放入版本库中,而是对内容进行hash后生成了一个编号
//相当于添加内容的身份证号,将该身份证号添加到版本库index,即告诉git我有一个文件编号XXX的内容将要提交,
//但是并没有真正提交到版本库(如下图),要想将文件真正放入版本库需要commit
git commit -m "add helloworld.txt" //-m参数是提交留言,说明为什么要提交的更新做了什么事情,方便别人查看。
对下图的说明:working directory是当前的工作目录,而stage是暂存区也称索引区存放工作目录中那些你打算提交到版本库的变更,git add只是将文件的索引提交的版本库,而真正的内容并没有进入版本库,History就是版本库,需要注意的是这是本地的版本库,存在于本地的电脑中,相当于你电脑上一个你的私人钱财管理员。
两个常用操作经常一块使用
git add some-file
git commit -m "some changes to some-file"
查看当前代码状态:git status
会显示
changes to be commited 表示将要提交但是尚未提交的修改(已经add但是尚未commit),也就是在stage区域已经有了,但是还没有commit的内容
changed but not updated 表示已经修改但是还没有添加到暂存区的内容(尚未add,当然尚未commit)
查看文件改动 git diff
git diff 比较working directory和stage的差别
git diff --cached 比较stage和history的差别
git diff HEAD 直接比较working directory 和history的区别
文件重命名: git mv
git mv helloworld.txt helloworld2.txt //将helloworld.txt重命名为helloworld2.txt
------------------------------------------------------
理解和使用分支
git可以使用多条分支,这样就可以再不影响当前进度的情况下,用创建新的分支的方法来进行接下里的开发,何时使用分支是一门艺术,一般来说:
1. 试验性修改(常用):测试新的算法或者为某个特别的模式重构部分代码
2. 增加新功能(常用):为每个新功能的开发创建新的分支,完成该功能开发后,在将其合并到主分支上
3. Bug修改:修复代码中的bug,可以创建新分支来对该bug进行修改,然后将修改合并到主分支上
创建新分支:git branch test //创建名为test的分支
切换分支:git checkout test //切换到test分支工作, 与上面的命令经常一起使用
查看分支:git branch //查看前版本库(本地)的所有分支
合并分支:git checkout master //切换到“要合并到”的分支,常见的就是test分支合并到master分支,所以先切换到master分支
git merge test //合并test分支到master分支
注意: 在合并分支的时候有时候会出现冲突(conflict)的情况,创建的情况是master分支和test分支对同一文件的同一处代码的内容不一样(例如:master分支在hello.cpp中第三行写入的是"hello", 而test分支在hello.cpp的第三行中写入的是“world”),这样使得git不知道如何是好,这时候就需要你手工修改代码了,我难道要记住master和test在同一位置的内容?当然不用了,git会在git merge的反馈信息中说明,代码在何部分存在冲突。
删除分支: git branch -d test //删除test分支
分支重命名:git branch -m test test2 //将test分支重命名为test2,这个命令不常用
--------------------------------------------------------------------------------------
查询git历史记录
查询所有的commit历史:git log
查询指定范围的commit历史: git log --since = "5 hours" //查看最近5小时的commit历史记录
git log --before = "5 hours" -2 //查看5小时之前最后2次的提交commit记录
git log 18f822e..0bb3dfb //查看从18f822e(不包括18f822e)到0bb3dfb之间的提交记录
git log 18f822e..HEAD //HEAD表示当前所在分支的最新版本,即HEAD指向当前所在分支的最后一次commit
git log HEAD^^^ //^表示父节点,HEAD^就表示HEAD的父节点,以此类推
git log HEAD~3 //~N 表示回溯N个节点,所以与上一个表述等价
查看版本之间的差异: git diff //查看working dir和stage(index)之间差异
git diff --cached //查看stage(index)和History(当前分支版本库)之间的差异
git diff HEAD //查看working dir 和 History之间的差异
问责文件内容: git blame hello.cpp //查看所用向hello.cpp提交内容的人,方便问责到人,谁,什么时候,提交代号,提交内容,留言等都会显示
增补提交: git commic -C HEAD -a --amend //用head上次提交的留言(-C表示comments),将这次的提交追加到上一次提交上,不会创建新的提交代号
-----------------------------------------------------------------------------------
与远程版本库协作
github就是提交远程版本库服务的网站,所以我们这里的远程版本库为方便起见用github代替,上面我们得操作都是和本地的git交互,相当于是和本地的git小助手交互,如何将这些在本地的代码和github上的版本库连接起来:将本地的代码推送到github上,将github上的代码检出(checkout)到本地?
git支持三种协议:SSH协议格式: [email protected]/registername/helloworld.git //常用于将本地版本库推送到github上的版本库
git协议格式: git://github.com/registername/helloworld.git //常用于从github版本库拖入本地版本库
HTTP/HTTPS协议格式: http://github.com/registername/helloworld.git
克隆github上的Spoon-Knife版本库到本地: git clone git://github.com/octocat/Spoon-Knife.git
版本库同步: git fetch //取来(fetch)远程版本库到本地,但是并不与本地分支合并
git pull //拖入(pull)远程版本库,与本地分支合并,相当于 git fetch + git merge
推送本地代码到远程版本库: git remote add origin https://github.com/registername/reponame.git //为远程版本库reponame取别名origin
git push origin master // 将本地master分支推入github上的origin
--------------------------------------------------------------
其他:
还有一些不是很常用的操作简单的列在下面,如果用到这些命令,可以参看git doc或者本文参考文献中所列的内容,不一一赘述。
翻转提交: git revert
复位: git reset
分支变基: git rebase
标签: git tag
git子模块: git submodule
导出版本库: git archive
二分查找: git bisect
-------------------------------------------------------------------------------------------
参考文献:
[1]Travis Swicegood(董越,付昭伟译). 版本控制之道——使用git. 电子工业出版社. 2010.
[2]图解git: http://marklodato.github.io/visual-git-guide/index-zh-cn.html
[3]github官方tutorial:https://help.github.com/
» 下一篇: 【算法27】硬币面值组合问题