03【远程协作开发、TortoiseGit、IDEA绑定Git插件的使用】

上一篇02【Git分支的使用、Git回退、还原】

下一篇【已完结】

目录【Git系列教程-目录大纲】


文章目录

  • 一、远程协作开发
    • 1.1 远程仓库简介
      • 1.1.1 Github
      • 1.1.2 Gitee
      • 1.1.3 其他托管平台
    • 1.2 发布远程仓库
      • 1.2.1 创建项目
        • 1) 新建远程仓库
        • 2) 推送项目
      • 1.2.2 添加项目成员
    • 1.3 协同开发
      • 1.3.1 remote命令
      • 1.3.2 clone命令
      • 1.3.3 fetch命令
      • 1.3.4 pull命令
    • 1.4 远程跟踪分支
      • 1.4.1 远程分支
        • 1) 创建本地分支
        • 2) 创建远程分支
        • 3) 远程分支的拉取
      • 1.4.2 远程跟踪分支创建时机
        • 1) push
        • 2) clone
        • 3) fetch
        • 4) pull
    • 1.5 远程协作代码冲突
      • 1.5.1 分支合并代码冲突
        • 1) 快进合并冲突
        • 2) 典型合并冲突
      • 1.5.2 远程协作代码冲突
        • 1) 创建远程仓库
        • 2) clone项目
        • 3) 协同开发
        • 4) 模拟协同开发冲突
  • 二、TortoiseGit的使用
    • 2.1 TortoiseGit 的基本使用
      • 2.1.1 创建仓库
      • 2.1.2 添加
      • 2.1.3 提交
      • 2.1.4 对比
      • 2.1.5 查看状态
      • 2.1.6 改名
      • 2.1.6 删除
      • 2.1.7 日志
      • 2.1.7 还原
        • 1) 还原工作空间
        • 2) 还原提交对象
      • 2.1.8 回退
        • 1)回退HEAD指针
        • 2)回退HEAD指针、暂存区
        • 3)回退HEAD指针、暂存区、工作空间
      • 2.1.9 添加忽略
    • 2.2 TortiseGit操作分支
      • 2.2.1 创建分支
      • 2.2.2 切换分支
      • 2.2.3 合并分支
      • 2.2.3 分支合并冲突
      • 2.2.4 分支状态存储
        • 1) 使用存储
        • 2) 查看存储
        • 3) 读取存储
        • 4) 删除存储
    • 2.3 TortiseGit协同开发
      • 2.3.1 remote
      • 2.3.2 push
      • 2.2.3 clone
      • 2.3.4 fetch
      • 2.3.5 pull
      • 2.3.6 模拟协同开发冲突
  • 三、IDEA集成Git插件
    • 3.1 Git插件的基本使用
      • 3.1.1 提交项目
        • 1)绑定Git插件
        • 2)添加忽略文件
        • 3)提交项目
      • 3.1.2 比较
      • 3.1.3 还原
        • 1)还原工作空间
        • 2)还原提交对象
      • 3.1.4 回退
        • 1)回退HEAD指针
        • 2)回退HEAD、暂存区
        • 3)回退HEAD、暂存区、工作空间
    • 3.2 分支的操作
      • 3.2.1 创建分支
      • 3.2.2 切换分支
      • 3.3.2 合并分支
      • 3.3.3 合并分支解决冲突
      • 3.3.4 使用分支状态存储
    • 3.3 协同开发
      • 3.3.1 remote
      • 3.3.2 push
      • 3.3.3 clone
      • 3.3.4 fetch
      • 3.3.5 pull
      • 3.3.6 模拟协同开发
        • 1) push冲突
        • 2) pull冲突

一、远程协作开发

1.1 远程仓库简介

到目前为止,我们的项目都是基于本地开发,团队协作开发则需要将自己的代码发布到远程仓库,它是一个存储Git代码的远程服务器。同时我们也需要拉取远程仓库中其他团队成员开发的功能到本地;有了远程仓库,我们的项目才能算真正意义上的协同开发;

远程仓库是一个代码托管中心,市面上有非常多比较出名的代码托管中心,比如Github、Gitee等;这些远程仓库都是基于互联网的,只要接入了互联网就可以创建属于自己的远程仓库。另外,我们也可以搭建自身的远程仓库,这些远程仓库一般用于某些公司存储自身代码。

1.1.1 Github

Github:GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。GitHub拥有1亿以上的开发人员,400万以上组织机构和3.3亿以上资料库。GitHub 是全球最大的 Git 版本库托管商,是成千上万的开发者和项目能够合作进行的中心。 大部分 Git 版本库都托管在 GitHub,很多开源项目使用 GitHub 实现 Git 托管、问题追踪、代码审查以及其它事情。

Github官网:https://github.com/

1.1.2 Gitee

Gitee(码云)是开源中国于2013年推出的基于Git的代码托管平台、企业级研发效能平台,提供中国本土化的代码托管服务。Gitee 是国内最大的 Git 版本库托管商

由于Github在国外受网络限制等原因,我们后续的远程仓库均采用Gitee作为托管平台。

Gitee官网:https://gitee.com/

1.1.3 其他托管平台

由于Github、Gitee等平台面向于互联网用于,虽说这些网站可以对仓库本身有很好的权限控制,但总归不如在自己公司内部搭建代码托管服务来得安心,因此还是有很多互联网公司会在公司内网大家属于自己公司的代码托管平台;

  • gogs:Gogs 是一款极易搭建的自助 Git 服务。Gogs 的目标是打造一个最简单、最快速和最轻松的方式搭建自助 Git 服务。

官网:https://gogs.io

  • gitlab:GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。Gitlab是被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建

官网:https://gitlab.cn/

1.2 发布远程仓库

等到本地代码提交成功后就应该推送(push)到远程仓库供团队其他成员拉取(pull)。同样的,其他成员代码编写完毕后也应该推送到远程仓库,我们也可以从远程仓库中拉取其他成员的代码到本地进行合并,这样一个完整的功能就集成到项目中了。

1.2.1 创建项目

远程仓库就是代码托管中心的仓库,我们本次采用Gitee作为代码托管中心;注册Gitee账号,创建一个新的仓库:

1) 新建远程仓库
  • 1)新建远程仓库:

  • 2)填写仓库资料:

  • 3)创建成功:

2) 推送项目
  • 1)首先初始化一个本地项目:
rm -rf .git ./*		
git init			
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./
echo "222" >> aaa.txt
git commit -m "222" ./
echo "333" >> aaa.txt
git commit -m "333" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)		# 产生三个版本
$ git log --oneline
e5fec93 (HEAD -> master) 333
8b6f1a7 222
1bbbf3b 111
  • 2)推送到远程仓库:
git push https://gitee.com/lvshuichangliu/test01.git master

推送成功:

刷新Gitee页面:

填写完毕用户信息后,我们的信息被记录到Windows凭据中,查看推送就不需要再次添加用户名和密码了

有的人的电脑在推送之后,windows凭据中并不会保存用户信息,再次推送仍然需要填写用户信息,我们可以通过配置Git的方式来强制保存凭证:

# 永久保存凭证(后续执行push/pull/clone等指令不需要再重新输入用户名和密码了)
git config --global credential.helper store# 清除凭证
git config --global --unset credential.helper

有了windows凭证之后,再次推送就不需要输入用户信息了:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ echo "444" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git commit -m "444" ./
warning: LF will be replaced by CRLF in aaa.txt.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in aaa.txt.
The file will have its original line endings in your working directory
[master c771aae] 4441 file changed, 1 insertion(+)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git push https://gitee.com/lvshuichangliu/test01.git master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 246 bytes | 246.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
To https://gitee.com/lvshuichangliu/test01.gite5fec93..c771aae  master -> master

1.2.2 添加项目成员

默认情况下创建好的项目只允许创建人对项目进行编辑其他人均不可对项目进行操作,因此我们需要添加项目成员,来允许其他人操作该项目;

  • 1)在项目管理中添加开发者:

  • 2)登录开发者账号,加入:

1.3 协同开发

1.3.1 remote命令

我们之前使用push指令推送本地项目到远程仓库;我们需要知道远程仓库的地址才可以推送,而远程仓库的地址太长不易记忆;

remote命令则可以帮助我们为远程仓库的地址添加别名。

  • 语法:
# 查看所有别名
git remote -v # 为一个远程仓库起一个别名
git remote add {remote-name} {url}	# 查看指定的远程仓库的详细信息
git remote show {remote-name | url}# 重命名别名
git remote rename {old-remote-name} {new-remote-name} # 删除别名
git remote rm {remote-name}

【代码示例】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)			# 添加别名
$ git remote add test01 https://gitee.com/lvshuichangliu/test01.gitAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)			# 查看别名列表,remote指令会为仓库添加两个别名
$ git remote -v
test01  https://gitee.com/lvshuichangliu/test01.git (fetch)		# 用于fetch操作
test01  https://gitee.com/lvshuichangliu/test01.git (push)		# 用于push操作Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)			# 查看仓库信息
$ git remote show test01
* remote test01Fetch URL: https://gitee.com/lvshuichangliu/test01.gitPush  URL: https://gitee.com/lvshuichangliu/test01.gitHEAD branch: masterRemote branch:master new (next fetch will store in remotes/test01)Local ref configured for 'git push':master pushes to master (up to date)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)			# 重命名仓库
$ git remote rename test01 test01ProjectAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)			# 查看别名列表
$ git remote -v
test01Project   https://gitee.com/lvshuichangliu/test01.git (fetch)
test01Project   https://gitee.com/lvshuichangliu/test01.git (push)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)			# 删除别名
$ git remote rm test01ProjectAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace (master)
$ git remote -v

1.3.2 clone命令

git clone顾名思义就是将远程仓库克隆到本地,包括被clone仓库的版本变化。此时本地无需执行git init,等待git clone执行完毕会自动生成.git文件夹。因为是clone来的,所以.git文件夹里存放着与远程仓库一模一样的版本库记录。

  • 语法:
# 克隆远程仓库到本地
git clone {url}# 默认情况下克隆到本地的项目名称和远程库一样,如果想要自己指定名称可以在后面指定项目的名称
git clone {url} {projectName}

使用clone命令将远程仓库的项目克隆到本地之后,会将项目取个默认的别名,为origin,同时创建远程分支对应的远程跟踪分支;

Tips:关于远程跟踪分支我们后面再详细介绍;

【代码示例】

rm -rf .git ./*		# 删除本地仓库Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui			# 克隆项目
$ git clone https://gitee.com/lvshuichangliu/test01.git
Cloning into 'test01'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (12/12), done.Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui			# 进入项目
$ cd test01/Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看项目别名
$ git remote -v
origin  https://gitee.com/lvshuichangliu/test01.git (fetch)
origin  https://gitee.com/lvshuichangliu/test01.git (push)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline
c771aae (HEAD -> master, origin/master, origin/HEAD) 444						# 创建了两个远程跟踪分支,origin/master就是master对应的远程跟踪分支
e5fec93 333
8b6f1a7 222
1bbbf3b 111

1.3.3 fetch命令

fetch指令用于获取远程库的代码,默认情况下,获取的最新代码在本地分支对应的远程跟踪分支上,并不在当前的分支。因此我们一般在使用完fetch命令后,还要将本地分支与远程跟踪分支进行合并,这样才能确保代码能够更新到本地仓库;

  • 语法:
# 拉取远程仓库的代码到本地的远程跟踪分支# branchName: 本地分支名称# remoteBranchName: 远程分支名称
git fetch { url | remoteName } [branchName[:remoteBranchName]]# 拉取远程仓库的代码到本地的远程跟踪分支(本地分支和远程分支名称一致的情况)
git fetch { url | remoteName } [branchName]# 拉取远程仓库的代码到本地的远程跟踪分支(操作的分支是master的情况下)
git fetch { url | remoteName }

【代码示例】

在一个新的目录(xiaolan)从新拉取一份代码到本地:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan
$ git clone https://gitee.com/lvshuichangliu/test01.gitAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan	# 进入项目
$ cd test01/Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)		# 查看别名
$ git remote -v
origin  https://gitee.com/lvshuichangliu/test01.git (fetch)
origin  https://gitee.com/lvshuichangliu/test01.git (push)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)		# 查看日志
$ git log --oneline
c771aae (HEAD -> master, origin/master, origin/HEAD) 444	
e5fec93 333
8b6f1a7 222
1bbbf3b 111

【在xiaolan工作空间编辑代码,提交、推送】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)			# 编辑文件
$ echo "555" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)			# 提交到本地库
$ git commit -m "555" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)			# 推送master分支到远程仓库
$ git push origin master

【在xiaohui工作空间使用fetch命令拉取代码】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
c771aae (HEAD -> master, origin/master, origin/HEAD) 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ cat aaa.txt
111
222
333
444Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 使用fetch拉取远程仓库的代码
$ git fetch originAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
48ae5b2 (origin/master, origin/HEAD) 555				# 最新代码被拉取到origin/master分支上了
c771aae (HEAD -> master) 444							# master分支还在原地
e5fec93 333
8b6f1a7 222
1bbbf3b 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看当前分支(master)的工作空间,发现代码并没有被合并到master分支
$ cat aaa.txt
111
222
333
444Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 合并origin/master分支
$ git merge origin/master
Updating c771aae..48ae5b2
Fast-forwardaaa.txt | 1 +1 file changed, 1 insertion(+)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看日志
$ git log --oneline --all
48ae5b2 (HEAD -> master, origin/master, origin/HEAD) 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看工作空间代码
$ cat aaa.txt
111
222
333
444
555

1.3.4 pull命令

pull也是用于获取远程仓库的代码,与fetch命令不同的是,pull命令拉取远程仓库的最新代码到本地后,然后再与本地分支进行merge(合并),这样就不需要我们人为的进行合并了;

  • 语法:
# 拉取代码到本地分支并将本地分支与远程跟踪分支合并# branchName: 本地分支的名称# remoteBranchName: 远程分支的名称
git pull { url | project-name} [branchName[:remoteBranchName]]# 拉取代码到本地分支并将本地分支与远程跟踪分支合并(本地分支和远程分支名称一致的情况)
git pull { url | project-name} [branchName]# 拉取代码到本地分支并将本地分支与远程跟踪分支合并(操作的分支是master的情况下)
git pull { url | project-name}

【在xiaolan工作空间编辑代码,提交、推送】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)			# 编辑文件
$ echo "666" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)			# 提交到本地库
$ git commit -m "666" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test01 (master)			# 推送master分支到远程仓库
$ git push origin master

【在xiaohui工作空间使用pull命令拉取代码】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
48ae5b2 (HEAD -> master, origin/master, origin/HEAD) 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ cat aaa.txt
111
222
333
444
555Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)			# 使用pull来取代码
$ git pull originAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)			# master分支与origin/master分支已经合并
$ git log --oneline --all
f67c377 (HEAD -> master, origin/master, origin/HEAD) 666
48ae5b2 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ cat aaa.txt
111
222
333
444
555
666

1.4 远程跟踪分支

1.4.1 远程分支

在Git中,存在三种分支,分别为本地分支、远程分支、远程跟踪分支;

1) 创建本地分支

本地分支:存在与本地工作空间的分支,每一个Git仓库都会存在一个master分支,该master分支就是本地分支;我们也可以通过git branch命令来创建本地分支;

【示例代码】

在一个新的工作空间(test)测试:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/test
$ git init # 初始化仓库
Initialized empty Git repository in C:/Users/Admin/Desktop/workspace/test/.git/Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/test (master)
$ echo "111" >> a.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/test (master)
$ git add ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/test (master)
$ git commit -m "111" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/test (master)
$ git log --oneline --all
5aec3e0 (HEAD -> master) 111		# 每个Git仓库都会有一个master本地分支Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/test (master)			# 创建一个本地分支
$ git branch b1Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/test (master)
$ git log --oneline --all
5aec3e0 (HEAD -> master, b1) 111
2) 创建远程分支

存在于远程仓库的分支,我们可以将本地的分支提交到远程仓库中,这样就变成了远程分支;

【在xiaohui工作空间创建一个本地分支,然后推送到远程仓库】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
f67c377 (HEAD -> master, origin/master, origin/HEAD) 666
48ae5b2 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 创建b1分支
$ git branch b1Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
f67c377 (HEAD -> master, origin/master, origin/HEAD, b1) 666
48ae5b2 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看项目名
$ git remote -v
origin  https://gitee.com/lvshuichangliu/test01.git (fetch)
origin  https://gitee.com/lvshuichangliu/test01.git (push)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 推送b1分支到远程仓库
$ git push origin b1
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
remote: Create a pull request for 'b1' on Gitee by visiting:
remote:     https://gitee.com/lvshuichangliu/test01/pull/new/lvshuichangliu:b1...lvshuichangliu:master
To https://gitee.com/lvshuichangliu/test01.git* [new branch]      b1 -> b1Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline
f67c377 (HEAD -> master, origin/master, origin/b1, origin/HEAD, b1) 666		# 推送完成之后创建了b1的远程跟踪分支
48ae5b2 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111

打开远程仓库,查看分支:

3) 远程分支的拉取

当本地分支被提交到远程仓库后,就会建立远程分支,需要注意的时,我们在clone项目时,远程分支并不会被克隆下来,被克隆下来的只有远程分支对应的远程跟踪分支;

在一个新的工作空间(xiaolv)使用克隆远程仓库:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolv
$ git clone https://gitee.com/lvshuichangliu/test01.git
Cloning into 'test01'...
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 18 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (18/18), done.Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolv
$ cd test01/Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolv/test01 (master)
$ git log --oneline --all
f67c377 (HEAD -> master, origin/master, origin/b1, origin/HEAD) 666		# 拉取到本地的只有远程跟踪分支
48ae5b2 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111

虽然clone时远程分支并不会被clone到本地,但是我们可以根据远程跟踪分支来创建本地分支

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolv/test01 (master)		# 在当前位置创建b1分支
$ git branch b1Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolv/test01 (master)		# 查看日志
$ git log --oneline --all
f67c377 (HEAD -> master, origin/master, origin/b1, origin/HEAD, b1) 666
48ae5b2 555
c771aae 444
e5fec93 333
8b6f1a7 222
1bbbf3b 111

1.4.2 远程跟踪分支创建时机

远程跟踪分支作为本地分支与远程分支中的媒介,记录的是上次连接到远程仓库时,远程分支所处的状态。远程跟踪分支的作用是告诉用户其所跟踪的远程分支的状态(即指向哪一个commit),因而它在本地是只读的,用户是无法自行修改它的指向

远程跟踪分支以"远程仓库名/分支名"命名;

远程分支的创建时机有:

  • push:当执行push操作后,会将本地分支提交到远程仓库中并创建远程分支,与此同时会创建远程分支对应的远程跟踪分支;
  • clone:当执行clone操作后,远程分支并不会被拉取到本地,但本地会创建其他分支对应的远程跟踪分支;
  • fetch:当执行fetch操作拉取指定远程分支代码到本地时,会在本地创建该远程分支对应的远程跟踪分支;远程分支的代码就被拉取到这个远程跟踪分支上,我们通常需要使用当前分支来合并远程跟踪分支来更新工作空间。
  • pull:当执行pull操作拉取指定远程分支代码到本地时,会在本地创建该远程分支对应的远程跟踪分支;然后将当前分支与远程跟踪分支合并。

【准备本地项目环境】

在xiaolan工作空间创建本地项目:

rm -rf .git ./*		
git init			
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./
echo "222" >> aaa.txt
git commit -m "222" ./
echo "333" >> aaa.txt
git commit -m "333" ./
git branch b1Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 产生3个版本
$ git log --oneline --all
7225a2f (HEAD -> master, b1) 333
37a2682 222
3106882 111

创建远程仓库test02:

添加项目别名:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git remote add test02 https://gitee.com/lvshuichangliu/test02.gitAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git remote -v
test02  https://gitee.com/lvshuichangliu/test02.git (fetch)
test02  https://gitee.com/lvshuichangliu/test02.git (push)
1) push

当执行push操作后,会将本地分支提交到远程仓库中并创建远程分支,与此同时会创建远程分支对应的远程跟踪分支;

【将本地项目推送到远程仓库】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 将项目推送到远程仓库
$ git push test02 masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看日志
$ git log --oneline --all
7225a2f (HEAD -> master, test02/master, b1) 333		# 创建了master分支对应的远程跟踪分支(test02/master)
37a2682 222
3106882 111

【查看远程分支】

【再次推送b1分支到远程仓库】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 推送b1分支到远程仓库
$ git push test02 b1Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		
$ git log --oneline --all
7225a2f (HEAD -> master, test02/master, test02/b1, b1) 333		# 创建了b1分支对应的远程跟踪分支(test02/b1)
37a2682 222
3106882 111

【查看远程分支】

2) clone

当执行clone操作后,远程分支并不会被拉取到本地,但本地会创建其他分支对应的远程跟踪分支;

【创建一个新的工作空间xiaolan,使用clone克隆远程仓库到本地】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan						# 克隆项目
$ git clone https://gitee.com/lvshuichangliu/test02.gitAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan						# 进入项目
$ cd test02/Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (master)		# 查看项目别名
$ git remote -v
origin  https://gitee.com/lvshuichangliu/test02.git (fetch)
origin  https://gitee.com/lvshuichangliu/test02.git (push)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (master)		# 查看日志
$ git log --oneline
7225a2f (HEAD -> master, origin/master, origin/b1, origin/HEAD) 333		# 远程分支对应的远程跟踪分支被拉取下来了
37a2682 222
3106882 111
3) fetch

当执行fetch操作拉取指定远程分支代码到本地时,会在本地创建该远程分支对应的远程跟踪分支;远程分支的代码就被拉取到这个远程跟踪分支上,我们通常需要使用当前分支来合并远程跟踪分支来更新工作空间。

【先使用xiaohui工作空间创建一个新分支b2,然后再推送到远程仓库】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 创建b2分支
$ git branch b2Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 切换到b2分支
$ git checkout b2
Switched to branch 'b2'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b2)
$ echo "444-b2" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b2)
$ git commit -m "444-b2" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b2)			# 推送b2分支到远程仓库
$ git push test02 b2Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b2)		
$ git log --oneline --all
b8374b1 (HEAD -> b2, test02/b2) 444-b2					# 在本地创建了b2分支对应的远程跟踪分支
7225a2f (test02/master, test02/b1, master) 333
37a2682 222
3106882 111

【到xiaolan工作空间,使用fetch拉取远程仓库代码到本地】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (master)
$ git log --oneline --all
7225a2f (HEAD -> master, origin/master, origin/b1, origin/HEAD, b1) 333
37a2682 222
3106882 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (master)
$ git fetch origin b2Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (master)
$ git log --oneline --all
b8374b1 (origin/b2) 444-b2													# 创建了b2分支的远程跟踪分支
7225a2f (HEAD -> master, origin/master, origin/b1, origin/HEAD, b1) 333		# HEAD指针指向的是这里
37a2682 222
3106882 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (master)		# 在当前位置创建b2分支
$ git branch b2Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (master)		# 切换到b2分支
$ git checkout b2
Switched to branch 'b2'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (b2)
$ git log --oneline --all
b8374b1 (origin/b2) 444-b2
7225a2f (HEAD -> b2, origin/master, origin/b1, origin/HEAD, master, b1) 333				# HEAD指针指向了b2分支
37a2682 222
3106882 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (b2)			# 合并远程跟踪分支
$ git merge origin/b2
Updating 7225a2f..b8374b1
Fast-forwardaaa.txt | 1 +1 file changed, 1 insertion(+)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (b2)
$ git log --oneline --all
b8374b1 (HEAD -> b2, origin/b2) 444-b2
7225a2f (origin/master, origin/b1, origin/HEAD, master, b1) 333
37a2682 222
3106882 111
4) pull

当执行pull操作拉取指定远程分支代码到本地时,会在本地创建该远程分支对应的远程跟踪分支;然后将当前分支与远程跟踪分支合并。

【使用xiaohui工作空间创建新分支b3,然后再推送到远程仓库】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b2)		# 查看日志
$ git log --oneline --all
b8374b1 (HEAD -> b2, test02/b2) 444-b2				# HEAD指针指向这里
7225a2f (test02/master, test02/b1, master) 333
37a2682 222
3106882 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b2)		# 在当前HEAD指针指向的位置创建b3分支
$ git branch b3Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b2)
$ git checkout b3
Switched to branch 'b3'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b3)
$ echo "555-n3" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b3)
$ git commit -m "555-b3" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b3)		# 推送到远程仓库
$ git push test02 b3Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b3)
$ git log --oneline --all
31b62a6 (HEAD -> b3, test02/b3) 555-b3						# 创建了b3分支对应的远程跟踪分支
b8374b1 (test02/b2, b2) 444-b2
7225a2f (test02/master, test02/b1, master) 333
37a2682 222
3106882 111

查看远程分支b3:

【到xiaolan工作空间,使用pull拉取远程仓库代码到本地】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (b2)	
$ git log --oneline --all					# 当前HEAD指针的位置
b8374b1 (HEAD -> b2, origin/b2) 444-b2
7225a2f (origin/master, origin/b1, origin/HEAD, master, b1) 333
37a2682 222
3106882 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (b2)		# 拉取b3远程分支到本地
$ git pull origin b3Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test02 (b2)		
$ git log --oneline --all
31b62a6 (HEAD -> b2, origin/b3) 555-b3			# 创建了b3的远程跟踪分支(origin/b3),并且当前分支(b2)与origin/b3分支合并了
b8374b1 (origin/b2) 444-b2
7225a2f (origin/master, origin/b1, origin/HEAD, master, b1) 333
37a2682 222
3106882 111

1.5 远程协作代码冲突

在Git中,代码冲突分为协同开发时的代码冲突分支合并时的代码冲突两大类;

  • 其关系如图所示:

1.5.1 分支合并代码冲突

其中分支合并代码冲突又分为快进合并与典型合并;

另外需要注意的是:Git判断代码是否冲突的逻辑并非指的是两个分支/两个用户是否操作同一行,而是只要有两个分支/两个用户操作的文件内容不一样,不管是否是同一行都会造成代码冲突。

1) 快进合并冲突

快进合并指的是前面的版本需要合并后面的版本;但需要注意的是==前面的版本并非是"旧版本",后面的版本并非是"新版本"==,这主要取决于是否是同轴开发。对于同轴开发,后面的版本自然是新版本,其内容肯定包含前面版本的内容。但对于非同轴开发,后面的版本内容大概率是不包含前面的版本内容的;

快进合并存在同轴开发与非同轴开发的快进合并,对于同轴开发来说,快进合并不会造成代码冲突,

master分支test分支
创建abc.txt
内容为:
111
222
执行add
执行commit
创建分支 – 此时test分支的abc.txt的内容也是111、222
修改内容为:
111aaa
222
执行commit
切换到test分支
修改内容为:
111
222bbb
执行commit – 此时test分支和master分支已经不同轴了
切换回master分支,合并test分支,属于快进合并,但会出现冲突

上面案例属于很常见的==非同轴开发的快进合并==。前面的版本合并后面的版本,虽然两个分支操作的文件内容不是同一行,但依旧会出现冲突;

【初始化项目】

rm -rf ./* .git
git init
echo "111" >> aaa.txt
echo "222" >> aaa.txt
git add ./
git commit -m "111 222" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
d0a757e (HEAD -> master) 111 222

【创建test分支】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git branch testAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
d0a757e (HEAD -> master, test) 111 222

【使用master分支继续开发】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ cat aaa.txt
111aaa
222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "aaa" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
58c48b6 (HEAD -> master) aaa
d0a757e (test) 111 222

【切换到test分支,使用test分支开发。此时master分支与test分支不同轴】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git checkout test
Switched to branch 'test'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git commit -m "bbb" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)		# 不同轴
$ git log --oneline --all --graph
* 52527cf (HEAD -> test) bbb
| * 58c48b6 (master) aaa
|/
* d0a757e 111 222

【切换到master分支合并test分支的内容,属于不同轴的快进合并,出现代码冲突】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git checkout master
Switched to branch 'master'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all --graph
* 52527cf (test) bbb
| * 58c48b6 (HEAD -> master) aaa
|/
* d0a757e 111 222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git merge test
Auto-merging aaa.txt
CONFLICT (content): Merge conflict in aaa.txt
Automatic merge failed; fix conflicts and then commit the result.Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master|MERGING)
$ cat aaa.txt
<<<<<<< HEAD
111aaa
222
=======
111
222bbb
>>>>>>> testAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master|MERGING)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master|MERGING)
$ cat aaa.txt
111aaa
222bbbAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master|MERGING)
$ git commit -a -m "master合并test分支,并解决冲突"
[master 5c341f6] master合并test分支,并解决冲突Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all --graph
*   5c341f6 (HEAD -> master) master合并test分支,并解决冲突
|\
| * 52527cf (test) bbb
* | 58c48b6 aaa
|/
* d0a757e 111 222

【切换回test分支,合并master分支,此时并不会出现代码冲突】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git checkout test
Switched to branch 'test'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git log --oneline --all --graph
*   5c341f6 (master) master合并test分支,并解决冲突
|\
| * 52527cf (HEAD -> test) bbb
* | 58c48b6 aaa
|/
* d0a757e 111 222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git merge master
Updating 52527cf..5c341f6
Fast-forwardaaa.txt | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git log --oneline --all --graph
*   5c341f6 (HEAD -> test, master) master合并test分支,并解决冲突
|\
| * 52527cf bbb
* | 58c48b6 aaa
|/
* d0a757e 111 222
2) 典型合并冲突

典型合并只存在于非同轴开发的情况,并且是后面的版本要合并前面的版本;

在非同轴开发的情况下,后面版本的内容未必包含前面版本的内容,两个文件大概率是不一样的,因此典型合并一般情况下都会出现冲突;

master分支test分支
创建abc.txt
内容为:
111
222
执行add
执行commit
创建分支 – 此时test分支的abc.txt的内容也是111、222
修改内容为:
111aaa
222
执行commit
切换到test分支
修改内容为:
111
222bbb
执行commit – 此时test分支和master分支已经不同轴了
合并master分支,属于典型合并,会出现冲突

上面案例属于很常见的==典型合并时的代码冲突==,属于后面的版本合并前面的版本。

【项目初始化】

rm -rf ./* .git
git init
echo "111" >> aaa.txt
echo "222" >> aaa.txt
git add ./
git commit -m "111 222" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all --graph
* e8e0f3a (HEAD -> master) 111 222

【创建test分支】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git branch testAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all --graph
* e8e0f3a (HEAD -> master, test) 111 222

【使用master分支继续开发】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ cat aaa.txt
111aaa
222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "aaa" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all --graph
* ed86aca (HEAD -> master) aaa
* e8e0f3a (test) 111 222

【切换到test分支,继续开发。此时master与test分支不同轴】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git checkout test
Switched to branch 'test'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git log --oneline --all --graph
* ed86aca (master) aaa
* e8e0f3a (HEAD -> test) 111 222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git commit -m "bbb" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git log --oneline --all --graph
* 908668e (HEAD -> test) bbb
| * ed86aca (master) aaa
|/
* e8e0f3a 111 222

【使用test分支合并master分支,出现代码冲突】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git merge master
Auto-merging aaa.txt
CONFLICT (content): Merge conflict in aaa.txt
Automatic merge failed; fix conflicts and then commit the result.Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test|MERGING)
$ cat aaa.txt
<<<<<<< HEAD
111
222bbb
=======
111aaa
222
>>>>>>> masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test|MERGING)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test|MERGING)
$ cat aaa.txt
111aaa
222bbbAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test|MERGING)
$ git commit -a -m "test分支合并master分支,并解决冲突"
[test 3cbf22b] test分支合并master分支,并解决冲突Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git log --oneline --all --graph
*   3cbf22b (HEAD -> test) test分支合并master分支,并解决冲突
|\
| * ed86aca (master) aaa
* | 908668e bbb
|/
* e8e0f3a 111 222

【切换回master分支合并test分支,此时并不会出现代码冲突】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (test)
$ git checkout master
Switched to branch 'master'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git merge testAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all --graph
*   3cbf22b (HEAD -> master, test) test分支合并master分支,并解决冲突
|\
| * ed86aca aaa
* | 908668e bbb
|/
* e8e0f3a 111 222

1.5.2 远程协作代码冲突

我们在执行push指令之前应该确保当前工作空间分支处于最新状态,因此执行push指令之前我们都会先执行一遍pull指令来拉取远程仓库的代码到本地仓库,以确保当前工作空间的分支是最新的状态;但如果本地仓库的代码与远程仓库的代码不一致,这个时候就会出现代码冲突问题;

观察下面代码流程:

xiaohui用户xiaolan用户
创建abc.txt
内容为:
111
222
执行add、commit、push
clone项目到本地
修改内容为:
111aaa
222
执行commit、push
修改内容为:
111
222bbb
执行commit
执行pull,出现代码冲突
1) 创建远程仓库

【在当前工作空间(xiaohui),初始化本地项目】

rm -rf .git ./*		
git init			
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./
echo "222" >> aaa.txt
git commit -m "222" ./
echo "333" >> aaa.txt
git commit -m "333" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git log --oneline --all --graph
* 792e65d (HEAD -> master) 333
* 61b5869 222
* bcbb013 111

【创建远程仓库】

【推送仓库】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git remote add origin https://gitee.com/lvshuichangliu/test03.gitAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git remote -v
origin  https://gitee.com/lvshuichangliu/test03.git (fetch)
origin  https://gitee.com/lvshuichangliu/test03.git (push)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git push origin master
2) clone项目

【创建一个xiaolan工作空间,clone项目】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan
$ git clone https://gitee.com/lvshuichangliu/test03.gitAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan
$ cd test03/Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git remote -v
origin  https://gitee.com/lvshuichangliu/test03.git (fetch)
origin  https://gitee.com/lvshuichangliu/test03.git (push)

【配置用户信息】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git config user.name "xiaolan"			# local配置,只针对当前项目生效,会覆盖global、system配置Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git config user.email "xiaolan@aliyun.com"

注意:目前在本地存在两个工作副本,但都是使用当前windows凭证所保存的用户来进行拉取、推送操作;虽然用的是同一个账号,但是由于本地仓库的用户信息不同,因此在远程仓库并不能察觉这两个用户是不是使用同一个凭证推送的;

3) 协同开发

使用xiaohui工作空间,开发一些代码,然后提交

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git log --oneline --all --graph
* 792e65d (HEAD -> master, origin/master, origin/HEAD) 333
* 61b5869 222
* bcbb013 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ echo "444" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git commit -m "444" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git push origin master

打开远程仓库,查看提交日志:

【在xiaohui工作空间,使用pull拉取代码】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git pull origin masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git log --oneline --all --graph
* 4fdb115 (HEAD -> master, origin/master) 444
* 792e65d 333
* 61b5869 222
* bcbb013 111
4) 模拟协同开发冲突

【在xiaohui工作空间编辑代码,然后推送】

文件内容改为:

111aaa
222
333
444

示例:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ cat aaa.txt
111aaa
222
333
444Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git commit -m "aaa" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)			# 推送到远程仓库
$ git push origin masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)
$ git log --oneline --all --graph
* 7813dd8 (HEAD -> master, origin/master) aaa
* 4fdb115 444
* 792e65d 333
* 61b5869 222
* bcbb013 111

【在xiaolan工作空间先编辑文件、提交到本地仓库,然后再拉取远程仓库的代码】

文件内容改为:

111
222bbb
333
444

Tips:执行push必须保证本地仓库的代码是最新版本,否则不能执行push命令,因此我们执行push指令之前要先执行一遍pull命令

示例:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ cat aaa.txt
111
222bbb
333
444Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git commit -m "bbb" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)		# 执行push必须保证本地代码是最新版本
$ git push origin master
To https://gitee.com/lvshuichangliu/test03.git! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://gitee.com/lvshuichangliu/test03.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)			# 执行pull,出现代码冲突
$ git pull origin master
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 229 bytes | 19.00 KiB/s, done.
From https://gitee.com/lvshuichangliu/test03* branch            master     -> FETCH_HEAD4fdb115..7813dd8  master     -> origin/master
Auto-merging aaa.txt
CONFLICT (content): Merge conflict in aaa.txt
Automatic merge failed; fix conflicts and then commit the result.Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master|MERGING)
$ cat aaa.txt
<<<<<<< HEAD
111
222bbb
=======
111aaa
222
>>>>>>> 7813dd8184245cca013458aa0292696ebb3ba4fe
333
444Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master|MERGING)
$ git log --oneline --all --graph
* 0061a58 (HEAD -> master) bbb						# 已经成功拉取远程仓库的代码到本地了(只不过还有冲突需要解决),产生了一个新的版本
| * 7813dd8 (origin/master, origin/HEAD) aaa
|/
* 4fdb115 444
* 792e65d 333
* 61b5869 222
* bcbb013 111

【解决代码冲突,然后再推送】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master|MERGING)			# 解决代码冲突
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master|MERGING)
$ cat aaa.txt
111aaa
222bbb
333
444Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master|MERGING)
$ git commit -a -m "执行pull,出现冲突,并且已经解决冲突"			# 解决冲突,产生了一个新的版本
[master f4b7445] 执行pull,出现冲突,并且已经解决冲突Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)
$ git log --oneline --all --graph
*   f4b7445 (HEAD -> master) 执行pull,出现冲突,并且已经解决冲突
|\
| * 7813dd8 (origin/master, origin/HEAD) aaa
* | 0061a58 bbb
|/
* 4fdb115 444
* 792e65d 333
* 61b5869 222
* bcbb013 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test03 (master)		# 解决完冲突后,提交到远程仓库
$ git push origin master

【使用xiaohui工作空间,拉取最新代码】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)		# 拉取之前的日志
$ git log --oneline --all --graph
* 7813dd8 (HEAD -> master, origin/master) aaa
* 4fdb115 444
* 792e65d 333
* 61b5869 222
* bcbb013 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)		# 拉取代码
$ git pull origin masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)		# 已经成功拉取下来了
$ cat aaa.txt
111aaa
222bbb
333
444Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test03 (master)		# 拉取之后的日志
$ git log --oneline --all --graph
*   f4b7445 (HEAD -> master, origin/master) 执行pull,出现冲突,并且已经解决冲突
|\
| * 7813dd8 aaa
* | 0061a58 bbb
|/
* 4fdb115 444
* 792e65d 333
* 61b5869 222
* bcbb013 111

二、TortoiseGit的使用

Git 我们在前面的教程中已经介绍了, 它是一个强大的版本控制系统,但我们每次都在bash中通过指令操作,这无疑是在考验我们的记忆力,因此我们迫切的需要一款图形界面软件,安装Git时自带的Git GUI就是这样一款软件,但是我们这里要介绍更好用的一款Git客户端软件,它就是TortoiseGit

TortoiseGit是Git版本控制系统的客户端,它是开源且免费的,文件存储在本地存储库中,存储库很像普通的文件服务器,除了它会记住对文件和目录所做的每一次更改,这使您可以恢复文件的旧版本并检查数据更改方式和时间以及更改者的历史记录。

安装好TortoiseGit之后,查看右键菜单:

点击Settings,打开Git全局配置,配置用户信息:

2.1 TortoiseGit 的基本使用

2.1.1 创建仓库

  • Git命令:
git init

在一个工作空间右击菜单,选择Git Create repository here...

仓库创建成功:

2.1.2 添加

  • Git命令:
git add { 文件 | 文件夹}

创建文件,文件内容为:111,然后右击鼠标:

2.1.3 提交

  • Git命令:
git commit -m {注释} { 文件 | 文件夹}

我们暂时不推送到远程仓库,直接点击close按钮;

2.1.4 对比

  • Git命令:
git diff							# 对工作空间和暂存区的内容
git diff [ --cached | --staged]		# 对比暂存区和版本库的内容

注意:TortoiseGit只能对比工作空间和版本库的内容,不能对比暂存区的内容;

打开Git Bash Here控制台,编辑文件:

echo "222" >> aaa.txt

使用TortoiseGit对比工作空间和版本库的内容:

提交文件

git commit -m "222" ./

2.1.5 查看状态

Git的工作空间有四种状态,分别为:

  • nothing to commit : 表示当前工作空间没有还未提交的操作,属于一个干净的工作空间;(工作空间的所有文件均已提交)
  • Untracked files :表示当前空间空间有文件文件处于"未追踪"状态,需要使用add命令添加;(工作空间中含有没有执行add的文件)
  • Changes to be committed : 表示更改的操作已经被追踪到了,但操作还未被提交;(修改的文件执行了add操作,但是还未提交)
  • Changes not staged for commit : 表示当前工作目录中有文件被修改了,但是还未被Git追踪到;需要使用add命令来追踪(已经执行过add的文件被修改但了还未执行add操作)

但这四种状态在TortoiseGit中为:

  • Changes not staged for commit --> Modified
  • Untracked files -> Unknown
  • Changes to be committed -> Added

【代码示例】

编辑aaa.txt文件(Changes not staged for commit):

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "333" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   aaa.txtno changes added to commit (use "git add" and/or "git commit -a")

查看日志:

日志窗口:

提交操作:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "333" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
nothing to commit, working tree clean

日志窗口:

新增一个bbb.txt文件(Untracked files ):

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "111" >> bbb.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
Untracked files:(use "git add <file>..." to include in what will be committed)bbb.txt

日志窗口:

将操作添加到暂存区(Changes to be committed):

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git add ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)new file:   bbb.txt

日志窗口:

提交操作:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "111-bbb" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
nothing to commit, working tree clean

日志窗口:

2.1.6 改名

  • Git命令:
git mv newName oldName

使用TortoiseGit操作:

查看Git状态:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)renamed:    aaa.txt -> ccc.txt

Changes to be committed : 有修改的操作已经被追踪,但还未提交;

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
d52d172 (HEAD -> master) 将aaa.txt文件修改为ccc.txt文件
5b4b6a7 111-bbb
f3d0218 333
c301016 222
43e816b 111

Tips:查看TortoiseGit日志也是一样的效果

2.1.6 删除

  • Git命令:
git rm { 文件 | 文件夹 }

使用TortoiseGit操作:

查看Git状态,提交:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)deleted:    ccc.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "删除ccc.txt文件" ./
[master dd499de] 删除ccc.txt文件1 file changed, 3 deletions(-)delete mode 100644 ccc.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
dd499de (HEAD -> master) 删除ccc.txt文件
d52d172 将aaa.txt文件修改为ccc.txt文件
5b4b6a7 111-bbb
f3d0218 333
c301016 222
43e816b 111

2.1.7 日志

右击查询日志:

日志查询面板:

2.1.7 还原

使用Git语法可以还原工作空间、暂存区、提交对象;其中还原提交对象分为修正提交日志、修正提交内容、修正提交文件;

1) 还原工作空间
  • Git命令:
git restore {文件|目录}					# 还原工作空间
git restore --staged {文件|目录}		# 仅还原暂存区,该命令不会还原工作空间git commit --amend -m "注释"				# 还原(重置)提交对象信息
  • 编辑文件:
Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "222-bbb" >> bbb.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   bbb.txt

再次查看工作空间状态:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
nothing to commit, working tree clean
2) 还原提交对象
  • 语法:
git commit --amend -m "注释"				# 还原(重置)提交对象信息

【修正提交日志】

编辑文件提交:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master|REVERTING)
$ echo "222 333" >> bbb.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master|REVERTING)
$ git commit -m "222" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
9330e37 (HEAD -> master) 222
dd499de 删除ccc.txt文件
d52d172 将aaa.txt文件修改为ccc.txt文件
5b4b6a7 111-bbb
f3d0218 333
c301016 222
43e816b 111

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
6a7f91f (HEAD -> master) 222 333			# 修改了日志
dd499de 删除ccc.txt文件
d52d172 将aaa.txt文件修改为ccc.txt文件
5b4b6a7 111-bbb
f3d0218 333
c301016 222
43e816b 111

【修正提交内容】

修改提交内容:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ cat bbb.txt
111
222 333Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ vi bbb.txt

再次查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 并没有增加日志
$ git log --oneline --all
49129dd (HEAD -> master) 222 333
dd499de 删除ccc.txt文件
d52d172 将aaa.txt文件修改为ccc.txt文件
5b4b6a7 111-bbb
f3d0218 333
c301016 222
43e816b 111

【修改提交文件】

新建一个文件:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "000" >> new.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git add ./
warning: LF will be replaced by CRLF in new.txt.
The file will have its original line endings in your working directory

再次查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 并没有新增日志
$ git log --oneline --all
ba1ff26 (HEAD -> master) bbb.txt文件的内容新增了222、333 新增了一个new.txt文件		# 日志更新了
dd499de 删除ccc.txt文件
d52d172 将aaa.txt文件修改为ccc.txt文件
5b4b6a7 111-bbb
f3d0218 333
c301016 222
43e816b 111

2.1.8 回退

Git命令:

  • 只移动HEAD,不改变暂存区和工作空间
git reset --soft {CommitHash}		# 回退到指定的Commit对象git reset --soft HEAD~				# 回退到上一个版本	
git reset --soft HEAD~~				# 回退到上上个版本
  • 移动HEAD、更改暂存区,不改变工作空间
git reset --mixed HEAD~				# 回退到上一个版本
git reset --mixed HEAD~~			# 回退到上上一个版本git reset --mixed {CommitHash}		# 回退到指定的Commit对象
  • 移动HEAD、更改暂存区、更改工作空间
git reset --hard HEAD~				# 回退到上一个版本
git reset --hard HEAD~~			# 回退到上上一个版本git reset --hard {CommitHash}		# 回退到指定的Commit对象

初始化一个新的项目:

rm -rf ./* .git
git init
echo '111' >> aaa.txt
git add ./
git commit -m '111' ./
echo "222" >> aaa.txt
git add ./
git commit -m "222" ./
echo "333" >> aaa.txt
git add ./
git commit -m "333" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
12f7e5d (HEAD -> master) 333
00d4ac3 222
3adc1b0 111

打开日志窗口,进行回退:

1)回退HEAD指针

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看日志
$ git log --oneline --all
00d4ac3 (HEAD -> master) 222		# HEAD指针发生变化了
3adc1b0 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 查看暂存区
$ git ls-files -s
100644 641d57406d212612a9e89e00db302ce758e558d2 0       aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git cat-file -p 641d574			# 暂存区并没有改变
111
222
333Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 工作空间也没有改变
$ cat aaa.txt
111
222
333
2)回退HEAD指针、暂存区

使用同样的办法回到333版本:

然后再回到222版本:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 指针改变了
$ git log --oneline --all			
00d4ac3 (HEAD -> master) 222
3adc1b0 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git ls-files -s
100644 a30a52a3be2c12cbc448a5c9be960577d13f4755 0       aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 暂存区也改变了
$ git cat-file -p a30a52
111
222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 工作空间没有改变
$ cat aaa.txt
111
222
333
3)回退HEAD指针、暂存区、工作空间

使用同样的办法回到333版本,然后再回到222版本:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# HEAD指针变了
$ git log --oneline --all
00d4ac3 (HEAD -> master) 222		
3adc1b0 111Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git ls-files -s
100644 a30a52a3be2c12cbc448a5c9be960577d13f4755 0       aaa.txt		Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 暂存区变了
$ git cat-file -p a30a52
111
222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 工作空间也变了
$ cat aaa.txt
111
222

2.1.9 添加忽略

2.2 TortiseGit操作分支

【初始仓库】

rm -rf ./* .git
git init
echo '111' >> aaa.txt
git add ./
git commit -m '111' ./
echo "222" >> aaa.txt
git add ./
git commit -m "222" ./
echo "333" >> aaa.txt
git add ./
git commit -m "333" ./

2.2.1 创建分支

直接创建:

指定日志来创建分支:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
2c38cda (HEAD -> master, b1) 333
edb3b67 222
51e4674 111

2.2.2 切换分支

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
2c38cda (HEAD -> b1, master) 333
edb3b67 222
51e4674 111

Tips:注意新分支和新文件切换分支带来的工作空间及暂存区的影响;

2.2.3 合并分支

使用master分支开发:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "333" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "333" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
c038a5e (HEAD -> master) 333
2c38cda (b1) 333
edb3b67 222
51e4674 111

首先先切换到b1分支,使用ToritoseGit合并分支:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b1)
$ git log --oneline --all
c038a5e (HEAD -> b1, master) 333
2c38cda 333
edb3b67 222
51e4674 111

2.2.3 分支合并冲突

分支合并冲突分为快进合并冲突和典型合并冲突,TortoiseGit解决冲突的方式都是一样的,我们本章只演示快进合并冲突;

【初始化仓库,准备快进合并冲突案例】

rm -rf ./* .git
git init
echo "111" >> aaa.txt
echo "222" >> aaa.txt
git add ./
git commit -m "111 222" ./
git branch b1Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ cat aaa.txt
111aaa
222Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "aaa" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git checkout b1
Switched to branch 'b1'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b1)
$ vi aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b1)
$ cat aaa.txt
111
222bbbAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b1)
$ git commit -m "bbb" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (b1)
$ git checkout master
Switched to branch 'master'Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 非同轴开发的快进合并
$ git log --oneline --all --graph
* b33f9b6 (b1) bbb
| * b9f54a5 (HEAD -> master) aaa
|/
* ae8933b 111 222

使用TortoiseGit合并:

编辑冲突文件:

解决冲突:

提交:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master|MERGING)
$ git log --oneline --all --graph
*   8eac439 (HEAD -> master) b1合并master分支,并解决冲突
|\
| * b33f9b6 (b1) bbb
* | b9f54a5 aaa
|/
* ae8933b 111 222

2.2.4 分支状态存储

1) 使用存储

编辑文件:

echo "666" >> aaa.txt

使用Git存储:

查看git工作空间状态,发现变为干净状态:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
nothing to commit, working tree cleanAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)			# 文件并没有666内容
$ cat aaa.txt
111aaa
222bbb
2) 查看存储

3) 读取存储

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 工作区的状态
$ git status
On branch master
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   aaa.txtno changes added to commit (use "git add" and/or "git commit -a")Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 文件内容又回来了
$ cat aaa.txt
111aaa
222bbb
666Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)		# 提交内容
$ git commit -m "666" ./
[master ca32a2c] 6661 file changed, 1 insertion(+)Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git status
On branch master
nothing to commit, working tree clean
4) 删除存储

2.3 TortiseGit协同开发

【初始化项目库】

rm -rf .git ./*		
git init			
echo "111" >> aaa.txt
git add ./
git commit -m "111" ./
echo "222" >> aaa.txt
git commit -m "222" ./
echo "333" >> aaa.txt
git commit -m "333" ./

创建一个远程仓库:

2.3.1 remote

  • 语法:
# 查看所有别名
git remote -v # 为一个远程仓库起一个别名
git remote add {remote-name} {url}	# 查看指定的远程仓库的详细信息
git remote show {remote-name | url}# 重命名别名
git remote rename {old-remote-name} {new-remote-name} # 删除别名
git remote rm {remote-name}

使用TortoiseGit:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git remote -v
test05  https://gitee.com/lvshuichangliu/test05.git (fetch)
test05  https://gitee.com/lvshuichangliu/test05.git (push)

2.3.2 push

  • 语法:
# 将本地仓库推送到远程仓库# branchName: 本地分支的名称# remoteBranchName: 远程分支的名称
git push { url | remoteName } [branchName[:remoteBranchName]]# 将本地仓库推送到远程仓库(本地分支和远程分支名称一致的情况)
git push { url | remoteName } branchName# 将本地仓库推送到远程仓库(操作的分支是master的情况下)
git push { url | remoteName }

使用TortoiseGit:

推送成功:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
2926c83 (HEAD -> master, test05/master) 333		# 创建了远程跟踪分支
9ddd8f5 222
bfd0f29 111

2.2.3 clone

  • 语法:
# 克隆远程仓库到本地
git clone {url}# 默认情况下克隆到本地的项目名称和远程库一样,如果想要自己指定名称可以在后面指定项目的名称
git clone {url} {projectName}

在一个新的工作空间【xiaolan】clone远程仓库到本地:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test05 (master)
$ git log --oneline --all
2926c83 (HEAD -> master, origin/master, origin/HEAD) 333		# 创建了远程跟踪分支
9ddd8f5 222
bfd0f29 111

2.3.4 fetch

  • 语法:
# 拉取远程仓库的代码到本地的远程跟踪分支# branchName: 本地分支名称# remoteBranchName: 远程分支名称
git fetch { url | remoteName } [branchName[:remoteBranchName]]# 拉取远程仓库的代码到本地的远程跟踪分支(本地分支和远程分支名称一致的情况)
git fetch { url | remoteName } [branchName]# 拉取远程仓库的代码到本地的远程跟踪分支(操作的分支是master的情况下)
git fetch { url | remoteName }

首先使用xiaohui工作空间编辑代码,提交,然后推送到远程仓库:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "444" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "444" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git push test05 masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
75a91c9 (HEAD -> master, test05/master) 444
2926c83 333
9ddd8f5 222
bfd0f29 111

在xiaolan工作空间使用TortoiseGit的fetch命令拉取远程仓库的代码:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test05 (master)
$ git log --oneline --all
75a91c9 (origin/master, origin/HEAD) 444			# 代码被拉取到远程跟踪分支上了
2926c83 (HEAD -> master) 333
9ddd8f5 222
bfd0f29 111

合并远程分支的代码:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test05 (master)
$ git log --oneline --all
75a91c9 (HEAD -> master, origin/master, origin/HEAD) 444
2926c83 333
9ddd8f5 222
bfd0f29 111

2.3.5 pull

  • 语法:
# 拉取代码到本地分支并将本地分支与远程跟踪分支合并# branchName: 本地分支的名称# remoteBranchName: 远程分支的名称
git pull { url | project-name} [branchName[:remoteBranchName]]# 拉取代码到本地分支并将本地分支与远程跟踪分支合并(本地分支和远程分支名称一致的情况)
git pull { url | project-name} [branchName]# 拉取代码到本地分支并将本地分支与远程跟踪分支合并(操作的分支是master的情况下)
git pull { url | project-name}

使用xiaohui工作空间编辑代码,提交,推送:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "555" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "555" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git push test05 masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
1f665de (HEAD -> master, test05/master) 555
75a91c9 444
2926c83 333
9ddd8f5 222
bfd0f29 111

在xiaolan工作空间使用TortoiseGit的pull命令来拉取代码:

查看xiaolan工作空间的日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test05 (master)
$ git log --oneline --all
1f665de (HEAD -> master, origin/master, origin/HEAD) 555			# 代码不仅拉取到了远程跟踪分支上,并且master分支已经合并了远程跟踪分支的代码
75a91c9 444
2926c83 333
9ddd8f5 222
bfd0f29 111

2.3.6 模拟协同开发冲突

使用xiaohui工作空间编辑代码,提交,推送:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ echo "666" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git commit -m "666" ./Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git push test05 masterAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/test01 (master)
$ git log --oneline --all
0dd8aff (HEAD -> master, test05/master) 666
1f665de 555
75a91c9 444
2926c83 333
9ddd8f5 222
bfd0f29 111

在xiaolan工作空间,编辑代码,然后执行pull:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test05 (master)
$ echo "777" >> aaa.txtAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test05 (master)
$ git commit -m "777" ./

查看xiaolan工作空间日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaolan/test05 (master|MERGING)
$ git log --oneline --all
d5c2102 (HEAD -> master, origin/master, origin/HEAD) 拉取代码时出现冲突,已经解决冲突
626b865 777
0dd8aff 666
1f665de 555
75a91c9 444
2926c83 333
9ddd8f5 222
bfd0f29 111

三、IDEA集成Git插件

3.1 Git插件的基本使用

首先一定要配置Git的一些基本信息:

# 配置用户信息,如果已经配置将会覆盖
git config --global user.name "xiaohui"
git config --global user.email "xiaohui@aliyun.com"

3.1.1 提交项目

1)绑定Git插件

1)打开Settings—>Version Control—>Git;选择Git命令

2)打开VCS—>Enable Version Control Integration...;开启版本控制:

3)选择Git:

4)添加成功:

2)添加忽略文件

Tips:有的时候在.gitignore文件中添加了忽略文件,但并没有以暗黄色显示这些文件,需要关闭项目重新打开;

3)提交项目

提交成功:

如果不想在idea中看到被忽略的文件,我们可以打开Settings—>Editor—>File Types

选择要忽略的文件:

3.1.2 比较

将文件内容编辑为:

public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);}
}

Tips:IDEA的Git插件只能对比工作空间和版本库中的文件,不能对比暂存区的;

查看对比:

3.1.3 还原

1)还原工作空间
  • Git语法:
git restore {文件|目录}					# 还原工作空间
git restore --staged {文件|目录}		# 仅还原暂存区,该命令不会还原工作空间
git commit --amend -m "注释"				# 还原(重置)提交对象信息

编辑Main.java文件(不能提交),然后右击Git–>Rollback...

然后查看文件,发现之前编辑的内容被撤销了;

2)还原提交对象

还原提交对象主要有三种:提交日志修正、提交内容修正、提交文件修正;

  • Git语法:
git commit --amend -m "注释"				# 还原(重置)提交对象信息

【编辑文件】

public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);}
}

提交;

重新提交:

重新查看日志:

该操作同样适用于修正文件内容,修正提交文件等;只需要在提交的时候勾选Amend本次提交就会自动和上一个提交合并,生成一条提交日志;

3.1.4 回退

Git语法:

  • 只移动HEAD,不改变暂存区和工作空间
git reset --soft {CommitHash}		# 回退到指定的Commit对象git reset --soft HEAD~				# 回退到上一个版本	
git reset --soft HEAD~~				# 回退到上上个版本
  • 移动HEAD、更改暂存区,不改变工作空间
git reset --mixed HEAD~				# 回退到上一个版本
git reset --mixed HEAD~~			# 回退到上上一个版本git reset --mixed {CommitHash}		# 回退到指定的Commit对象
  • 移动HEAD、更改暂存区、更改工作空间
git reset --hard HEAD~				# 回退到上一个版本
git reset --hard HEAD~~			# 回退到上上一个版本git reset --hard {CommitHash}		# 回退到指定的Commit对象
1)回退HEAD指针

在文件上右击Git—>Reset HEAD...

选择回退的版本:

查看Git日志,发现HEAD指针移动了:

可以查看暂存区和工作空间,发现都没有变化:

【暂存区】

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)
$ git ls-files -s
100644 82b7e88a225af2f782bc913c3c518b259bca6f5d 0       .gitignore
100644 aeeaf8f581fa1f1d7f1c7721c5560f251517a599 0       src/Main.javaAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)
$ git cat-file -p aeeaf8f581fa1f1d7f1c7721c5560f251517a599
public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);}
}

【工作空间】

可以使用git命令查看reflog日志:

重新回退:

2)回退HEAD、暂存区

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)		# HEAD指针移动了
$ git log --oneline --all
fb3bce1 (HEAD -> master) 新增功能111
cdc90be 初始化项目Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)
$ git ls-files -s
100644 82b7e88a225af2f782bc913c3c518b259bca6f5d 0       .gitignore
100644 6f5d1f47dc1d0ce1981fc68b8d202980e6824cae 0       src/Main.javaAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)		# 暂存区的内容变化了
$ git cat-file -p 6f5d1f47dc1d0ce1981fc68b8d202980e6824cae
public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);}
}Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)		# 工作空间没有变化
$ cat src/Main.java
public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);}
}

回退到最新版本:

查看Git日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)
$ git log --oneline --all
f15afdb (HEAD -> master) 新增功能222和333
fb3bce1 新增功能111
cdc90be 初始化项目
3)回退HEAD、暂存区、工作空间

查看Git日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)		# HEAD指针移动了
$ git log --oneline --all
fb3bce1 (HEAD -> master) 新增功能111
cdc90be 初始化项目Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)
$ git ls-files -s
100644 82b7e88a225af2f782bc913c3c518b259bca6f5d 0       .gitignore
100644 6f5d1f47dc1d0ce1981fc68b8d202980e6824cae 0       src/Main.javaAdminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)		# 暂存区变化了
$ git cat-file -p 6f5d1f47dc1d0ce1981fc68b8d202980e6824cae
public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);}
}
Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)		# 工作空间变化了
$ cat src/Main.java
public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);}
}

回退到最新版本:

查看日志:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)
$ git log --oneline --all
f15afdb (HEAD -> master) 新增功能222和333
fb3bce1 新增功能111
cdc90be 初始化项目

3.2 分支的操作

3.2.1 创建分支

在项目上右击—>Git—>Branches...

默认在当前HEAD指针位置创建,并且自动切换到该分支:

也可以在指定的版本上右击来创建分支:

3.2.2 切换分支

3.3.2 合并分支

  • 修改master分支的Main.java文件,然后提交:
public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);System.out.println(444);}
}

切换到b1分支,合并master分支的内容:

b1分支合并前的内容:

public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);}
}

b1分支的Main.java:

3.3.3 合并分支解决冲突

修改b1分支的内容,然后提交:

public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);System.out.println(444);System.out.println(555);}
}

切换到master分支,修改master分支的内容,然后提交:

public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);System.out.println(444);System.out.println(666);}
}

使用master分支合并b1分支的内容:

解决冲突:

合并完成,填写日志提交:

3.3.4 使用分支状态存储

添加自己的功能,但还未完成:

public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);System.out.println(444);System.out.println(555);System.out.println(666);System.out.println(777);}
}

使用Git分支存储先将这个状态存储起来:

工作空间也是干净的状态:

Adminstrator@LAPTOP-OC90J78H MINGW64 ~/Desktop/workspace/xiaohui/Project (master)
$ git status
On branch master
nothing to commit, working tree clean

可以继续编辑文件,处理临时任务:

public class Main {public static void main(String[] args) {System.out.println("Hello world!");System.out.println(111);System.out.println(222);System.out.println(333);System.out.println(444);System.out.println(555);System.out.println(666);System.out.println(888);System.out.println(999);}
}

提交;

查看日志:

读取存储:

查看日志:

3.3 协同开发

首先在Gitee创建一个仓库:

3.3.1 remote

打开菜单栏中的Git—>Manage Remotes

3.3.2 push

在项目上右击—>Git—>Push...

查看远程仓库:

推送成功后,查看Git日志,发现master的远程跟踪分支创建成功:

通过Gi命令查看日志:

Tips:刚刚使用push命令仅仅是把master分支推送到远程仓库了,b1和b2分支并没有推送到远程仓库,因此没有创建b1和b2分支的远程跟踪分支

3.3.3 clone

点击菜单栏上的File—>New—>Project from Version Control...

克隆好了之后,发现创建了master对应的远程跟踪分支:

3.3.4 fetch

  • 1)在xiaohui工作空间创建Demo01.java文件,内容如下:
public class Demo01 {public static void main(String[] args) {System.out.println(111);}
}

然后执行add、commit、push;

  • 2)在xiaolan工作空间执行fetch:

查看Git日志,新功能在远程跟踪分支origin/master上,本地分支还在之前的位置:

使用本地分支合并远程跟踪分支的内容,将功能集成到本地分支上:

合并成功:

3.3.5 pull

  • 1)在xiaohui空间编辑代码:
public class Demo01 {public static void main(String[] args) {System.out.println(111);System.out.println(222);}
}

提交、推送;

  • 2)在xiaolan工作空间执行pull操作:

查看Git日志和工作空间:

3.3.6 模拟协同开发

1) push冲突
  • 1)在xiaolan工作空间编辑代码:
public class Demo01 {public static void main(String[] args) {System.out.println(111);System.out.println(222);System.out.println(333);}
}

提交、推送;

  • 2)在xiaolan工作空间编辑代码:
public class Demo01 {public static void main(String[] args) {System.out.println(111);System.out.println(222);System.out.println(444);}
}

提交,推送,出现如下冲突:

Tips:在使用Git原始命令时,如果本地仓库的版本不是最新版本则不允许执行push,但IDEA做了优化,本地仓库即使不是最新版本也允许提交,但可能会出现冲突;

解决冲突:

解决冲突:

点击保存后,自动产生了一条提交记录,提交日志是默认的:

我们可以使用amend来修改提交日志:

查看新的日志:

重新推送到远程仓库:

本次是产生了两个版本,一个是提交444功能的,另一个是推送到远程仓库出现问题然后合并远程仓库内容之后产生的一个版本

在xiaolan工作空间执行pull命令:

2) pull冲突
  • 1)在xiaohui工作空间编辑代码:
public class Demo01 {public static void main(String[] args) {System.out.println(111);System.out.println(222);System.out.println(333);System.out.println(444);System.out.println(555);}
}

提交、推送;

  • 2)在xiaolan工作空间编辑代码:
public class Demo01 {public static void main(String[] args) {System.out.println(111);System.out.println(222);System.out.println(333);System.out.println(444);System.out.println(666);}
}

提交到本地仓库,然后执行pull确保本地仓库是最新的版本,但是执行完pull之后出现冲突:

解决冲突:

解决冲突之后,和之前一样还是产生了一条新的提交记录,提交日志是默认的:

我们可以使用amend来修改提交日志:

查看最新日志:

推送到远程仓库:

本次操作同样是产生了两个版本,一个是本身自己提交的666功能,另一个是合并远程仓库代码是产生冲突之后解决冲突生成的一个版本;

在xiaohui空间使用pull拉取最新代码:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/186824.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023/11/10 JAVA学习

取文件夹本身大小 打开文件 文件改名案例 输出流,文件依照你起的文件名自动创建 哪个流后创建,哪个流先关闭 虚拟机退出跑不了 finally别返回值

金蝶云星空表单插件实现父窗体打开子窗体,并携带参数到子窗体

文章目录 金蝶云星空表单插件实现父窗体打开子窗体&#xff0c;并携带参数到子窗体父窗体打开子窗体准备设置携带参数打开子窗体子窗体接收参数 金蝶云星空表单插件实现父窗体打开子窗体&#xff0c;并携带参数到子窗体 父窗体打开子窗体准备 BillShowParameter OtherInAdd n…

外贸企业GMS认证|SD-WAN专线解决方案支持 IPv6、IPv4

IP地址是英文internet protocol的缩写&#xff0c;是网络之间互连的协议。互联网诞生后&#xff0c;很长一段时间都是使用v4版本的IP协议&#xff0c;也就是 IPv4 &#xff0c;目前全球使用互联网的人数达到了48.8亿&#xff0c;而IPv4的地址库总共约43亿个地址&#xff0c;每个…

blender动画制作软件拓扑全流程

拓扑在三维动画制作中至关重要&#xff0c;原因如下&#xff1a; 1. 动画变形&#xff1a; 自然形变&#xff1a; 良好的拓扑结构能够支持角色或物体在动画中的自然形变&#xff0c;例如关节弯曲、肌肉收缩等。流畅运动&#xff1a; 适当的拓扑有助于保持模型表面的平滑性&…

KiB、MiB与KB、MB的区别

KiB、MiB与KB、MB的区别

排序算法的空间复杂度和时间复杂度

一、排序算法的时间复杂度和空间复杂度 排序算法 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 冒泡排序 O(n) O(n) O(n) O(1) 稳定 直接选择排序 O(n) O(n) O(n) O(1) 不稳定 直接插入排序 O(n) O(n) O(n) O(1) 稳定 快速排序 O(n…

如何在Jetpack Compose中显示PDF?

当读取和显示 PDF 的组件缺失时该怎么办? 声明式编程可以拯救你. Jetpack Compose已经存在好几年了, 但_在某些方面它的使用仍然面临挑战_. 例如, 缺少用于查看PDF的官方组件, 而为数不多的第三方库通常也是有代价的. 在我们的应用中, 我们会遇到在许多场景中显示 PDF 的需求…

Windows安装Docker(无网)

Windows安装Docker&#xff08;无网&#xff09; window无网安装Docker 1. 开启虚拟化功能 1. 开启window的虚拟化功能 方式一&#xff1a;直接在window的搜索框搜索 “启用或关闭windows功能”&#xff0c;就可以快捷进入【启用或关闭windows功能】页面 方式二&#xff1…

Word脚注如何插入?1分钟学会!

“最近在写一些文章&#xff0c;引用了一些注释&#xff0c;想为它们增添一些脚注。有没有朋友知道在word里脚注怎么添加呀&#xff1f;” 使用word编写文章时&#xff0c;添加脚注是一项常见的任务&#xff0c;用于引用文献、添加注释或提供额外信息。但可能很多朋友不知道wor…

Mybatis(四)

9. MyBatis的逆向工程 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源&#xff1a; Java实体类 Mapp…

相机标定:理论与实践

先讨论相机模型&#xff0c;说明投影关系的描述&#xff0c;介绍相机的内外参&#xff0c;最后完成标定。 一、内参含义 把需要标定的相机参数叫做内参&#xff08;intrinsics matrix&#xff09;&#xff0c;它决定了物体的实际位置Q在成像平面上的投影位置q&#xff0c;如下…

基于FPGA的图像RGB转HSV实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. RGB与HSV色彩空间 4.2. RGB到HSV转换原理 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的仿真结果导入到matlab中&#xff1a; 2.算法运行软件版本 vivado2019.2 matlab2022a …

java正则表达式(Pattern类和Matcher类)

文章目录 前言一、Java中使用正则表达式①捕获组②Pattern类与Matcher类Pattern类&#xff1a;Matcher类&#xff1a;Pattern类&Matcher类方法:Pattern类调用方法&#xff08;静态方法&#xff09;&#xff1a;1、public static Pattern compile(String regex)2、public st…

Power Automate-创建审批流

提前在SharePoint上创建好对应的表 在创建中选择自动化云端流 选择当创建项时触发 选择站点和列表&#xff0c;再点击添加新步骤 搜索审批&#xff0c;点击进入 操作里的选项区别&#xff1a; 1&#xff09;创建审批&#xff1a;创建一个审批任务 2&#xff09;等待审批&…

适合汽车音频系统的ADAU1977WBCPZ、ADAU1978WBCPZ、ADAU1979WBCPZ四通道 ADC,24-bit,音频

一、ADAU1977WBCPZ 集成诊断功能的四通道ADC&#xff0c;音频 24 b 192k IC&#xff0c;SPI 40LFCSP ADAU1977集成4个高性能模数转换器(ADC)&#xff0c;其直接耦合输入具有10 V rms性能。该ADC采用多位Σ-Δ架构&#xff0c;其连续时间前端能够实现低EMI性能。它可以直接连接…

Leetcode_3:无重复字符的最长子串

题目描述&#xff1a; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2: 输入: s "bbbbb"…

2011年09月01日 Go生态洞察:Go语言词法扫描与App Engine演示

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

《DevChat:AI编程助手引领开发新潮》

1. DevChat是什么&#xff1f; DevChat是一款由思码逸打造的AI编程工具&#xff0c;致力于提升开发者的编程效率。它集成了多种主流大模型&#xff0c;包括ChatGPT、Codex等&#xff0c;支持自然语言编程、代码编写、代码生成、代码补全等功能。DevChat的最大优势在于一站式服…

关于mac下pycharm旧版本没删除的情况下新版本2023安装之后闪退

先说结论&#xff0c;我用的app cleaner 重新删除的pycharm &#xff0c;再重新安装即可。在此记录一下 之前安装的旧版的2020的pycharm&#xff0c;因为装不了新的插件&#xff0c;没办法就升级了。新装2023打开之后闪退&#xff0c;重启系统也不行&#xff0c;怀疑是一起破解…