一、Git 概述

1.1、Git 概述

1、Git是目前世界上最先进的分布式版本控制系统。

记录了每次修改的:版本,内容,操作用户,修改时间,文档名等。

2、Git 和 Github 的区别

Git是一个分布式版本控制系统,简单的说就是一个软件,用于记录一个或若干文件内容变化,以便来查阅特定版本修订情况的软件。

Github 是一个为用户提供Git服务的网站,简单说就是一个可以放代码的地方(也可以放其他内容)。

Github 除了提供管理Git的web界面外,还提供了【订阅、关注、讨论组】在线编辑器等丰富的功能。

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

本例使用了 Gitee 作为远程仓库。

1.2、Git 与 SVN 对比

1、SVN

SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。

集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。

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

image-20210413153316462

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

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

  • 服务器单点故障
  • 容错性差

2、Git

Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。

既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

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

image-20210413153448023

1.3、Git 工作流程

一般工作流程如下:

  1. 从远程仓库中克隆 Git 资源作为本地仓库。
  2. 从本地仓库中 checkout 代码然后进行代码修改
  3. 在提交前先将代码提交到暂存区。
  4. 提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。
  5. 在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。

下图展示了 Git 的工作流程:

image-20210413153719951

1、团队内协作

image-20210413162958283

2、跨团队协作

image-20210413163128107

3、Git 结构

image-20210413170523048

二、Git 命令行操作

2.1、本地库初始化

在需要进行版本控制的位置,打开命令行窗口,使用 git init 初始化本地库

1
git init

之后,在该目录下会出现一个 .git 隐藏文件夹

image-20210413165026897

注意:

.git 目录中存放的是本地库相关的子目录和文件,不要随意改动和删除。

.git 目录被称为本地库,存放本地库的目录称为工作目录

  • 设置签名

形式:

  1. 用户名:Tom
  2. Email 地址:xxx@qq.com

作用:区分不同开发人员身份。

这里的签名和远程库的账号密码没有关系。

  • 命令
  1. 项目/仓库级别

仅在当前本地库范围有效

1
git config
  1. 系统用户级别

登录当前操作系统的用户范围

1
git config --global

2.2、基本操作

  • git status 状态查看

查看工作区、暂存区状态

1
git status

image-20210413170757648

  • git add [fileName] 添加

将工作区的“新建/修改”添加到暂存区

  1. 在工作目录下创建一个 hello.txt 文件,随便输入点内容
  2. 此时再次使用 git status 查看状态

image-20210413171242204

  1. 使用 git add 提交文件到暂存区
1
git add hello.txt

image-20210413171407865

  1. 此时再次查看状态

此时可以使用 git rm --cached [fileName] 将文件从暂存区中撤出。

image-20210413171556977

  1. 将文件撤出暂存区
1
git rm --cached hello.txt

image-20210413171818650

  • git commit -m "commit message" [file name]

将暂存区的内容提交到本地库

提交存放在暂存区中的 hello.txt 文件

1
git commit hello.txt

此时进入此界面

对于此时提交,你需要关于本次提交的日志,修改了哪里,更新了什么,达到了什么目的。

image-20210413172027857

这是一个 vim 编辑器

image-20210413172347184

esc ,然后输入 :wq 退出

image-20210413172537033

此时再次查看状态

image-20210413172605057

此时修改 hello.txt 中的数据,然后再次查看状态

image-20210413172727145

再次添加提交

image-20210413172821833

提交时可以在命令中直接写入日志信息,添加 -m 参数即可。

1
git commit -m "本次提交修改的内容..." hello.txt
  • git log 查看历史记录
1
git log

查看版本记录

image-20210413173311280

2.3、使用 Git 实现版本的后退

  • 使用 git log --pretty=oneline 展示简洁的版本记录
1
git log --pretty=oneline

image-20210413173701496

  • 使用 git reflog 展示日志及版本信息
1
git reflog

image-20210413173824413

HEAD@{0} 表示当前版本(从当前版本移动到该版本需要0步)

HEAD@{1} 表示从当前版本移动到该版本需要一步。

HEAD@{到当前版本需要移动的步数}

  • 前进后退版本的本质

git 有一个指针,通过指针移动来实现版本的前进和后退。

  • 执行版本前进后退【推荐】
1
git reset --hard [版本索引值]

回退到索引值为:0787eef 的版本

1
git reset --hard 0787eef

查看 hello.txt

image-20210413174452256

回到第二个版本

1
git reset --hard ce190c4

image-20210413174548600

  • 使用 ^ 符号

只能后退版本。

git reset --hard HEAD^ 表示后退一个版本 ,可以加多个 ^ 回退多个版本

1
git reset --hard HEAD^
  • 使用 ~ 符号

用于后退版本

1
git reset --hard HEAD~n

后退 n 个版本。

2.4、reset 命令的三个参数对比

  • –sort 参数
  1. 仅仅在本地库移动 HEAD 指针
  • –mixed 参数
  1. 在本地库移动 HEAD 指针

  2. 重置暂存区

  • –hard 参数
  1. 在本地库移动 HEAD 指针

  2. 重置暂存区

  3. 重置工作区

2.5、永久删除文件后找回

创建一个 temp.txt 文件,并推送到本地库

image-20210413193545185

删除工作目录中的 temp.txt 文件

1
rm -rf temp.txt

image-20210413193708512

再查看当前状态

image-20210413193820525

将该删除操作 add 给暂存区,这里仍然使用 add

1
git add temp.txt

向本地库中推送该 删除操作

1
git commit -m "提交删除" temp.txt

image-20210413194103611

  • 要找回被永久删除的操作,只需要回滚到该文件没有被删除之前的版本即可。

查看历史记录

1
git reflog

image-20210413194235892

这个时候我们只需要回滚到索引值为 9f549b1 的版本即可。

1
git reset --hard 9f549b1

image-20210413194411859

此时再使用 ls - l 查看文件,可以看到 temp.txt 被找回

image-20210413194846834

  • 找回被删除文件的前提

删除前,文件存在时的状态被提交到了本地库。

使用 git reset --hard [指针位置]

  1. 如果删除操作已经提交到本地库:指针位置指向历史记录。
  2. 如果删除操作尚未提交到本地库:指针位置使用 HEAD
1
git reset --hard HEAD

2.6、比较文件

修改 temp.txt 文件,此时查看状态

image-20210413200157362

使用命令比较文件。

1
git diff

image-20210413200227843

  • git diff [文件名]

将工作区的文件和暂存区文件进行比较。

  • git diff [本地库中历史版本] [文件名]

将工作区中的文件和本地库历史记录比较

  • git diff

不带文件名比较多个文件

image-20210413200736307

2.7、分支管理

1、什么是分支?

在版本控制过程中,使用多条线同时推进多个任务。

image-20210413201454065

2、分支的好处

同时并行推进多个功能开发,提高开发效率

各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。

3、分支操作

  • 创建分支 git branch [分支名]

创建一个 hot_fix 分支

1
git branch hot_fix
  • 查看分支 git branch -v

查看所有分支,使用 git branch -v 查看

1
git branch -v

绿色分支表示当前正在使用的分支

image-20210413204739709

  • 切换分支 git checkout [分支名]

切换分支到 hot_fix

1
git checkout hot_fix

image-20210413205503655

  • 合并分支

合并分支步骤如下

  1. 切换到接收修改的分支上(如果需要将 a 分支合并到 b 分支上,那么必须切换到 b 分支)
  2. 执行 merge 命令 git merge [要合并到当前分支的分支名]

hot_fix 分支下修改 temp.txt 文件,然后提交到本地库中,再次查看分支信息

image-20210413210305054

如果我们想把 hot_fix 分支合并到 master 分支,那么我们当前所在的分支必须为 master,所以现在我们切换分支为 master

1
git checkout master

master 分支上执行 git merge hot_fix 命令

1
git merge hot_fix

image-20210413210715894

查看 temp.txt 文件的内容

image-20210413210744730

  • 解决合并分支时产生的冲突
  1. 编辑文件,删除特殊符号

  2. 将产生冲突文件修改到满意程度,保存退出

  3. 使用 git add [文件名]

  4. 使用 git commit -m "日志信息"

    这里的 git commit 后面不能附带文件名

修改 temp.txt 文件中的某一行,然后提交到本地库。

切换到 hot_fix 分支,然后修改 temp.txt 文件中的同一行数据,提交到本地库

由于这个时候两个分支修改的是同一个文件的同一行,所以 merge 时会产生冲突。

再次切换回 master 分支,进行合并

1
git merge hot_fix

image-20210413212129663

此时提示自动合并失败,所以我们需要手动合并,此时我们可以看到命令行中不只是展示 master 分支,而是 master | MERGING

image-20210413212249566

查看产生冲突的 temp.txt 文件,可以看到冲突的表现

image-20210413212425198

编辑产生冲突的 temp.txt 文件,删除 特殊符号,留下自己觉得需要保留的数据(此时需要和另外一个分支的作者进行商量),保存退出。

image-20210413213434247

使用 git add [产生冲突的文件名] 将解决冲突后的内容提交到暂存区

1
git add temp.txt

此时直接使用git commit 继续进行分支合并,这个时候不能添加文件名。

1
git commit

2.8、测试远程交互

1、创建一个新的本地库

创建一个新的本地库 wuhu,使用 git init 初始化

  • 新建一个 temp.txt ,填入测试内容后推送到本地仓库

  • gitee 上创建一个仓库

  • git 上为我们创建的远程仓库起一个别名,我们需要先获取该仓库在 gitee 上的地址。

1
https://gitee.com/sutianxin/git_study.git
  • 使用 git remote add origin https://gitee.com/sutianxin/git_study.git 起别名

上面的命令为 https://gitee.com/sutianxin/git_study.git 起了个 origin 别名

1
git remote add origin https://gitee.com/sutianxin/git_study.git
  • 使用 git remote -v 查看仓库和别名的对应关系

image-20210413220139596

2、执行推送

  • 使用 git push [远程仓库别名] 要推送的分支 来进行推送操作
  • 推送本地库到 远程仓库 git_study
1
git push origin master

image-20210413220759408

查看远程仓库

image-20210413220838700

3、从远程库 clone 代码

git clone 做了以下三件事

  1. 完整将远程库下载到本地。
  2. 创建 origin 远程地址别名
  3. 初始化本地库
  • 使用 git clone [远程仓库地址] 克隆远程仓库
1
git clone https://gitee.com/sutianxin/git_study.git

克隆之后的工作目录里面直接有 .git 目录, git 在克隆时直接帮我们初始化了。

4、邀请其他成员进入团队

如果没有进入团队直接 push 代码到远程库会报403

image-20210413221438693

gitee 中演示邀请成员

image-20210413221637445

进入以下页面

image-20210413221750350

此时就可以进行远程推送。

5、远程库的拉取

  • pull = fetch + merge
  • git fetch [远程库地址别名] [远程分支名]
  • git merge [远程地址别名] / [远程分支名]

pull (拉取) 其实分为两个操作,分别为:

pull 和 fetch 不需要权限。

  1. fetch
  2. merge
  • gitee 上直接修改 temp.txt 文件内容

  • fetch 远程仓库的内容

1
git fetch origin master

image-20210413222254512

  • fetch 后并没有直接修改本地库文件,我们可以查看 temp.txt

image-20210413222414656

  • 使用 merge 合并远程分支
1
git merge origin/master

image-20210413222525106

  • 现在查看 本地的 temp.txt 文件

image-20210413222549759

6、推送冲突文件

  • 如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。

如果有两个人修改了同个文件的同个位置,那么只有先推送的可以推送成功,后推送的需要先将远程库拉取到自己的本地库,然后再次进行推送。

  • 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。

2.9、跨团队协作

使用 fork + pull request + merge 来实现跨团队协作。

image-20210413223527015

1、fork 远程仓库

在要 fork 的远程仓库中点击 fork 即可将该仓库克隆到自己的远程账号

image-20210413223701217

新建一个 pull request

image-20210413223908561

在该页面中提交pull request,然后由原仓库所有者进行审核。

三、在 IDEA 中使用 Git

3.1、使用 IDEA 创建 Git 本地库

在上面的选项栏中,点击 VSC -> Import into Version Control(导入版本控制) -> Create Git Repository (创建本地仓库)。

此时 IDEA 会让我们要添加本地库的目录

image-20210413225106692

选择后该项目的文件变色了。

image-20210413225131841

同时 grain 目录下出现了一个 .git 文件夹。

image-20210413225234850

3.2、选择不提交到本地库的文件

在不打算提交的文件/目录中直接右键 –> Git –> 添加到 gitignore

3.3、将项目添加到暂存区

在项目/模块中点击右键 –> Git –> Add,将项目添加到暂存区,添加后可以看到项目文件变为绿色

image-20210413230902147

在项目/模块中点击右键 –> Git –> Commit Directory,提交到本地库,或者直接点击 Idea 文件的按钮即可。

image-20210413231315375

输入日志,提交

image-20210413231405284

可以看到正在分析代码

image-20210413231516888

3.4、使用 IDEA 进行版本切换

1、先复制要回退的版本的哈希值

在历史记录中选择要回退的版本,右击后选择 复制修订号

2、在模块中回退版本

右击模块–>Git–>Repository–>Reset HEAD,在To Commit处输入复制的修订号 b39036c13fcfb3eae8604edf15e1c45da0a1ba37

image-20210413233342364

然后选择重置即可。

3.5、创建分支及合并分支

1、创建分支

在 git –> Repository –> branchs 可以查看分支,添加分支

image-20210413233555178

点击新建分支即可创建新分支

2、切换分支

点击检出(checkout)即可

image-20210413233746021

3、合并分支

Git –> Merge Changes,选择要合并的分支,合并即可。

3.6、解决冲突

出现冲突的文件

image-20210413234019966

此时 IDEA 会弹出一个框,框中有三个选项

  1. 使用你的
  2. 使用他的
  3. 你自己手动进行合并,排除冲突

image-20210413234128451

点击 Merge 后会出现以下情况

image-20210413234219269

3.7、将本地库推送到 Gitee 远程仓库上

1、创建仓库,复制远程地址

最好复制 Https 地址。

2、推送到远程仓库

项目/模块上右键 –> Git –> Repository –> Push

image-20210413234615234

点击定义远程仓库

image-20210414095316690

3.8、从远程仓库上获取最新的数据以更新本地库

如果当前本地库不是在远程库最新版本上进行的修改,那么 push 会被拒绝,我们需要先从远程 pull 最新的远程库,然后进行修改,最后 push

  • 此时需要合并远程代码,并解决冲突(如果有)