1. Git版本控制工具
2. 一、版本控制[问题引入]
2.1. (一)版本控制思想
从个人工作和团队协作两个方面(角度)介绍版本控制思想
n 个人工作
往往为了恢复到某一个版本,我们不停的对我们的文件进行复制修改(备份)
n 团队协作
版本从何而来呢?
设定场景:
SVN以自增数字编写版本号,如123
Git,以hash码来标记每个不同的版本
A提交一次代码,服务器的版本为1
B提交一次代码,服务器的版本为2
…
每提交一次代码,服务器的文件版本+1,这样每次提交的东西都有一个版本号对应,易于管理,所以这种软件就叫做版本控制软件。安装了版本控制软件的服务器叫做,版本控制服务器,作用:团队协作开发。文件上传到版本控制服务器,仅有文件内容还不够,还需要文件的元数据信息(描述数据的数据就叫做元数据)(修改时间、修改人、备注注释信息等),这样才能够便于恢复版本、追责等
2.2. (二)版本控制软件应该具有的功能
l 协同修改 多人并行不悖的修改服务器端的同一个文件。
l 数据备份 不仅保存目录和文件的当前状态, 还能够保存每一个提交过的历史状态。
l 版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空 间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文 件系统快照的方式
l 历史记录 查看修改人、 修改时间、 修改内容、 日志信息。 将本地文件恢复到某一个历史状态。
l 分支管理 允许开发团队在工作过程中多条生产线同时推进任务, 进一步提高效率。
注意:版本控制不仅适用于IT领域
2.3. (三)版本控制工具介绍
1、集中式版本控制工具
代表:cvs、svn、vss
弊端:容错性不好,服务器宕机、磁盘坏掉都会影响工作进度
2、分布式版本控制工具
代表性:git、BitKeeper
3. 二、Git介绍[了解]
3.1. (一)Git简史
3.2. (二)Git官网和Logo
官网地址:https://git-scm.com/
3.3. (三)Git的优势
大部分操作在本地完成,不需要联网(不折不扣的分布式)
完整性保证
Hash算法
尽可能添加数据而不是删除或修改数据
分支操作非常快捷流畅
与 Linux 命令全面兼容
4. 三、Git工作流程[了解]
一般工作流程如下:
1.从远程仓库中克隆 Git 资源作为本地仓库。
2.从本地仓库中checkout代码然后进行代码修改。
3.在提交前先将代码提交到暂存区。
4.提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。
5.在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。
下图展示了 Git 的工作流程:
5. 四、Git的安装[应用]
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。由于开发机大多数情况都是windows,所以本教程只讲解windows下的git的安装及使用。
5.1. (一)软件下载
下载地址:https://git-scm.com/download
5.2. (二)软件安装[应用]
5.2.1. 1.安装git for windows
一路“下一步”使用默认选项即可。注意:安装路径不要用中文
验证安装是否成功:在任何一个目录下右键看是否有菜单
5.2.2. 2.安装TortoiseGit
一路“下一步”使用默认选项即可。
默认选项下会启动配置画面:
由于目前只有英文语言包,默认即可继续下一步。
配置git.exe,在4.2.1中已经安装过git-for-windows了所以在此找到git.exe所在的目录。
配置开发者姓名及邮箱,每次提交代码时都会把此信息包含到提交的信息中。
使用默认配置,点击“完成”按钮完成配置。
完整完毕后在系统右键菜单中会出现git的菜单项。
5.2.3. 3.安装中文语言包
安装中文语言包并不是必选项。可以根据个人情况来选择安装。
直接“下一步”完整完毕。
语言包安装完毕后可以在TortoiseGit的设置中调整语言
6. 五、Git的结构[认识]
6.1. (一)Git的本地结构
6.2. (二)Git的代码托管中心
代码托管中心的任务:维护远程库
局域网环境下:GitLab服务器
外网环境下:GitHub、码云
6.3. (三)本地库和远程库
本地库和远程库的交互方式,介绍这么两种:一种是团队内部协作,一种是跨团队协作
7. 六、Git命令行操作[掌握]
Git本地项目仓库(可以多个)初始化
命令行操作学习路线:初始化git本地版本库——>在本地版本库管理文件(新建文件 —>把文件加入git的管理 —> 修改文件 —> 恢复到之前某一个版本)
7.1. (一)创建版本库
7.1.1. 1.使用GitBash
在当前目录中点击右键中选择Git Bash来启动。
创建仓库执行命令:
n 命令:git init
n 效果
注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改
7.1.2. 2.使用TortoiseGit
使用TortoiseGit时只需要在目录中点击右键菜单选择“在这里创建版本库”
版本库创建成功,会在此目录下创建一个.git的隐藏目录,如下所示:
在windows中如何显示隐藏目录隐藏目录请自行百度o(╯□╰)o
概念:
版本库:“.git”目录就是版本库,将来文件都需要保存到版本库中。
工作目录:包含“.git”目录的目录,也就是.git目录的上一级目录就是工作目录。只有工作目录中的文件才能保存到版本库中。
7.2. (二)设置签名
形式
用户名:tom
Email地址:helloword@aliyun.com
作用:区分不同开发人员的身份
辨析:这里设置的签名和登录远程库(代码托管中心)的账号、 密码没有任何关 系
命令:
项目级别/仓库级别:仅在当前本地库范围内有效
git config user.name tom_pro
git config user.email helloword@aliyun.com
l 信息保存位置:.git/config文件
系统用户级别:登录当前操作系统的用户范围
git config --global user.name tom_global
git config --global user.email tomabc@aliyun.com
信息保存位置:保存在当前仓库目录下的 .git/config 文件中
级别优先级:
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
7.3. (三)基本操作
7.3.1. 1.添加
使用GitBash
git add [filename]
将工作区的“新建/修改”添加到暂存区
在~/Desktop/gittest目录下创建一个good.txt文件
使用TortoiseGit
7.3.2. 2.提交
使用GitBash
git commit -m “commit message” [file name]
将暂存区的内容提交到本地库(暂存区内容修改后进行提交)
使用TortoiseGit
7.3.3. 3.查看历史记录
使用GitBash
git log
git log --pretty=oneline 美化log日志
git log --oneline 美化log日志
git reflog(推荐) 用来恢复本地错误操作很重要的一个命令
HEAD@{移动到当前版本需要多少步}
使用TortoiseGit
7.3.4. 4.状态查看
使用GitBash
git status
查看工作区,暂存区状态
文件名红色表明工作目录中的文件尚未被追踪管理
前进后退
本质:其实内部维护了一个HEAD指针,做这么一个reset操作的时候,其实相当于移动了HEAD指针(表明的是当前的状态)
基于索引值操作[推荐]
git reset --hard [局部索引值/版本号前缀]
使用^符号:只能后退
git reset --hard HEAD^ 一个表示后退一步,n个表示后退n步
使用~符号:只能后退
git reset --hard HEAD~n(注:表示后退n步)
7.3.5. 5.删除文件
使用TortoiseGit
需要删除无用的文件时可以使用git提供的删除功能直接将文件从版本库中删除。
注意:不要仅仅从工作目录删除,删除之后也需要git add然后git commit提交到本地仓库管理
7.3.6. 6.删除文件并找回
使用GitBash
前提:删除前,文件存在时的状态提交到了本地库
操作:git reset --hard 指针位置
删除操作已经提交到本地库:指针位置指向历史记录
7.3.7. 7.比较文件差异
使用GitBash
git diff [文件名]:将工作区中的文件和暂存区进行比较
git diff 本地仓库中的历史版本 文件名:将工作区中的文件和版本库进行比较(主要)
使用TortoiseGit
7.3.8. 8.还原修改
使用TortoiseGit
当文件修改后不想把修改的内容提交,还想还原到未修改之前的状态。此时可以使用“还原”功能
注意:此操作会撤销所有未提交的修改,所以当做还原操作是需要慎重慎重!!!
7.4. (四)工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
什么是工作区(Working Directory)?
工作区就是你在电脑里能看到的目录,比如我的reporstory文件夹就是一个工作区。
有的同学可能会说repository不是版本库吗怎么是工作区了?其实repository目录是工作区,在这个目录中的“.git”隐藏文件夹才是版本库。这回概念清晰了吧。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
如下图所示:
分支和HEAD的概念我们稍后再讲。前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
7.5. (五)案例:将java工程提交到版本库
使用TortoiseGit:
第一步:将参考资料中的java工程gittest复制到工作目录中
第二步:将工程添加到暂存区。
点击确定完成暂存区添加。
三、忽略文件或文件夹
在此工程中,并不是所有文件都需要保存到版本库中的例如“.idea”目录及目录下的文件就可以忽略。好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
如果使用TortoiseGit的话可以使用菜单项直接进行忽略。
选择保留本地文件。完成后在此文件夹内会多出一个.gitignore文件,这个文件就是文件忽略文件,当然也可以手工编辑。其中的内容就是把.idea目录忽略掉。
四、提交代码
将代码添加到master分支上,其中.gitignore文件也需要添加到暂存区,然后提交到版本库。
7.6. (六)忽略文件语法规范
空行或是以 # 开头的行即注释行将被忽略。
可以在前面添加正斜杠 / 来避免递归,下面的例子中可以很明白的看出来与下一条的区别。
可以在后面添加正斜杠 / 来忽略文件夹,例如 build/ 即忽略build文件夹。
可以使用 ! 来否定忽略,即比如在前面用了 *.apk ,然后使用 !a.apk ,则这个a.apk不会被忽略。
* 用来匹配零个或多个字符,如 .[oa] 忽略所有以".o"或".a"结尾, ~ 忽略所有以 ~ 结尾的文件(这种文件通常被许多编辑器标记为临时文件); [] 用来匹配括号内的任一字符,如 [abc] ,也可以在括号内加连接符,如 [0-9] 匹配0至9的数; ? 用来匹配单个字符。
看了这么多,还是应该来个栗子:
# 忽略 .a 文件
*.a
# 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件
!lib.a
# 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO
/TODO
# 忽略 build/ 文件夹下的所有文件
build/
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 文件 在 doc/ directory 下的
doc/*/.pdf
8. 七、Git分支管理[了解]
往往应用于大型项目,而且分支由项目经理管理
8.1. (一)什么是分支
在版本控制过程中,使用多条线同时推进多个任务
8.2. (二)分支的好处
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可
8.3. (三)分支操作
8.3.1. 1.创建分支
使用GitBash
git branch 分支名
使用TortoiseGit
如果想创建完毕后直接切换到新分支可以勾选“切换到新分支”选项或者从菜单中选择“切换/检出”来切换分支:
8.3.2. 2.查看分支
使用GitBash
git branch -v
8.3.3. 3.切换分支(checkout检出)
使用GitBash
git checkout 【分支名】
8.3.4. 4.合并分支
使用GitBash
第一步:切换到接受修改的分支
git checkout 【被合并分支名】
第二部:执行merge(合并)命令
git merge 【有新内容分支名】
8.3.5. 5.解决冲突
使用GitBash
冲突的表现及冲突的解决
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存退出
不要留有特殊字符<<<<<<< =>>>>>>
第三步:git add 文件名
第四步:git commit -m ‘日志信息’,注意此时,commit一定不能带具体的文件名,否则会出现错误
9. 八、GitHub[应用]
9.1. (一)添加远程仓库
现在我们已经在本地创建了一个Git仓库,又想让其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份。常用的远程仓库就是github:https://github.com/,接下来我们演示如何将本地代码同步到github。
9.2. (二)账号信息
GitHub首页就是注册页面:https://github.com/
首先你得在github上创建一个账号
![]() |
Email地址:githubyuebuqun@aliyun.comGitHub账号:githubyuebuqun |
---|---|
![]() |
Email地址:githublinghuchong@aliyun.comGitHub账号:githublinghuchong |
![]() |
Email地址:githubdongfangbubai@aliyun.comGitHub账号:githubdongfangbubai |
9.3. (三)创建GitHub远程库
点击“create repository”按钮仓库就创建成功了。
Github支持两种同步方式“https”和“ssh”。如果使用https很简单基本不需要配置就可以使用,但是每次提交代码和下载代码时都需要输入用户名和密码。如果使用ssh方式就需要客户端先生成一个密钥对,即一个公钥一个私钥。然后还需要把公钥放到githib的服务器上。这两种方式在实际开发中都用应用,所以我们都需要掌握。
9.4. (四)创建远程仓库地址别名
git remote -v 查看当前所有远程地址别名
git remote add [别名] [远程地址]
9.5. (五)同步到远程仓库
https方式
git push [别名] [分支名]
SSH方式
git remote rm origin
git remote add origin [ssh仓库地址]
git push -u origin [分支]
9.6. (六)从远程仓库克隆
命令:git clone [仓库远程地址]
效果:
完整的把远程库下载到本地
创建origin远程地址别名
初始化本地库
使用TortoiseGit:
9.7. (七)团队成员邀请
复制邀请连接
“岳不群”其他方式把邀请连接发送给“令狐冲”,“令狐冲”登录自己的GitHub账号,访问邀请连接,接受邀请
9.8. (八)从远程仓库取代码
pull = fetch(获取的意思) + merge
git fetch [远程库地址别名] [远程分支名]
如果要查看,需要切换仓库git checkout origin/master,然后cat 文件
例如:
git fetch original master
git checkout original/master
cat ….txt
git checkout master
git merge original/master
git merge [远程库地址别名/远程分支名]
git pull [远程库地址别名] [远程分支名]
或
9.9. (九)解决冲突
首先需要pull最新的代码
然后处理冲突,和分支合并处理冲突一样,注意commit时不要带文件名,commit后push到远程
要点:
如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取
拉取下来如果进入冲突状态,模仿分支冲突解决即可
9.10. (十)跨团队协作
把项目的地址发送给团队外部的人(线下发送)
团队外部人员登录github,然后访问给出的地址
团队外人员把fork后的远程仓库clone到本地进行fork
团队外人员本地编辑提交,push到远程
pull request
团队内人员,查看审核请求
团队人员登录
查看修改内容
n然后将远程库拉取到本地即可,拉取到本地结束跨团队协作的过程
9.11. (十一)SSH操作
9.11.1. 1.什么是ssh?
SSH 为 Secure Shell(安全外壳协议)的缩写,由 IETF 的网络小组(Network Working Group)所制定。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
9.11.2. 2.基于密匙的安全验证
使用ssh协议通信时,推荐使用基于密钥的验证方式。你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
(1)ssh密钥生成
在windows下我们可以使用 Git Bash.exe来生成密钥,可以通过开始菜单或者右键菜单打开Git Bash
git bash 执行命令,生命公钥和私钥
命令: ssh-keygen -t rsa
执行命令完成后,在window本地用户.ssh目录C:\Users\用户名.ssh下面生成如下名称的公钥和私钥:
(2)ssh密钥配置
密钥生成后需要在github上配置密钥本地才可以顺利访问。
在key部分将id_rsa.pub文件内容添加进去,然后点击“Add SSH key”按钮完成配置。
9.11.3. 3.SSH原理
10. 九、Idea中操作Git[掌握]
10.1. (一)在Idea中配置git
安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。
选择File→Settings打开设置窗口,找到Version Control下的git选项:
选择git的安装目录后可以点击“Test”按钮测试是否正确配置。
10.2. (二)将工程添加至git
1)在idea中创建一个工程,例如创建一个java工程,名称为idea-git-test,如下图所示:
2)创建本地仓库
在菜单中选择“vcs”→Import into Version Control→Create Git Repository...
选择工程所在的上级目录。本例中应该选择idea-projects目录,然后点击“OK”按钮,在工程的上级目录创建本地仓库,那么idea-projects目录就是本地仓库的工作目录,此目录中的工程就可以添加到本地仓库中。也就是可以把idea-git-test工程添加到本地仓库中。
选择之后在工具栏上就多出了git相关工具按钮:
3)将工程添加至本地仓库
直接点击commit按钮,将工程提交至本地仓库。
然后点击“commit”按钮,将工程添加至本地仓库。
4)推送到远程
在github上创建一个仓库然后将本地仓库推送到远程。
在工程上点击右键,选择git→Repository→push,
或者在菜单中选择vcs→git→push
点击“Define remote”链接,配置https形式的URL,git形式的无法通过。然后点击OK
点击“push”按钮就讲本地仓库推送到远程,如果是第一次配置推送需要输入github的用户名和密码。
10.3. (三)从远程仓库克隆
关闭工程后,在idea的欢迎页上有“Check out from version control”下拉框,选择git
此处仍然推荐使用htts形式的url,点击“test”按钮后显示连接成功。
点击OK按钮后根据提示将远程仓库克隆下来,然后倒入到idea中。
10.4. (四)从服务端拉取代码
如果需要从服务端同步代码可以使用工具条中的“update”按钮
11. 十、Git基本原理[了解]
11.1. (一)哈希
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
哈希算法确定,输入数据确定,输出数据能够保证不变
哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
哈希算法不可逆
Git底层采用的是SHA-1算法
哈希算法可以被用来验证文件,原理如下图所示
11.2. (二)Git保存版本的机制
集中式版本控制工具的文件管理机制: 以文件变更列表的方式存储信息。系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git的文件管理机制
Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个连接指向之前存储的文件。所以Git的工作方式可以称之为快照流