Git版本控制工具

讲师:BRUCELIU


 

1.GIT简介

1.1 Git是什么

Git是目前世界上最先进的分布式版本控制系统(没有之一)

Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。项目的集成开发!

Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Linux服务器操作系统!       

Git 与常用的版本控制工具 CVS, Subversion(SVN) 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

1.2历史背景

Git版本控制工具_git

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢? 

事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图了解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。                                                             

Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!   一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。

 

1.3 GIT版本管理系统能干什么

Git版本控制工具_git_02

1、版本管理的服务器一旦崩溃,硬盘损坏,代码如何恢复?

2、系统正在上线运行,但是需要回复到前几天的某一个版本,如何处理?

3、如何管理一个分布在几个公司 或者世界各地、互不相识的大型开发团队?

2.GIT架构简图

Git版本控制工具_github_03

n  容灾能力强

n  本地的版本管理

n  异地协作开发

n  灵活分支


远程库:

n  GitHub网站  ​​http://​

Git版本控制工具_版本控制系统_04

n  码云 ​https://gitee.com/

 

 

3.GIT安装

3.1 Linux版安装

 

直接使用命令进行安装

 

n  安装依赖库

yum install libcurl4-gnutls-dev libexpat1-dev gettext \

libz-dev libssl-dev

 

n  安装Git核心库

yum install git-core

 

n  查看git版本

git --version

 

3.2 Windows安装

下载,官网点击下载 ​​http://msysgit.github.io/​

在 Windows 平台上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行:

安装图解:

第一步:双击exe文件,阅读须知

 

Git版本控制工具_版本控制系统_05

第二步:选择安装路径

 

Git版本控制工具_版本控制系统_06

第三步:选择要安装的模块

 

Git版本控制工具_git_07

第四步:选择名称

 

Git版本控制工具_版本控制系统_08

第五步:选择路径环境

第一项:直接安装,不会配置git命令的环境变量。

第二项:会自动配置好git命令的环境变量。

第三项:git命令和unix工具命令都会添加到环境变量。

Git版本控制工具_git_09

选择Git命令的执行环境,这里推荐选择第一个,就是单独用户Git自己的命令行窗口。

不推荐和windows的命令行窗口混用。

 

第六步:选择迁出风格

Git版本控制工具_github_10

在“Configuring the line ending conversions”选项中,

第一个选项:如果是跨平台项目,在windows系统安装,选择

第二个选项:如果是跨平台项目,在Unix系统安装,选择;

第三个选项:非跨平台项目,选择。

 

第七步:选择命令风格

Git版本控制工具_github_11

在“terminal emulator”选项中,

第一个选项:使用专用的Git窗口(推荐)

第二个选项:使用windows的cmd命令行窗口。

 

第八步:是否启用缓存

Git版本控制工具_git_12

在“Configuring extra”选项中,

默认开启文件缓存即可(推荐)

 

第九步:安装

Git版本控制工具_版本控制系统_13

安装完成后会显示:

第十步:装完成后,在任意的文件目录下,右键都可以开打Git的命令行窗口。

 

Git版本控制工具_git_14

 

 

第十一步:验证Git是否安装成功

Git版本控制工具_github_15

输入 git version

第十二步:安装完成后,还需要最后一步设置,在命令行输入如下

git config --global账号名"

git config --global user.email "注册邮箱或手机"  

Git版本控制工具_版本控制系统_16

邮箱尽量不要用163网易邮箱 

Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识

C:\Users\admin路径下的.gitconfig文件里面可以看到

--global 表示全局属性,所有的git项目都会共用属性

如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。

如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。


Git版本控制工具_版本控制系统_17

 n  查看配置文件

git config --list

Git版本控制工具_github_18

3.4 工作流程

Git版本控制工具_git_19

n  克隆 Git 资源作为工作目录。

n  在克隆的资源上添加或修改文件。

n  如果其他人修改了,你可以更新资源。

n  在提交前查看修改。

n  提交修改。

n  在修改完成后,如果发现错误,可以撤回提交并再次修改并提交

 

4.基本命令操作

4.1 创建仓库

 

Git 使用 git init 命令来初始化一个 Git 本地仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以git init  是使用 Git 的第一个命令。

在执行完成 git init 命令后,Git 仓库会生成一个 .git 隐藏目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。

在指定目录使用git init命令,即可实现仓库的创建

 

n  初始化仓库

git init

 

Git版本控制工具_版本控制系统_20

n  查看状态

git status

查看状态

git status -s

查看详细过程

git diff

Git版本控制工具_git_21

4.2 提交文件

 

n  文件新增到仓库

git add SingerServlet.java

 

Git版本控制工具_版本控制系统_22

提交

git commit -m '提交的注释信息'

 

Git版本控制工具_版本控制系统_23

n  新增一个文件夹仓库中

 

Git版本控制工具_版本控制系统_24

4.3 查看文件提交历史记录

 

n  查看日志版本

git log

Git版本控制工具_git_25

git log --pretty=oneline    如果有多个版本日志 在一行上显示

 

Git版本控制工具_git_26

4.4 回退历史


n  回退到指定的版本

git reset --hard HEAD 版本

(HEAD始终指向当前的最新版本  ^表示上一个版本)

例如:回退到上一个版本 git reset --hard HEAD^

 

Git版本控制工具_github_27

 

例如:往前退2个版本 git reset --hard HEAD~2

Git版本控制工具_版本控制系统_28

 

4.5 版本穿越

 

n  查询之前操作的所有版本操作记录

git reflog --pretty=oneline

Git版本控制工具_github_29

n  直接回退到一个指定的版本

git reset --hard 版本号

Git版本控制工具_github_30

4.6 还原文件

使用服务器上最新的版本,替换本地的版本。例如修改了某个文件,但是还没提交场景

git checkout -- test1.java

 

Git版本控制工具_版本控制系统_31

4.7 删除文件

步骤:把文件或者文件夹先从硬盘上删除,然后执行 git add 文件/文件夹(相当于提交了删除操作),最后再执行 gti commit 提交删除操作

 

 

5.GIT工作原理

工作区(代码工作空间):就是你在电脑里能看到的目录。

暂存区(缓冲区):英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

版本库(本地版本库):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库

 

Git版本控制工具_版本控制系统_32

 

Git版本控制工具_github_33

图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。

图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。

当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

 

6.分支管理

系统上线了,但是产品经理又提了新的需求,评估一下工期要两个月,但是同时系统正在上线运行,时不时还要修改bug,如何管理几个版本?

版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

有人把 Git 的分支模型称为"必杀技特性",而正是因为它,将 Git 从版本控制系统家族里区分出来。

 

从分支上分出一个分支,进行开发,经过一个周期开发好了之后,再合并到主分支上,而不是直接去开发主分支!不影响主分支!

  

Git版本控制工具_github_34

 

4.1 查看当前分支

n  git branch

列出分支,没有参数时,git branch 会列出你在本地的分支

 

Git版本控制工具_github_35

4.2 创建新的分支

创建分支:git branch bugbran

Git版本控制工具_版本控制系统_36

 

4.3 切换分支

n  git checkout 分支名字

 

Git版本控制工具_版本控制系统_37

4.4 分支合并到主分支(先切换到主分支,然后合并)

 

Git版本控制工具_git_38

Git版本控制工具_版本控制系统_39

4.5 冲突

冲突一般指同一个文件同一位置的代码,在两种版本合并时版本管理软件无法判断到底应该保留哪个版本,因此会提示该文件发生冲突,需要程序员来手工判断解决冲突。

  

Git版本控制工具_git_40

 

合并时冲突

 

 

Git版本控制工具_版本控制系统_41

 

n  解决方案:

此时通过git diff 可以找到发生冲突的文件及冲突的内容。

Git版本控制工具_git_42

然后修改冲突文件的内容,再次git add <file> 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。

 

4.6 删除分支

git branch -d (branchname)  删除的时候会提示 是否删除还没被合并的分支??

 

注意不能删除当前所在分支,需要转到别的分支上。

如果要删除的分支已经成功合并到当前分支,删除分支的操作会直接成功。

如果要删除的分支没有合并到当前所在分支,则会出现提示,如果确定无须合并而要直接删除,则执行命令:

 

git branch -D (branchname) 强制删除分支 不提示

 

4.7 提交日志

git log

git log --pretty=oneline

git log --oneline --graph

 

4.8 标签

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。

比如说,我们想为我们的p2p项目发布一个"1.0"版本。 我们可以用 git tag -a v1.0 命令给最新一次提交打上(HEAD)"v1.0"的标签。

-a 选项意为"创建一个带注解的标签"。 不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解。 推荐一直创建带注解的标签

git tag -a v1.0  编辑模式输入版本的说明信息,:wq保存退出

 

git log --oneline --decorate --graph 查看标签信息

git tag  查看历史版本

 

Git版本控制工具_github_43

7.远程仓库

7.1 概述

Git 并不像 SVN 那样有个中心服务器。

目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上

Github 作为远程仓库或者码云都可以

GitHub是一个Git项目托管网站,主要提供基于Git的版本托管服务

Git版本控制工具_git_44

n  网址

https:///


n  注册账号的注意事项

 不要使用163的邮箱,有可能收不到验证邮件。

较长时间不使用有可能被Github冻结账号。请登录其客服页面https:///contact,填写账号恢复申请。

 

 

Git版本控制工具_版本控制系统_45

7.2 发布项目

n   周星星

Git 全局设置:

git config --global "zhouxingchi12345"

git config --global user.email "zhouxingchi12345@126.com"


创建 git 仓库:

mkdir test

cd test

git init

touch Dog.java

git add Dog.java

git commit -m "first commit"

git remote add origin https://gitee.com/zhouxingchi12345/hello.git

 

git push -u origin master


7.3 克隆项目

n   紫霞

git clone ​​https://gitee.com/zhouxingchi12345/hello.git​​ hello_zixia

Git版本控制工具_git_46

紫霞操作:

1.加入紫霞的身份认证信息 -- 局部认证信息  就近原则

git config "zixia12345678"

git config user.email "zixia12345678@126.com"

 

2.紫霞对项目进行操作

vi test.java

git add test.java

git commit -m "我是紫霞"

 

3.周星驰需要把紫霞加入项目组

 

Git版本控制工具_github_47


Git版本控制工具_版本控制系统_48

 

4.紫霞可以提交项目

git push -u origin master

 

Git版本控制工具_github_49

5.周星驰可以更新项目

git pull origin master

 

Git版本控制工具_git_50

7.4 协作冲突

在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。

 

 

Git版本控制工具_git_51

成员A:修改项目

 

vi test.java

git add test.java

git commit -m "A添加了一行"

git push -u origin master

 

成员B:修改项目

 

vi test.java

git add test.java

git commit -m "B添加了一行"

git push -u origin master

 

提交报异常:

 

Git版本控制工具_版本控制系统_52

成员B先更新

git pull origin master

Git版本控制工具_github_53

修改冲突之后,重新提交

 

vi test.java

git add test.java

git commit -m "冲突解决AB"

git push -u origin master

 

Git版本控制工具_版本控制系统_54

成员A再更新

git pull origin master

 

Git版本控制工具_github_55

8.在IDEA中配置GIT

Git版本控制工具_github_56

8.1 IDEA中集成GIT

安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。

选择File→Settings打开设置窗口,找到Version Control下的git选项:

选择git的安装目录后可以点击“Test”按钮测试是否正确配置。

Git版本控制工具_版本控制系统_57

8.2 将工程添加至git

1)在idea中创建一个工程,例如创建一个java工程,名称为HouseWeb,如下图所示:

Git版本控制工具_版本控制系统_58

2)创建本地仓库

在菜单中选择“vcs”→Import into Version Control→Create Git Repository...

Git版本控制工具_版本控制系统_59

选择工程所在的上级目录。本例中应该选择ideawork目录,然后点击“OK”按钮,在工程的上级目录创建本地仓库,那么ideawor目录就是本地仓库的工作目录,此目录中的工程就可以添加到本地仓库中。也就是可以把houseWeb工程添加到本地仓库中。

选择之后在工具栏上就多出了git相关工具按钮:

 

Git版本控制工具_版本控制系统_60

Git版本控制工具_版本控制系统_61

Git版本控制工具_git_62

 

 

3)将工程添加至本地仓库

直接点击

Git版本控制工具_git_63

commit按钮,将工程提交至本地仓库。

 

然后点击“commit”按钮,将工程添加至本地仓库。

 

Git版本控制工具_git_64

4)推送到远程

在github上创建一个仓库然后将本地仓库推送到远程。

在工程上点击右键,选择git→Repository→push,

或者在菜单中选择vcs→git→push

 

Git版本控制工具_版本控制系统_65

Git版本控制工具_github_66

点击“Define remote”链接,配置https形式的URL,git形式的无法通过。然后点击OK

Git版本控制工具_git_67

点击“push”按钮就讲本地仓库推送到远程,如果是第一次配置推送需要输入github的用户名和密码。

 

 

Git版本控制工具_github_68

8.3从远程仓库克隆

关闭工程后,在idea的欢迎页上有“Check out from version control”下拉框,选择git

Git版本控制工具_git_69

Git版本控制工具_版本控制系统_70

此处仍然推荐使用htts形式的url,点击“test”按钮后显示连接成功.

点击OK按钮后根据提示将远程仓库克隆下来,然后倒入到idea中。

 

Git版本控制工具_版本控制系统_71

Git版本控制工具_github_72

Git版本控制工具_github_73

Git版本控制工具_github_74

Git版本控制工具_版本控制系统_75

Git版本控制工具_git_76

Git版本控制工具_版本控制系统_77

 

 

 

 

8.4 从服务端拉取代码

如果需要从服务端同步代码可以使用工具条中的“update”按钮

Git版本控制工具_版本控制系统_78