赞
踩
前言
由于最近公司开始停止使用SVN,开始转向GIT了,利用周末的时间学习实践了下,分享给大家~
什么是Git?
Git的官网是:http://git-scm.com/ ,我们可以在上面了解到GIT的一些介绍: Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一个开源的,免费的,分布式的版本管理系统。 我们知道CVS,SVN,也是常用的版本管理系统,他们之间最大的区别在于“分布式”。 另外,我们还需要注意GIT的一个特性:everything is local 要知道CSV,SVN,我们本地安装的是客户端,必须通过网络连接到服务器,才能取得代码,如果断网,那就OVER了。但是GIT则不同,它所有的东西都在本地存放,也就是说在断网的情况下,可以离线运行。 说到GIT,那么自然要知道一个网站:https://github.com/ 这是一个著名的程序员社交网站,我们可以在GITHUB上发布自己的项目或者参与到别人的项目中。 GIT是大名鼎鼎的LINUX之父在2005年发布,经过多年的沉淀,在开源社区使用率非常广泛,可以说花一点时间学习GIT,将会给我们带来巨大的帮助,那么下面我们就开始吧! |
来,安装Git!
目前GIT的最新版本是2.6.3,GIT虽然有GUI,但是通过命令行的方式才是掌握GIT的最佳方式,因此我将使用LINUX GIT来进行实践。 为了避免安装GIT的过程中,涉及到诸多依赖,我已经在LINUX做好YUM源,并安装了一些常用工具包,如下所示。
大家可以到https://www.kernel.org/pub/software/scm/git/ 下载 git-2.6.3.tar.gz
安装完毕后,我们可以看到:
|
要使用,就要先配置Git
配置GIT,很简单!
之所以要配置USERNAME/EMAIL就是说对代码的改动进行唯一PERSON标示 为了让GIT有些色彩,我们对颜色进行了配置。 列出配置:
说白了,我们利用git config命令进行的配置操作,实际上是对文件的改动,那么在哪里呢?
配置文件就在YOUR HOME目录下,在上面,我们看到了典型的LINUX分段式配置文件。 因此,我们可以直接修改.gitconfig就可以完成配置。 |
创建Git Repo
Repo即repository的简写,就是仓库,代码库的意思,有点MAVEN的感觉,呵呵。 先看下面的例子:
我们经常使用的SVN,会在本地目录下生成.svn,GIT也类似。 通过git init命令,我们可以创建一个empty repository! 事实上,对于一般的开发人员而言,我们并不需要create empty repo,我们开始需要做的其实是克隆一个repo。 比如,最近阿里巴巴提交给apache的JSTORM项目,我们来看看如何CLONE它。 首先,我们通过https://github.com/alibaba/jstorm COPY HTTPS
下载完成后,会出现jstorm目录,以及在目录中存在.git隐藏目录。 通过git clone命令,我们可以克隆一个repo到本地。 |
添加以及提交
首先注意到.git目录,说明已经进行了init。 通过git status命令,我们可以查看repo的状态信息。 注意到Untracked files列表,是在说明HelloWorld.java没有注册到Git,因此我们需要给HelloWorld.java“上户口”。
通过git add命令,实际上是将file推送到Staged Area。 上面再次查看状态,提示需要提交,HelloWorld.java is new file。 下面我们来提交:
注意了,同SVN一样,GIT每次提交也会有MESSAGE信息,直接通过-m选项进行指定。 通过git commit -m命令来进行提交到HISTORY区域。 那么提交后的状态,又是什么呢?
提交后,就干净了,你懂的! 那么通过上面的一些实践,其实我们可以得到一些初步的认识: 如果有FILE并没有ADD到REPO的话,GIT会提示我们Untracked files 如果git add FILE但没有COMMIT的话,GIT会提示我们new files 如果COMMIT后,GIT会提示我们nothing to commit, working directory clean |
初步认识Git的核心原理图
在上面的例子中,已经提及到working directory,staged area以及history。 其实这三个区域就是GIT的核心,理解他们之间的关系,是掌握GIT的基础。 我们工作在working dir区域,对文件进行改动、添加、删除的操作,而这些改动首先应该先到达Staged area区域,然后通过提交在History区域形成最新version。 既然有3个区域,那么自然,对于一个文件,应该有2部分的状态信息: 第一,对于working dir和staged area而言,有什么区别? 第二,对于staged area和history而言,有什么区别? 事实上,对于git status -s会看到2列状态标志位来表达这2部分状态信息。【后文会有介绍】 对于History有一个HEAD的概念: 说起head,自然会想到头部指针,确实是有这么个意思。 关于HEAD,也会在命令中予以体现! |
Git状态标志位剖析
注意git status -s会简明扼要的列出状态信息,就列出2个标志位! 仔细观察上面的信息,love.txt的A,和HelloWorld.java的M并没有对齐,这是为什么呢? 实际上,一个文件的git status有2列,第一列代表staging区域信息;第二列代表woring dir信息。也即是说,HelloWorld.java在working dir中修改了,但没有提交到staging area 。love.txt在staging中添加了,但是在work dir中,没有改变。 继续,看下面的操作,来看status的变化:
|
如何查看文件差别?
其实当我们利用git status发现文件有差异时,很显然,我们需要查看文件的差别在哪里! 看差异,看什么和什么的差异呢? 是working dirPK staged area ? 是staged area PK history ? 还是working dir PK history ? git都可以满足你! working dir PK staged area:
staged area PK history:
working dir PK history:
git diff/git diff --staged/git diff HEAD 查看文件差异。 git diff列出的信息也是蛮多的,当然可以像git status -s那样有简化版本: git diff --stat
|
Git有后悔药可以吃!
有一句老话叫 人非圣贤,孰能无过。 那么在GIT中,如何撤销错误呢? 既然是撤销错误,那么是从哪里撤销到哪里呢? 在实际开发中,我们经常遇到的是这样的情况,我们对working dir的FILE进行了修改,然后ADD到了staged area区域,突然发现有问题,想撤销这些改动。 SO EASY,我们只需要将history的内容还原即可。
可以发现通过git reset命令将staging area还原至history版本,需要注意是的不影响WORK DIR的改动。其实,就是一个标志位的还原操作而已。 那如果我们想把已经修改的WORK DIR的文件也恢复到原来的状态,怎么办呢? 同上,我们只需要将STAGING AREA的文件覆盖WORK DIR即可,利用git checkout命令。
注意,git提供了一个简化命令git checkout HEAD,它等价于下面的操作: git checkout HEAD = git reset + git checkout
|
移除及重命名文件
看得出,利用git rm进行删除后,需要COMMIT!
默认情况下,git rm会把working dir以及staged area的文件进行删除。 如果我们仅仅想从STAGING AREA中移除FILE,但是保留WORK DIR中的文件的话,可以这样操作:
git rm --cached的方式: 从最后的状态可以看到,delete.log仍然在WORK DIR中,但是并没有ADD到STAGING AREA区域,同时STAGING AREA区域的delete.log被删除。 重命名操作:
通过git mv即可重命名,需要COMMIT! |
保留现场:暂存工作区
什么叫暂存工作区呢? 比如在实际开发中,我们经常遇到这样的场景: 我们在WORK DIR中进行修改,有时我们还add了一部分到staging area,此时突然发现代码存在BUG,需要修改。当然,我们可以利用git reset+git checkout的方式迅速得到clean code,然后开始修改,但是这样我们就丢失了在work dir中的所有改动。 git为我们提供了git stash命令,帮助我们保存现有的工作区,于此同时work dir /staging area的代码恢复到HISTORY水平。一旦我们改动完毕,COMMIT到HISTORY后,利用git stash pop进行还原原来的工作区!
|
总结
本文转自zfz_linux_boy 51CTO博客,原文链接:http://blog.51cto.com/zhangfengzhe/1720049,如需转载请自行联系原作者
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。