您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
   
 
 
     
   
 订阅
  捐助
GIT使用教程与基本原理
 
作者:天米 来源:CSDN 发布于 2015-1-26
  3894  次浏览      16
 

1、什么是GIT

Git是一个强调速度的分布式版本控制软件和源代码管理系统(SCM,source code management)。Git最初是由Linus Torvalds为内核开发而设计的管理软件。自从Git推出以来,已经被很多开源项目所采纳。每一个Git工作目录是一个带有完全历史记录和版本信息的仓库,不依赖于网络和中央服务器。Git是一个免费的开源软件,遵从GNU v2协议。

Git这个词在英语中的原意是很笨拙,没用的人。Linus自嘲说:“我是一个任性的笨蛋,所以我把我的所有的项目的名字都和我很相似。第一个是Linux,现在是Git。”Git的帮助文档中描述Git为:笨拙的内容跟踪者(the stupid content tracker)。(翻译自WIKI)

关于开发Git的一些历史由来,可以看看这个网站:https://lkml.org/lkml/2005/4/6/121

2、为什么要用GIT

1.更顺畅的工作流程,开发过程中,完全可以离线操作

2.快速,Git分布式架构使得本地仓库包含所有的历史版本信息,你可以在不同的版本之间快速切换

3.弹性的本地分支,在svn下,你建一个分支需要把源代码复制到另外一个文件夹,而在Git下,创建分支的代价是非常小的,只需一条命令

4.仓库目录结构简洁,用Git复制一个项目,只会在项目根目录创建一个.git的目录,而其他目录很干净

5.内容按元数据方式存储,所有的版本信息都位于.git目录下

6.完整性好,更易于协作开发

7.用户群大,现在已经有成千上万个开源项目采用Git来做项目管理,github上更是有无数个代码仓库

3、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

4、GIT仓库

Git做为一个资源管理和跟踪系统,如果想要把自己的文件托管在Git上,那么首先你得让Git知道你需要管理的文件在哪。比如说现在我有一个项目,它在test文件夹里,我想让Git管理这个项目,这个时候你需进入到这个目录,然后运行“git init”命令。这个时候Git就会在该目录下生成一个.git的隐藏目录,Git用来进行版本控制和内容跟踪的所有文件都在该文件夹下。

处于git跟踪下的文件只具有三种状态:

1.Modified(working directory):被修改过的文件

2.Staged(staging area):通过git add添加到暂存区域的文件

3.Committed(git directory):通过git commit提交到仓库的文件

所以,一般的git工作流程可能是这样:修改过某些文件,然后把这些文件添加都暂缓区,再提交到仓库中形成一个版本或快照,最后提交到git服务器上。而在中间,可能伴随着分支管理,分支切换,撤消与合并。

可能有些人会觉得很奇怪,为什么git会有暂存区域这个概念,直接提交到仓库中不就ok了。其实这是git为了做版本控制用的,试想如果没有暂存区域,每修改一个文件,就会形成一个版本,太过频繁,不易于管理。暂存区域其实就是下一个版本的文件清单,你可以自由控制该往仓库中提交什么文件,这也可以避免在一个版本中包含一些中间文件,比如编译后的文件。

5、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个选项的具体区别。

6、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

   
3894 次浏览       16
相关文章

基于EA的数据库建模
数据流建模(EA指南)
“数据湖”:概念、特征、架构与案例
在线商城数据库系统设计 思路+效果
 
相关文档

Greenplum数据库基础培训
MySQL5.1性能优化方案
某电商数据中台架构实践
MySQL高扩展架构设计
相关课程

数据治理、数据架构及数据标准
MongoDB实战课程
并发、大容量、高性能数据库设计与优化
PostgreSQL数据库实战培训
最新课程计划
信息架构建模(基于UML+EA)3-21[北京]
软件架构设计师 3-21[北京]
图数据库与知识图谱 3-25[北京]
业务架构设计 4-11[北京]
SysML和EA系统设计与建模 4-22[北京]
DoDAF规范、模型与实例 5-23[北京]

MySQL索引背后的数据结构
MySQL性能调优与架构设计
SQL Server数据库备份与恢复
让数据库飞起来 10大DB2优化
oracle的临时表空间写满磁盘
数据库的跨平台设计
更多...   


并发、大容量、高性能数据库
高级数据库架构设计师
Hadoop原理与实践
Oracle 数据仓库
数据仓库和数据挖掘
Oracle数据库开发与管理


GE 区块链技术与实现培训
航天科工某子公司 Nodejs高级应用开发
中盛益华 卓越管理者必须具备的五项能力
某信息技术公司 Python培训
某博彩IT系统厂商 易用性测试与评估
中国邮储银行 测试成熟度模型集成(TMMI)
中物院 产品经理与产品管理
更多...