git_http

1.掌握从远程仓库克隆项目

2.掌握将本地仓库代码推送(push)到远程仓库

3.掌握从远程仓库拉取(pull)最新代码

4.掌握如何解决冲突

1. Git简介

1.1. Git是什么?

Git是目前世界上最先进的分布式文件版本控制系统工具(没有之一)。对于我们java程序员而言,管理的就是代码文件版本。

1.2. Git和GitHub

什么是GitHub?

确切的说 GitHub 是一家公司,位于旧金山,由 Chris Wanstrath, PJ Hyett 与 Tom Preston-Werner 三位开发者在2008年4月创办。这是它的 Logo:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VMZek4cs-1575802232643)(assets/1558506063331.png)]

2008年4月10日,GitHub正式成立,主要提供基于git的版本托管服务。一经上线,它的发展速度惊为天人,截止目前,GitHub 已经发展成全球最大的开源社区。 所以 Git 只是 GitHub 上用来管理项目的一个工具而已,但是GitHub 的功能可远不止于此!

**1.3. **集中式和分布式

1.3.1. 集中式版本控制(SVN)

​ SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。如果中心服务器出现问题,所有人都不能正常干活,恢复也很麻烦,因为SVN记录的是每次改动的差异,不是完整文件

下图就是标准的集中式版本控制工具管理方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8b1BHAF-1575802232644)(assets/1558506140040.png)]

​ 集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。

但是相较于其优点而言,集中式版本控制工具缺点很明显:

l 服务器单点故障

l 容错性差

1.4. 分布式版本控制

​ Git是分布式版本控制系统,那么它可以没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

下图就是分布式版本控制工具管理方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5qt3A7KY-1575802232645)(assets/1558506165102.png)]

2. Git安装

2.1. 下载

下载地址:https://git-scm.com/download

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dYbzTEUT-1575802232645)(assets/1558506207794.png)]

或者我们也可以使用课前资料提供的安装包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zaw9ApiF-1575802232645)(assets/1558506245369.png)]

2.2. 安装git for windows

双击安装:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q8OBGSJB-1575802232646)(assets/1558506302254.png)]

一路“Next”使用默认选项即可。

安装完成后,可以在任意文件夹点右键,看到如下菜单:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R5v0tOIQ-1575802232646)(assets/1558506938227.png)]

点击后,出现Git的控制台,在控制台输入git,可以看到相关的帮助信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qzYNbEiy-1575802232646)(assets/1558506413273.png)]

3. Git的基本使用

3.1. 创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。由于git是分布式版本管理工具,所以git在不需要联网的情况下也具有完整的版本管理能力。

创建一个版本库非常简单,

1)首先,选择一个合适的地方,创建一个空目录。我在本机的D:\test目录下,创建了一个Hello目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GPDORk2C-1575802232647)(assets/1558506640325.png)]

2)使用git init命令把这个目录变成Git可以管理的仓库: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xKoWRlFQ-1575802232647)(assets/1558506739929.png)]

命令输入后,会提示你,已经创建了一个空的Git仓库。此时你会在hello目录下发现一个隐藏目录.git

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TzZjMSwG-1575802232647)(assets/1558506790995.png)]

​ 这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

​ 此处的hello目录就是我们的:工作区,存放所有当前文档。此目录下的文件才会被Git管理

​ hello中的.git目录就是我们的:本地仓库,管理并保存所有的文档变化及历史状态。

总结:创建版本库的步骤:

1) 进入需要管理的目录

2) 执行 git init 命令

3.2. 添加文件并提交

​ 版本控制系统,其目的就是跟踪文本文件的改动,例如我们开发时编写的.java、.xml、.properties本质都是文本文件。文件中每一个字符的变化都会被跟踪并且管理。

1)我们在当前的hello目录下创建一个新的文本文件:readme.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AnoV11U8-1575802232648)(assets/1558507115035.png)]

编写一段文字(注意,一定不要用windows的记事本):hello git

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMuFPaL1-1575802232648)(assets/1558507155864.png)]

2)接下来,我们使用 git add 命令,将文件添加到暂存区

git add 文件名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P6ZC70Vb-1575802232648)(assets/1558507293796.png)]

没有任何的反应,证明没有问题

3)使用 git commit 命令,将暂存区文件提交到本地仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vXHIuwRd-1575802232649)(assets/1558507658192.png)]

如果是第一次安装使用git,提交的时候需要认证用户

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h4WJBcMs-1575802232649)(assets/1560737345475.png)]

命令解释:

git commit 命令可以将暂存区的文件提交到版本库。

-m 参数,是本次提交的说明信息,用来注释本次提交做了些说明事情。

总结,将一个文件添加到本地仓库,分两步:

3) 使用 git add 命令,添加文件。可以一次添加多个文件。

4) 使用 git commit 命令,提交,一次即可。

可能大家会有疑问,为什么这里不是直接commit提交,而是要经过add和commit两个步骤呢?

这就关系到Git的版本库中的 工作区 暂存区概念了。

3.3. 工作区/暂存区/版本库

我们先来理解下Git 工作区、暂存区和版本库概念

3.3.1. 工作区:

工作区就是你在电脑里能看到的目录。比如我们刚刚创建的hello目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7JRzSoo-1575802232649)(assets/1558507960964.png)]

其中包含了一个隐藏目录 .git ,其它就是我们需要被管理的文件。

3.3.2. 版本库及暂存区

工作区有一个隐藏目录**.git**,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7y5UUR7r-1575802232650)(assets/1560737368971.png)]

前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

3.4. 管理文件修改

​ 被版本库管理的文件不可避免的要发生修改,此时只需要直接对文件修改即可。修改完毕后需要将文件的修改提交到版本库。

我们对readme.txt文件进行修改,添加一行数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0jJlJBhu-1575802232650)(assets/1558508321605.png)]

3.4.1. 差异比较

用git diff – readme.txt命令可以查看工作区和版本库里面最新版本的区别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A99I1N0N-1575802232650)(assets/1558508500386.png)]

可以发现,与版本库中的 readme.txt相比,我们多了一行文本!

3.4.2. 查看状态,提交修改

我们如果不确定自己的哪些文件被修改了,可以使用git status 命令,查看当前工作区的状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ve2kpaFb-1575802232651)(assets/1558508638807.png)]

可以清楚的看到:changes not staged for commit(修改没有被缓存,需要使用git add来进行添加操作)

我们使用git add 命令,添加到暂存区,然后再次查看状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cjVv2PpI-1575802232651)(assets/1558508723334.png)]

这次提示: changes to be commited (修改需要被提交),我们使用git commit 进行提交后,再次查看状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UBeXCWYN-1575802232651)(assets/1558508805559.png)]

提示说:工作区很干净,没有任何需要提交,搞定!

**3.4.3.**版本回退

现在,我们再次修改readme.txt,添加一行内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9nSs73gj-1575802232652)(assets/1558509536049.png)]

然后提交到版本库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-byfI0XIt-1575802232652)(assets/1558509619213.png)]

**3.4.3.1.**日志查看

我们通过 git log 命令,可以查看历史的每次提交信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3U2byxu3-1575802232652)(assets/1558509701131.png)]

​ 可以发现,目前为止,我们已经在本地仓库中提交了3次,也就是说有3个不同版本。其中,最近的这个版本有一个标示:HEAD ,这就是标记当前分支的当前版本所在位置。

本例当中,当前版本即 test version control这次提交,如果没有HEAD->MASTER,加上 --decorate查看,即git log --decorate。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XG1H4tmQ-1575802232654)(assets/1558509913326.png)]

​ 另外,在log中,每一个版本的前面,都有一长串随即数字:2edf728e6fde09c9d33ce6dd96fd684ed09ebcc ,这是每次提交的commit id ,这是通过SHA1算法得到的值,Git通过这个唯一的id来区分每次提交。

3.4.3.2. 版本回退

现在,假设我们要回到上一级版本,该如何操作呢?

首先,Git通过HEAD来判断当前所在的版本位置。那么上一个版本,就用HEAD**标示,上上一个版本就是**HEAD**,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100**。

如果要从 “test version control” 回退到 “modify readme file” ,我们可以使用 git reset --hard HEAD^ 命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8QZyCbW-1575802232654)(assets/1558510085695.png)]

提示说:HEAD 现在已经被设置到 35CEB36 的版本,即 modify readme file。

我们查看readme.txt:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ncf8xm9a-1575802232654)(assets/20190522152948.gif)]

果然,版本已经回退了,最新添加的数据“test version control”已经没了。

此时再次查看日志,发现只剩下2次提交信息了,第三次提交的信息已经没了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KvfWyNls-1575802232655)(assets/1558510370249.png)]

假如此时我后悔了,还想回到第3次提交的版本,怎么办?

3.4.3.3. 查看所有关联日志

我们可以通过git reflog命令,看到以前的每次执行动作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ch6rvqU7-1575802232655)(assets/1558510425025.png)]

其中红框内的部分,就是我们第三次提交的日志信息。前面的e498642 就是第三次提交的 commit id 的前几位数字。

我们可以通过指定commit id 的方式,来指定HEAD的位置:

指令:git reset --hard {commit id}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f2vkNGAu-1575802232655)(assets/1558510522778.png)]

查看日志:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0kpioJuP-1575802232656)(assets/1558510546550.png)]

查看文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D3tAnW0P-1575802232656)(assets/20190522153652.gif)]

数据又回来了!

3.4.3.4. 总结

如果要进行版本回退或前进,一般分两步:

1) 通过git loggit reflog 查看操作日志,查找版本的commit id

2) 通过 git reset --hard 设置HEAD到指定版本

其实版本的回退,仅仅是修改HEAD指针的位置而已,因此Git进行版本的切换,比svn要快的多!

**3.4.4.**撤销修改

**3.4.4.1.**撤销工作区修改

现在我们在readme.txt中添加一行数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WO4t9kkO-1575802232656)(assets/1558511204590.png)]

在你提交前,你突然发现这个修改是有问题的,你打算恢复到原来的样子。怎么办?

如果修改的并不多,我们完全可以手动恢复到原始状态。但是如果改动比较大,手动处理就很容易有遗漏,而且很麻烦。怎么办?

查看状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nef1T2I5-1575802232657)(assets/1558511238828.png)]

Git提示我们,现在文件已经修改,等待被staged(暂存)。我们有两个选择:

1) 可以使用git add 来添加到暂存区,接着去提交文件

2) 可以使git checkout – 来撤销修改

所以,这里我们选择第二种方案后,再次查看状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wl3avEOz-1575802232657)(assets/1558511358298.png)]

工作区是干净的!修改已经被撤销了!

查看文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5lz1koSg-1575802232658)(assets/1558511398936.png)]

**3.4.4.2.**撤销staged修改

刚才的案例中,我们修改了数据,并没有add带暂存区,处理起来还算简单。如果我们已经吧数据add 到了暂存区,又该如何处理呢?

我们首先添加一行数据到readme.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-boqbWCjw-1575802232658)(assets/1558511617500.png)]

并且添加到staged(暂存区),然后查看状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-31vFrHEL-1575802232658)(assets/1558511646760.png)]

有一个修改等待被提交,并且有一行提示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Upuz9s4-1575802232659)(assets/1558511681342.png)]

可以使用 git reset HEAD 来撤销缓存修改。

我们前面说过,git reset 命令可以进行版本回退,此处reset 指定的是HEAD ,而不是其他版本,因此就有撤销缓存修改的作用:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-onjgfbLt-1575802232659)(assets/1558511813059.png)]

查看状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2FSQMRK-1575802232659)(assets/1558511826077.png)]

发现文件的修改被撤回到了工作区,尚未添加到staged(暂存区),我们再次执行git checkout 即可撤销工作区修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BG90H322-1575802232660)(assets/1558511863971.png)]

工作区干净了!

查看文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zpNJqylV-1575802232660)(assets/1558511879440.png)]

文件也恢复了原来的状态,整个世界都清净了!

**3.4.4.3.**总结

撤销修改分两种情况:

1) 撤销工作区修改,使用git checkout

2) 撤销暂存区修改,分两步:

a) 使用**git reset HEAD **来撤销暂存区修改。

b) 使用git checkout **-- **来撤销工作区修改

4. 远程仓库

​ 到目前为止,我们已经学会了如何在本机利用git进行文件版本管理,但是如果要想进行多人协作,我们就必须使用远程仓库。将本地仓库的数据同步到远程仓库,实现多人协作开发。

​ 目前比较热门的代码托管社区:GitHub,网址:https://gtihub.com ,提供了免费的远程git仓库功能。不过网速不是特别流畅。 在国内,有很多的公司使用oschina提供的git服务:码云, https://gitee.com ,当然,我们也可以自己来搭建远程仓库。目前学校服务器中搭建了一个git私服,其地址为:http://192.168.50.33:10080

4.1. 访问远程仓库

4.1.1. 注册并登录

访问:http://192.168.50.33:10080

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rkzHbZXE-1575802232660)(assets/1558512621584.png)]

大家自己注册并登录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3k2HhENY-1575802232661)(assets/1558512723739.png)]

4.1.2. 创建新的仓库

在页面左侧,选择创建新的仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X1kriEgR-1575802232661)(assets/1558512794136.png)]

填写仓库信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2lNrjbfn-1575802232662)(assets/1558512927215.png)]

仓库创建完毕,可以看到,如果我们要与远程仓库同步,这里支持两种不同的通信协议,sshhttp。当我们选中一种协议后,后面会出现对应的远程仓库地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vI66yTj5-1575802232662)(assets/1560757334683.png)]

在企业中一般使用HTTP协议的仓库地址,因为简单,而且都是公司内网,也很安全。

要使用SSH协议进行同步,你就必须生成SSH密钥,并添加到当前仓库的许可列表中,比较繁琐。作为开发人员我们不需关注这个协议,重点是使用git工具进行代码的远程操作。

**4.1.3. **推送远程仓库

通过控制面板,回到仓库页面,发现下面有一段帮助信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nboMj1Kx-1575802232663)(assets/1560757528300.png)]

关联远程仓库:

git remote add origin http://192.168.154.133:3000/fangqyou/git-hello.git

需要注意的是:git remote add origin 后面紧跟的,其实是上面的仓库地址信息

推送本地仓库到远程仓库的master分支:

git push -u origin master

上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。不带任何参数的git push,默认只推送当前分支,这叫做simple方式。

执行命令,发现有提示信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nz7nhmV8-1575802232663)(assets/1560758020477.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GoFjrrLC-1575802232663)(assets/1560758040604.png)]

推送成功!此时登录远程仓库,刷新页面,可以看到数据已经推送,并且与本地仓库完全一致:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vx99Tnir-1575802232664)(assets/1560757992875.png)]

从现在起,只要本地作了提交,就可以通过命令:

git push origin master

把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

4.1.4. 克隆远程仓库

​ 现在,假设一个新的成员要加入我们的开发队伍,那他首先要做的第一件事情,一定是从远程仓库获取所有代码。此时就可以使用克隆动作。

克隆远程仓库:就是从远程把仓库复制一份到本地,克隆后会创建一个新的本地仓库。

我们随意找到一个目录D:\test\world:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-omVEqBxQ-1575802232664)(assets/1558515192783.png)]

打开控制台,输入命令:git clone 远程仓库地址

远程仓库地址可以在仓库页看到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDni9BlM-1575802232665)(assets/1560758095024.png)]

输入命令:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kaOWbicU-1575802232665)(assets/1560758394970.png)]

查看目录:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CTZotQPM-1575802232665)(assets/1560758462938.png)]

查看状态:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbNgQ9lD-1575802232666)(assets/1560758502988.png)]

OK,你已经与远程仓库完全一致了,开始你的工作吧!

4.1.5. 拉取远程仓库数据

​ 现在如果有人也向远程仓库推送了代码,那么当我们就需要拉取 远程仓库的最新代码到本地:

我们可以先手动修改远程仓库数据,模拟他人的提交:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K1TypQX4-1575802232666)(assets/1560758684531.png)]

在本地拉取最新代码,使用git pull 命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdwdD7xx-1575802232667)(assets/1560758727534.png)]

查看readme文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4WBOTFK-1575802232667)(assets/1560758760279.png)]

内容已经与远端保持一致。

4.2. 总结

注意:

1) 如果要使用SSH协议与远程仓库同步,就必须先在本地生成公钥和私钥,然后将公钥添加到远程的SSH列表

2) 如果已经有本地仓库,并且想要与远程仓库关联,一般需要两步:

​ a) 通过git remote add origin + 远程仓库地址 进行关联

​ b) 通过git push -u origin master推送本地仓库修改到远程仓库

3)如果没有本地仓库,先创建远程仓库,然后通过git clone + 远程仓库地址 进行克隆并创建本地仓库

4)通过git pull 拉取远程仓库的最新内容到本地仓库

5. 分支管理

5.1. 分支有什么用

​ 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险.

​ 现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

​ 其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。

​ 但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

5.2. Git的分支管理原理

​ 我们的每次提交,都对应一个具体的时间点,git会把这许多的时间点串起来,就形成了一条时间线,这条时间线就是一个分支。Git中默认的分支就是主分支,叫master。

我们查看当前的提交日志:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QGSeZaAc-1575802232667)(assets/1558519175005.png)]

发现总共有3次提交,这3次提交可以串起来成一条时间线,就是master分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bu52Iyc1-1575802232668)(assets/1558519215148.png)]

每次提交,master分支都会新增一个时间点,分支线也不断变长。

当我们创建新的分支,例如dev分支。Git会创建一个新的指针,叫做dev,指向跟master相同的时间点(提交点),这样分支就创建好了,你的工作区无需任何改变,创建分支的速度非常的快。

而要切换分支,只需要把HEAD指向dev即可,所以你的分支实现了光速切换!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i0ZTjDpc-1575802232668)(assets/1558519336315.png)]

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CCQF76b4-1575802232668)(assets/1558519358799.png)]

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EPnnzPVh-1575802232669)(assets/1558519371070.png)]

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dGQ9ECpR-1575802232669)(assets/1558519383745.png)]

你会发现Git的分支管理,基本就是创建新的指针,改变HEAD指向,删除指针等操作,几乎没有文件的增删。所以速度非常快!

5.3. 分支的创建和合并

5.3.1. 创建分支

我们可以使用 git checkout -b 分支名 来创建并切换到新的分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H9ZVjlYn-1575802232670)(assets/1558580401859.png)]

你会注意到我们已经切换到了dev分支。 git checkout 加上 -b 参数,就等同于创建分支,并切换分支。相当于以下两条命令:

git branch dev # 创建分支

git checkout dev # 切换到具体分支

使用git branch 查看所有分支,当前分支前面会有一个*表示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gtkHc4ud-1575802232670)(assets/1558580451682.png)]

然后我们可以在dev分支上进行修改和提交。例如我们在readme.txt上添加一行文字:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9r4CRxfM-1575802232670)(assets/1558580508100.png)]

提交修改:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tdJcshsj-1575802232671)(assets/1558580565408.png)]

此时,dev分支已经比master领先了一次提交,并且HEAD指向的是dev

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpSgcmlE-1575802232671)(assets/1558580646859.png)]

5.3.2. 合并分支

我们使用git checkout master切换回master分支,查看内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vcZPA5Xa-1575802232672)(assets/1558580731092.png)]

发现readme并没有改变,因为刚才修改的是dev分支。此时的HEAD已经指向了master了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XtEUX6RL-1575802232672)(assets/1558580759923.png)]

我们使用git merge dev命令将 dev分支的修改合并到master分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qcdIgugA-1575802232673)(assets/1558580858996.png)]

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

5.3.3. 删除分支

合并完成后,就可以放心地删除dev分支了,可以使用git branch -d dev 命令删除dev分支,dev就是具体的分支名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-swsk1Ra8-1575802232673)(assets/1558581059628.png)]

再次查看分支列表:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V0V0zcrY-1575802232674)(assets/1558581082976.png)]

5.3.4. 总结

1) 使用git branch 分支名 创建分支

2) 使用git checkout 分支名 来切换分支

3) 也可以使用 git checkout -b 分支名 来完成 创建并切换分支的操作

4) 使用git merge 分支名 来合并分支到当前分支

5) 使用git branch -d 分支名 来删除指定分支,注意:要删除一个未合并的分支。需要使用**-D**参数进行强制删除

5.4. 解决冲突

5.4.1. 制造冲突

现在我们新建一个分支:dev

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtBKMVtK-1575802232674)(assets/1558581430626.png)]

然后修改readme.txt:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OuN91rKR-1575802232674)(assets/1558581416934.png)]

dev的修改提交:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wxyoun7L-1575802232675)(assets/1558581482807.png)]

切换到master分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGwxVUsc-1575802232675)(assets/1558581536533.png)]

并且在readme.txt最后添加内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZyGslgmi-1575802232676)(assets/1558581566401.png)]

提交数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EqOHV0p2-1575802232676)(assets/1558581605219.png)]

现在,master和dev都有了各自新的提交,变成了这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97PitunO-1575802232676)(assets/1558581618270.png)]

5.4.2. 解决冲突

这种情况下,是无法进行快速合并的。我们试一下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dsKWGUll-1575802232677)(assets/1558581779956.png)]

自动合并失败,必须先解决文件冲突,才能提交。

此时查看readme.txt文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yx9vY4Ez-1575802232677)(assets/1558581802995.png)]

我们可以根据实际情况进行冲突解决,比如两者都保留:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMM2qr9Y-1575802232678)(assets/1558581832727.png)]

然后再次提交:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cizcUlg3-1575802232678)(assets/1558581890857.png)]

工作区就干净了。此时master和dev分支线就变成了这样:

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nco2oXWm-1575802232678)(assets/1560737439112.png)]

可以用git log --graph --decorate --pretty=oneline --abbrev-commit命令来查看:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Y3A7Swo-1575802232679)(assets/1558582108527.png)]

接下来就可以删除dev分支了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kqVQcNri-1575802232679)(assets/1558582167145.png)]

6. 客户端工具TortoiseGit

​ 现在Git的客户端工具非常多,比较流行的例如:TortoiseGit(在svn中俗称小乌龟)、SourceTree。

SourceTree的注册需要科学上网。因此这里就不做讲解了。

6.1 安装

详见安装文档

6.2. 基本使用

6.2.1. 创建本地仓库

我们新建一个空的文件夹:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mxr0xUq8-1575802232681)(assets/1558592528260.png)]

然后进入tortoise目录,右键操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IjuyCgnP-1575802232682)(assets/1558592565276.png)]

弹出提示,不要勾选:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fGa25LRO-1575802232682)(assets/1558592639043.png)]

查看目录,发现生成.git文件夹:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRu482jV-1575802232682)(assets/1558592678483.png)]

6.2.2. 添加文件并提交

创建新的文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZzboANpj-1575802232683)(assets/1558592753116.png)]

编写内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zLayGHLA-1575802232684)(assets/1558592771988.png)]

在文件夹中右键操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ndi29Ec-1575802232684)(assets/1558592822803.png)]

提示:这一步等同于我们的 git add readme.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-prtWOZNm-1575802232685)(assets/1558592861205.png)]

此时直接点击提交,即可完成:git commit 操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vslXtE1D-1575802232685)(assets/1558592963373.png)]

提示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Sidxjig-1575802232686)(assets/1558592990530.png)]

6.2.3. 管理修改

6.2.3.1. 差异对比

修改readme.txt:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BbI7nF26-1575802232686)(assets/1558593075417.png)]

右键操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u1z6xaQE-1575802232687)(assets/1558593202576.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-URVsRasB-1575802232687)(assets/1558593362149.png)]

6.2.3.2. 提交修改

直接在文件上选择右键,提交即可(只要add过一次,后续不用add操作,直接提交):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rdhTfFTd-1575802232688)(assets/1558593511660.png)]

6.2.3.3. 查看提交日志

选中文件,右键菜单中,选中查看日志:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZdKLj1J3-1575802232688)(assets/1558593624516.png)]

提交的日志信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNxJ3UcG-1575802232689)(assets/1558593671411.png)]

6.2.3.4. 版本回退

现在我们再次修改readme.txt,并且提交

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUZB1rp3-1575802232690)(assets/1558593776850.png)]

查看日志:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-reHFYZYL-1575802232690)(assets/1558593861257.png)]

假如我们要回到上一个版本,也就是第2次提交。

我们选中第2次提交,然后右键,选中:重置"master"到这个版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t0R2nb34-1575802232691)(assets/1558593932166.png)]

弹出菜单,这里选中Hard模式,然后确定:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K9Hw3vPj-1575802232691)(assets/1558594000175.png)]

再次查看日志,只剩下第1和第2次提交了。并且HEAD已经设置到了第2次提交位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Te5ABg7-1575802232692)(assets/1558594037600.png)]

文件也回滚了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VldYzCyx-1575802232692)(assets/1558594058092.png)]

如果我现在后悔了,想再次回到第3次提交怎么办?现在连日志都没有了!

此时,在空白处点击右键,选中 显示引用记录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qLBUFOHa-1575802232693)(assets/1558594171414.png)]

弹出所有操作的日志信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vB32bYnC-1575802232694)(assets/1558594122860.png)]

现在,我们找到第3次提交,右键,选中:重置“master”到这个版本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZdQIkRo-1575802232694)(assets/1558594279737.png)]

结果,第3次提交又回来了!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHin4en1-1575802232695)(assets/1558594354271.png)]

文件内容回来了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9jnwoyW-1575802232695)(assets/1558594375878.png)]

6.2.3.5. 撤销修改

我们现在修改文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1o6WKMsb-1575802232696)(assets/1558594582640.png)]

现在后悔了,想要还原到修改以前。

我们可以选中文件,右键。然后选中菜单:还原。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JxPE3JKz-1575802232696)(assets/1558594635822.png)]

点击确定:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9BFzc8Df-1575802232697)(assets/1558594674808.png)]

还原成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05YUkgfz-1575802232697)(assets/1558594689322.png)]

查看文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-php8tOTp-1575802232698)(assets/1558594708387.png)]

6.3. 访问远程仓库

我们创建一个新的仓库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-27ZdiSqF-1575802232698)(assets/1558595967463.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfNUsSjk-1575802232699)(assets/1560762961269.png)]

6.3.1. 设置访问账号

由于安装时,我们并没有设定SSH信息,因此默认tortoise默认使用的ssh工具是“PuTTY”。

然而,git Bash使用的ssh工具是“openSSH”,如果想让TortoiseGit也使用刚才生成的密钥可以做如下配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nRCZAfp8-1575802232699)(assets/1558596062590.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pu6ee2hl-1575802232700)(assets/1560763262212.png)]

6.3.2. 关联远程仓库****

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AklnarQL-1575802232700)(assets/1560763387936.png)]

这里的四个选项:

1) 远端仓库名称,一般叫origin

2) URL:远程仓库地址 http://192.168.154.133:3000/fangqyou/tortoiseGit.git

3) 推送URL:同上 http://192.168.154.133:3000/fangqyou/tortoiseGit.git(可选)

4) Putty密钥:http协议无需设置

6.3.3. 推送本地仓库

在空白处点右键,选择 “Git****同步”:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HgpI4A8g-1575802232701)(assets/1558596608852.png)]

弹出菜单中,选择将master推送到远程仓库的master:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fuaXa2v6-1575802232701)(assets/1558596677373.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LzhSPNvX-1575802232702)(assets/1558596701389.png)]

成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uTRTSil0-1575802232702)(assets/1558596810775.png)]

私服中也显示了最新的信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CjJUb2Iq-1575802232703)(assets/1560763555015.png)]

6.3.4. 从远程仓库拉取

现在,我们先在远程仓库修改数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N00VsY9C-1575802232703)(assets/1558597278350.png)]

然后在本地的tortise文件夹点击右键,菜单中选择:拉取:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ithJ2s6u-1575802232704)(assets/1558597346960.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bq1UDeYe-1575802232704)(assets/1558597435678.png)]

成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jrVLbazC-1575802232705)(assets/1558597470140.png)]

查看文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xPRzftCC-1575802232705)(assets/1558597489064.png)]

6.4. 分支管理

6.4.1. 创建分支

在文件夹的空白处点击右键。选择创建分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IC7g3ps-1575802232706)(assets/1558597622729.png)]

填写分支名称和说明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeJEIooW-1575802232706)(assets/1558597690233.png)]

查看日志,发现已经有了dev分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-If2Ywalh-1575802232707)(assets/1558597738791.png)]

6.4.2. 切换分支

在空白处选择右键,菜单中选择: 切换/检出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B29ObTWx-1575802232707)(assets/1558597849271.png)]

选择要切换的分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ZX7sXEr-1575802232708)(assets/1558597901027.png)]

在dev分支中。修改readme文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-682r93AA-1575802232708)(assets/1558597931112.png)]

提交修改。

然后切换到master:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xtS6vENc-1575802232709)(assets/1558597995284.png)]

查看文件内容,发现并没有变化,因为刚才的修改是在dev完成的。master没有影响。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vGA43qU5-1575802232709)(assets/1558598031380.png)]

6.4.3. 合并分支

空白处点击右键,选择合并菜单

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPulfN7V-1575802232710)(assets/1558598105831.png)]

选择将dev合并当当前分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2GvTXl6-1575802232710)(assets/1558598187615.png)]

成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mraaeKqj-1575802232711)(assets/1558598210526.png)]

查看内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v77cxAUQ-1575802232711)(assets/1558598227450.png)]

6.4.4. 解决冲突

切换到dev,然后进行修改

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTcbpJDR-1575802232712)(assets/1558598499689.png)]

提交数据。

切换到master,修改readme:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0znFA0OC-1575802232712)(assets/1558598467861.png)]

然后提交修改

尝试用master合并dev:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0XAziGFB-1575802232712)(assets/1558598445329.png)]

结果失败了,因为有冲突:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ppZqELcm-1575802232713)(assets/1558598421774.png)]

查看文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9UtdI7k8-1575802232714)(assets/1558598526396.png)]

手动解决:根据需求去处理。这里我们假设两者都保留:

标记为解决:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mgYKXH2j-1575802232714)(assets/1558598595408.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfTUDpFE-1575802232715)(assets/1558598627526.png)]

解决完成,直接提交:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ERIrx36r-1575802232715)(assets/1558598656837.png)]

提示信息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OFY2ju3g-1575802232715)(assets/1558598754627.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKqQwqbD-1575802232716)(assets/1558598801874.png)]

提交成功!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n4kF1Dc3-1575802232716)(assets/1558598830205.png)]

查看日志:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EwQofY3z-1575802232717)(assets/1558598873830.png)]

7. 将Java工程加入到版本库(了解)

现在,我们有一个准备好的maven项目,一个用户管理系统:itheima_ssm

我们要吧这个项目交给git去管理。

7.1. 初始化本地仓库

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-in5N6oiQ-1575802232717)(assets/1558599835152.png)]

7.2. 忽略文件和目录

将不需要管理的文件和目录忽略,maven项目中需要提交的只有src和pom.xml,其它文件和目录都应该忽略:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mCzittsS-1575802232718)(assets/1558599942555.png)]

选择递归忽略:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oulIymqH-1575802232718)(assets/1558599979839.png)]

同样的方式处理target目录等其他需要忽略的文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zRmUcJ1j-1575802232718)(assets/1558600074099.png)]

大家会注意到,在本地仓库目录,多出了一个.gitignore文件,这里面就定义了所有的过略规则:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nGM6lyTm-1575802232719)(assets/1558600126515.png)]

7.3. 所有文件添加到暂存区

方式1:使用git bash 。 敲击命令: git add . 就会把当前目录所有文件加入暂存区

方式2:使用tortoise:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fd6K19oA-1575802232719)(assets/1558600281196.png)]

你会发现,待添加的文件,只有src目录下的和pom.xml,当然还有那个.gitignore文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7iuVb71o-1575802232719)(assets/1558600349623.png)]

成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZ9BjCYc-1575802232720)(assets/1558600372729.png)]

7.4. 提交

然后提交即可:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVgGziH8-1575802232720)(assets/1558600448246.png)]

成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJNFU6Lh-1575802232720)(assets/1558600469767.png)]

有必要的话,推送到远程

8. Idea客户端

8.1 在Idea中配置Git

打开File菜单:

在File --> Setting->Version Control --> Git -->Path to Git executable选择你的git安装后的git.exe文件

打开Setting:

方式一:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1AGjYXru-1575802232721)(assets/1558600705697.png)]

方式二:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQrBKTap-1575802232721)(assets/1558600784622.png)]

配置本地安装的Git的git.ext文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVvKsAsU-1575802232722)(assets/1558600996379.png)]

然后点击Test,测试是否设置成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KHe8y4yv-1575802232722)(assets/1558601030841.png)]

8.2. 创建工程

我们新建一个maven工程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxPa53vg-1575802232722)(assets/1558601130934.png)]

编写简单的代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QY74H8nq-1575802232723)(assets/1558601259339.png)]

8.3. 将项目创建为本地仓库

打开VCS菜单

VCS --> Import into Version Control --> Create Git Repository

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wdIOfV7M-1575802232723)(assets/1558601386492.png)]

在弹框中选中项目所在的位置,点击OK

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4TyCxLXS-1575802232723)(assets/1558601436747.png)]

此时项目文件全部变成棕色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHjwvsTe-1575802232724)(assets/1558601489537.png)]

项目Git版本已经创建成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7BOZZhh-1575802232724)(assets/1558601582216.png)]

8.4. 忽略文件

安装ignore插件,在file->settings->plugin搜索.ignore,点击Install,安装完成后就可以愉快的使用了,记得重启IDEA。

可以手动创建和修改.gitignore文件,也可以通过插件过滤。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yVjtVE7H-1575802232725)(assets/1560772974937.png)]

然后将需要忽略的文件右键添加到忽略文件中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dO6Eb6ID-1575802232725)(assets/1560773173265.png)]

.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。输入:
git rm -r --cached filePath
git commit -m “remove xx”

-r 是删除文件夹及其子目录 –cached 是删除暂存区里的文件而不删除工作区里的文件

8.5. 提交代码(重点)

8.5.1. 添加到暂存区

项目右键选择Git --> add

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6tZCt4TU-1575802232725)(assets/1558601700392.png)]

此时项目文件全部变成绿色,此时文件只是处于暂存区,并没有真正进入到版本库中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NW8L1k5t-1575802232726)(assets/1558601751484.png)]

8.5.2. 提交到本地仓库

项目右键Git–> Commit Directory

在弹窗中输入Commit Message,点击commit,此时项目文件从暂存区真正进入版本库中,项目文件变成黑色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xZGPg6xz-1575802232726)(assets/1558601862253.png)]

编辑本次提交备注信息,然后点击commit按钮。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gk0f8wrF-1575802232726)(assets/1558601933904.png)]

此时项目文件全部变成黑色

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEIAGkDP-1575802232727)(assets/1558602003501.png)]

8.6. 提交远程仓库(重点)

8.6.1. 新建一个远程仓库

在远程仓库创建新项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XxHAETLk-1575802232727)(assets/1558602562572.png)]

记录地址:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4QPuFd4p-1575802232727)(assets/1558602612810.png)]

8.6.2. 推送到远程仓库

右键选择项目—> Git ->Repository -> Push ,然后填写远程仓库地址。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z5kQ3XWT-1575802232728)(assets/1558602680165.png)]

复制远程仓库的地址,并填写:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ku783Jfp-1575802232728)(assets/1558602868174.png)]

点击Push, 推送成功, 在Idea右下角弹出提示框:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pzp89m2T-1575802232728)(assets/1558602958666.png)]

查看远程仓库,推送成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eO4hfzSd-1575802232729)(assets/1558604939194.png)]

8.6.3. 拉取数据

在远程仓库随意修改代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1y7zyMq5-1575802232729)(assets/1558606665811.png)]

在项目中,拉取代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWh7uL5s-1575802232729)(assets/1558606732594.png)]

点击Pull:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5XTMYt8V-1575802232730)(assets/1558606777250.png)]

代码成功同步:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFtCVvsG-1575802232730)(assets/1558606829506.png)]

8.7. 克隆项目(重点)

8.7.1. 删除本地项目

Settings->Version Control

1)断开idea与Git版本仓库的联接:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Ij2agV3-1575802232731)(assets/1558616310549.png)]

  1. 从Idea和本地文件目录中删除项目。

8.7.2. 克隆远程仓库并导入Idea

打开Idea,点击 Check out form Version Control,选中Git

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iOb4PgG-1575802232731)(assets/1558616620194.png)]

填入远程仓库SSH地址,输入你的远程仓库地址,点击Test,测试一下地址是否正确。

点击Clone

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cClMGCt5-1575802232731)(assets/1558616754907.png)]

点击YES:

Clone出远程仓储的工程,并且导入到idea中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8cLxyTS8-1575802232732)(assets/1558616869115.png)]

导入成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9okdLpNO-1575802232732)(assets/1558616978769.png)]

右键Git,可以与远程仓库进行push和pull代码操作了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-heAXoftK-1575802232732)(assets/1558617012330.png)]

8.8. 解决冲突(重点)

8.8.1. 制造冲突

1)我们创建新的分支dev,并且在dev修改提交代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnhOiJGS-1575802232733)(assets/1558617175235.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwPaZhUI-1575802232733)(assets/1558617214434.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-36nDxMWw-1575802232734)(assets/1558617251157.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-assK9NAs-1575802232734)(assets/1558617289540.png)]

2)然后在master修改提交代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iZqddXhu-1575802232734)(assets/1558617344414.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N68fBhxE-1575802232735)(assets/1558617366477.png)]

接下来尝试合并dev分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1dQ9Js88-1575802232735)(assets/1558617434755.png)]

选择要合并的分支:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fp35JqM7-1575802232735)(assets/1558617479442.png)]

发现合并失败,此时文件有红色标记

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sKCYjB2q-1575802232736)(assets/1558617554637.png)]

8.8.2. 解决冲突

点击Merge合并策略**

​ Accept Yours:保留你自己的代码,

​ Accept Theirs:保留别人的,

​ merge:人工合并 (人工把需要的代码复制粘贴到结果集result里面比较保险)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JY60OnDa-1575802232736)(assets/1558617859908.png)]

弹出一个对比页面

在Result中,手动合并完成后,点击Apply按钮,完成冲突代码合并。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItYcZ0kt-1575802232736)(assets/1558617657519.png)]

此时文件的红色标记没了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JyWp2BdN-1575802232739)(assets/1558617712569.png)]

但是有未提交的蓝色标记。然后提交,文件变为黑色。冲突被解决! [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jqfStD8-1575802232740)(assets/1558617775114.png)]

731)]

填入远程仓库SSH地址,输入你的远程仓库地址,点击Test,测试一下地址是否正确。

点击Clone

[外链图片转存中…(img-cClMGCt5-1575802232731)]

点击YES:

Clone出远程仓储的工程,并且导入到idea中。

[外链图片转存中…(img-8cLxyTS8-1575802232732)]

导入成功:

[外链图片转存中…(img-9okdLpNO-1575802232732)]

右键Git,可以与远程仓库进行push和pull代码操作了。

[外链图片转存中…(img-heAXoftK-1575802232732)]

8.8. 解决冲突(重点)

8.8.1. 制造冲突

1)我们创建新的分支dev,并且在dev修改提交代码。

[外链图片转存中…(img-SnhOiJGS-1575802232733)]

[外链图片转存中…(img-SwPaZhUI-1575802232733)]

[外链图片转存中…(img-36nDxMWw-1575802232734)]

[外链图片转存中…(img-assK9NAs-1575802232734)]

2)然后在master修改提交代码。

[外链图片转存中…(img-iZqddXhu-1575802232734)]

[外链图片转存中…(img-N68fBhxE-1575802232735)]

接下来尝试合并dev分支:

[外链图片转存中…(img-1dQ9Js88-1575802232735)]

选择要合并的分支:

[外链图片转存中…(img-fp35JqM7-1575802232735)]

发现合并失败,此时文件有红色标记

[外链图片转存中…(img-sKCYjB2q-1575802232736)]

8.8.2. 解决冲突

点击Merge合并策略**

​ Accept Yours:保留你自己的代码,

​ Accept Theirs:保留别人的,

​ merge:人工合并 (人工把需要的代码复制粘贴到结果集result里面比较保险)

[外链图片转存中…(img-JY60OnDa-1575802232736)]

弹出一个对比页面

在Result中,手动合并完成后,点击Apply按钮,完成冲突代码合并。

[外链图片转存中…(img-ItYcZ0kt-1575802232736)]

此时文件的红色标记没了

[外链图片转存中…(img-JyWp2BdN-1575802232739)]

但是有未提交的蓝色标记。然后提交,文件变为黑色。冲突被解决! [外链图片转存中…(img-7jqfStD8-1575802232740)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值