一、什么是GIThtml
Git是一个强调速度的分布式版本控制软件和源代码管理系统(SCM,source code management)。Git最初是由Linus Torvalds为内核开发而设计的管理软件。自从Git推出以来,已经被不少开源项目所采纳。每个Git工做目录是一个带有彻底历史记录和版本信息的仓库,不依赖于网络和中央服务器。Git是一个免费的开源软件,听从GNU v2协议。jquery
Git这个词在英语中的原意是很笨拙,没用的人。Linus自嘲说:“我是一个任性的笨蛋,因此我把个人全部的项目的名字都和我很类似。第一个是Linux,如今是Git。”Git的帮助文档中描述Git为:笨拙的内容跟踪者(the stupid content tracker)。(翻译自WIKI)git
关于开发Git的一些历史由来,能够看看这个网站:https://lkml.org/lkml/2005/4/6/121github
二、为何要用GITshell
更顺畅的工做流程,开发过程当中,彻底能够离线操做ubuntu
快速,Git分布式架构使得本地仓库包含全部的历史版本信息,你能够在不一样的版本之间快速切换vim
弹性的本地分支,在svn下,你建一个分支须要把源代码复制到另一个文件夹,而在Git下,建立分支的代价是很是小的,只需一条命令安全
仓库目录结构简洁,用Git复制一个项目,只会在项目根目录建立一个.git的目录,而其余目录很干净bash
内容按元数据方式存储,全部的版本信息都位于.git目录下服务器
完整性好,更易于协做开发
用户群大,如今已经有成千上万个开源项目采用Git来作项目管理,github上更是有无数个代码仓库
三、GIT安装与配置
a) 安装
1.从源码安装
在安装以前,你必须保证如下几个依赖包已经安装在你的系统上:curl, zlib, openssl, expat, libiconv。若是你的系统是Ubuntu,你能够这样安装:
apt-get install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
当全部的依赖项已经解决,就能够从http://git-scm.com/download上下载Git的源码,而后编译安装,具体命令以下:
tar -zxf git-1.*.*.*.tar.gz cd git-1.*.* make prefix=/usr/local all sudo make prefix=/usr/local install
2.在Linux上安装
若是你的系统是Linux或者Fedora,你能够经过如下命令直接安装Git:
yum install git-core (fedora) apt-get install git-core (ubuntu)
3.在Windows上安装
尽管Git是发源于Linux,但如今Windows上也有可以正常使用Git,只不过不支持中文,在Windows下全部的中文都显示问号,另外还有一些功能上的BUG。因此建议仍是在Linux上去使用Git,若是你不得不工做在Windows上,你能够到http://msysgit.github.com/上下载msysgit的最新版,安装过程和其余Windows程序差很少,基本上点下一步就OK了。Msysgit默认会安装git bash和git GUI这两个程序,通常用git bash就能够了,它支持经常使用的命令。若是对Linux命令行不熟,你也能够用用git GUI,但功能有限制。
b) 第一次使用GIT
在你安装好Git以后,你须要修改一些配置,才能正常使用Git。
Git经过“git config”命令来配置Git,这个命令有2个选项:--system, --global, 加上默认选项,分别对应Git上3级配置文件。第一个是/etc/gitconfig文件,和--system对应,这是全局配置文件,修改这个文件,将会影响系统上全部的用户,全部的仓库。第二个是你家目录下的/.gitconfig文件,与--global对应,修改它会对你当前用户的全部仓库产生影响。第三个是你仓库中的.git/.gitconfig文件,这是“git config”默认修改的配置文件,它只会对你当前仓库产生影响。
在第一次使用Git时,你须要告诉你的协同开发者,你是谁以及你的邮箱,在你提交的时候,Git须要这两个信息。具体经过如下命令设置:
git config --global user.name “Test OSS” git config --global user.email oss.lzu.edu.cn@gmail.com
固然你也能够不用--global选项,但这意味这你在每个仓库中都要这样设置。
同时,你也能够指定你的编辑器,你的Diff工具:
git config --global core.editor vim git config --global merge.tool vimdiff
你还能够经过”git config --list”命令来查看你的设置。
当你把Git设置好以后,若是你要和从Git服务器上得到仓库,或者向Git服务器提交你的代码(好比github),你可能须要生成你本身的ssh密钥对。Git支持4种与服务器端通讯的协议:git、http、ssh和https。其中git只是一个只读协议,也就是说你只能够从服务器端获取仓库,可是你不能提交你本身的代码。而http和https用的不多,大部分都只支持ssh协议和Git协议。
当你经过ssh协议与远端服务器进行通讯的时候,你能够经过如下命令生成ssh密钥对:
ssh-keygen -t rsa
若是你没有指定密钥名称和存放路径的话,它默认把两个不对称密钥放在你的家目录下的.ssh目录下,密钥文件默认名称为id_rsa和id_rsa.pub,前者是私钥,后者是公钥。中间可能会要你设定访问密钥密码,这个能够设,能够不设,但为了安全考虑,仍是建议你设一个访问密码。不然,意味着任何持有你密钥的人均可以使用该密钥。
而后把你的公钥发给Git仓库管理员,而后你就能够经过ssh协议来访问服务器端,期间程序会自动进行密钥对匹配,若是你设了访问密码,你可能须要输入密码。
更多关于ssh的内容,请访问这里:http://www.freebsd.org/doc/zh_CN/books/handbook/openssh.html
这些设定完以后,你能够经过得到任何一个公开的代码仓库来检测你的git是否工做正常。好比下面这个:
git clone git://git2.kernel.org/pub/scm/git/git.git
四、GIT仓库
Git作为一个资源管理和跟踪系统,若是想要把本身的文件托管在Git上,那么首先你得让Git知道你须要管理的文件在哪。好比说如今我有一个项目,它在test文件夹里,我想让Git管理这个项目,这个时候你需进入到这个目录,而后运行“git init”命令。这个时候Git就会在该目录下生成一个.git的隐藏目录,Git用来进行版本控制和内容跟踪的全部文件都在该文件夹下。
处于git跟踪下的文件只具备三种状态:
Modified(working directory):被修改过的文件
Staged(staging area):经过git add添加到暂存区域的文件
Committed(git directory):经过git commit提交到仓库的文件
因此,通常的git工做流程多是这样:修改过某些文件,而后把这些文件添加都暂缓区,再提交到仓库中造成一个版本或快照,最后提交到git服务器上。而在中间,可能伴随着分支管理,分支切换,撤消与合并。
可能有些人会以为很奇怪,为何git会有暂存区域这个概念,直接提交到仓库中不就ok了。其实这是git为了作版本控制用的,试想若是没有暂存区域,每修改一个文件,就会造成一个版本,太过频繁,不易于管理。暂存区域其实就是下一个版本的文件清单,你能够自由控制该往仓库中提交什么文件,这也能够避免在一个版本中包含一些中间文件,好比编译后的文件。
五、GIT基本流程
1.初始化仓库
初始化仓库有两种状况,一种是直接在一个空目录里创建一个项目,这时候你能够这样干:
git init
另外一种是从其余机器复制一个仓库,好比这样:
git clone git://git2.kernel.org/pub/scm/git/git.git (远程仓库) git clone https://github.com/jquery/jquery.git (远程仓库) git clone git@github.com:wengpingbo/MicroBlog.git (远程仓库) git clone /home/oss/test.git (本地仓库)
第一次从服务器上复制一个仓库,可能比较慢,由于git要把全部的历史记录和版本所有复制下来,这也算git的一个弊端吧!
复制完后,就会在当前目录下生成一个工做目录,名字以仓库名字命名。若是你不想指定目录,那就在上面的命令后加一个目录就ok了。好比我想把test仓库放到oss仓库中:git clone /home/oss/test.git oss
以后,你就能够开始你的工做啦!
2.添加文件
在编辑了几个文档以后,你可能忽然想起来,好像文件尚未让git跟踪。Git并不会实时的跟踪你的文件,只在你明确让它记录你的文件时,它才会把指定的文件的当前状态记录到仓库中去,而后又撒手无论了。我想这就是说git笨的缘由吧。这个时候,你须要手动添加你的文件当暂存区域:
git add filename1 filename2
若是你懒得一个一个加,你能够试试这个:
git add -A
它会把当前目录下全部的文件都添加到暂存区域。
3.添加一个版本
在添加完文件后,你可能以为应该建立一个commit了。
git commit
怎么样?是否是有点不对劲,好像这个命令并无按你想象的那样跳出一个提交成功的提示,而是直接跑到了你在配置中指定的编辑器中了。仔细看一下,原来是让你给这个版本作一些备注,随便写点什么,而后保存退出就ok了。若是你不想这么麻烦,能够这么干:
git commit -m ‘initial version’
可能你以为以前讲的太罗嗦了,提交一个commit还这么麻烦,其实有一个捷径可使你跳过添加文件这个过程:
git commit -a -m ‘initial version’
大功告成,这个命令会把以前全部的已经添加的文件都加入到这个版本中。
可能你又有疑问了,以前添加的文件不是自动会加入到下一个版本中吗,问什么还加这个-a参数?
其实git add命令只是把指定文件的当前状态添加到暂存区域,并不表明一个文件一旦添加,就会一直存在每一个版本中。若是你添加一个文件后对这个又进行了修改,在你commit时候,只会commit这个文件添加时的状态,不会把以后的修改也commit进去,除非你再次添加。
4.推送变动
在你commit完以后,你可能想把本身的代码提交到github或者其余git服务器上,与他人交流共享,这时候就须要和远程服务器打交道了。
若是你是在本地创建起的仓库,默认状况下是没有任何服务器地址的,若是你是从其余服务器复制过来的仓库,这个服务器地址会自动添加到你的仓库中,你能够这样查看:
git remote -v
若是只输入”git remote”,就只会列出服务器端的别名,不会列出地址来。
一个仓库能够有多个服务器地址,这就意味着,你能够从不一样的人手中复制同一个仓库,但这并不会打乱你本身的分支,哪怕双方的分支名字都同样。假如你如今在和另外两我的作同一个项目中的同一个分支,你发现A的一个模块正是你想要的,你想把他的代码合并到你如今的版本中,这时候你能够这样作:
git remote add code_a git://url/test.git //添加对方的地址,code_a是别名 git fetch code_a //复制对方的仓库到本地,但不合并,git pull会自动合并 git merge code_a/master //把对方master分支合并到本身当前版本下
合并完以后,你可能想提交你的代码到其余的服务器上,这时候你能够先把要提交的服务器地址添加进来,而后这样作:
git push origin master
上面的命令就是把本身master的分支提交到名字为origin的服务器上
5.建立并管理分支
在作项目的时候,你可能会想写一些扩展性的功能,或者作一些小实验,可是你又不想影响你如今的项目。这时候,你能够建立一个分支,而后在这个分支里 写东西,当以为很差的时候,你能够把这个分支删除掉,对你以前的主分支没有任何影响。或者你以为这个新特性超出了本身的预想,能够合并到主分支里,这时候 你只要把工做转回主分支,而后合并分支,最后删除分支,而后就跟那个分支没建立同样。具体操做以下:
git branch test //建立一个test分支 git checkout test //转到test分支 edit something...commit something... git checkout master //转到master分支 git merge test //合并test分支 git checkout -b test2 //建立test2分支,并转到test2分支 git branch -d test //删除test分支 git branch //列出分支列表 git branch -v //列出分支列表和当前commit
Git merge的实质是把两个版本合在一块儿,而后在当前分支建立一个新的commit,若是你在两个分支的同一个文件的同一个地方都作了修改,这时候merge就会失败,git就不会自动建立一个新的commit,而是直接停住。你须要手动修改这些冲突的文件,选择这两个分支中的一个版本,或者本身重写这个部分,而后手动添加这些文件到暂存区域,再commit一下就ok了。要查看哪些文件冲突了,能够用”git status”查看。
6.撤消改动
是人就会犯错。当你执行某个命令以后,忽然发现,本身写错了,或者漏了一个文件,这时候怎么办?
若是你提交得太早,忘了添加某些文件,你能够这样作:
git commit -m ‘add something ’ git add file1 git commit --amend
最后一个命令会把你当前暂存区域最为上一次的commit。若是你commit之后,立刻amend,这时候git会直接跳到编辑commit备注里面,这样你能够修改你上次commit的备注。
若是你添加了不应添加的文件,你能够这样挽回:
git add . //把全部的文件都添加进去 git reset HEAD readme //把readme文件从暂存区域去除
若是你发现你编辑错了一个文件,你想把它恢复到上一个版本的状态,这时候你能够这样:
git checkout -- filename1 // 只撤消这一个文件
若是你以为这个版本糟糕透了,想彻底回滚到上一个版本,你能够干以下事情:
git reset --hard HEAD^
HEAD是指向当前版本,^指当前版本的父版本,这个操做没法撤消。你能够把--hard换成--soft,这只会回退commit信息。还有一个--mixed默认选项,你们能够参考官方文档,查看这3个选项的具体区别。
六、GIT经常使用命令
Git add Git clone Git commit Git push Git checkout Git reset Git pull Git status Git branch //advanced Git tag Git log Git merge
七、学习GIT相关资料
《pro git》 :http://git-scm.com/book/zh 《git magic》 :http://www.csc.kth.se/utbildning/kth/kurser/DD2385/material/gitmagic.pdf Git manual :http://git-scm.com/docs