Git 简明教程

什么是 Git

Git 是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java 类、xml 文件、html 页面等),在软件开发过程中被广泛使用

Git 能做什么

  • 代码回溯:Git 在管理文件过程中会记录日志,方便回退到历史版本
  • 版本切换:Git 存在分支的概念,一个项目可以有多个分支(版本),可以任意切换
  • 多人协作:Git 支持多人协作,即一个团队共同开发一个项目,每个团队成员负责一部分代码,通过 Git 就可以管理和协调
  • 远程备份:Git 通过仓库管理文件,在 Git 中存在远程仓库,如果本地文件丢失还可以从远程仓库获取

我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有 GitHub、码云、GitLab 等,这里以码云为例进行讲解

Git 全局设置

当安装 Git 后首先要做的事情是设置用户名称和 email 地址。这是非常重要的,因为每次 Git 提交都会使用该用户信息。在 Git 命令行中执行下面命令:

  • 设置用户信息
1
2
git config --global user.name "coffeelize"
git config --global user.email "coffeelize@qq.com"

注意:上面设置的 user.name 和 user.email 并不是我们在注册码云账号时使用的用户名和邮箱,此处可以任意设置

  • 查看配置信息
1
git config --list

01-配置用户名和邮箱.png

获取 Git 仓库

要使用 Git 对我们的代码进行管理,首先需要获得 Git 仓库,获取 Git 仓库通常有两种方式

  • 在本地初始化 Git 仓库(不常用)
  • 从远程仓库克隆(常用)

在本地初始化 Git 仓库

  1. 在任意目录下创建一个空目录(例如 repo1)作为我们的本地 Git 仓库
  2. 进入这个目录中,点击右键打开 Git bash 窗口
  3. 执行命令 git init

初始化之后,目录中会多一个 .git 隐藏文件夹,命令行后会多出一个 master 分支
02-master主分支.png

注意:本地仓库不是从远程仓库克隆下来的,且本地仓库中若已经存放了一些文件,此时再从远程仓库拉去文件的时候可能会报如下所示的错误:fatal: refusing to merge unrelated histories(原因是本地仓库中含有本地仓库中文件的历史记录,远程仓库中包含远程仓库中文件的记录信息,这两者间完全没有联系,此时就需要将两者建立起联系)

016-本地仓库首次连接远程仓库报错.png

此时,可以通过如下命令解决

1
git pull origin master --allow-unrelated-histories

从远程仓库克隆

可以通过 Git 提供的命令从远程仓库进行克隆,将远程仓库克隆到本地

1
git clone 远程仓库地址

注:第一次克隆远程仓库时,可能需要登录 Git Credential Manage,即登录 Gitee 的账号,登录之后即可正常操作。同时登录之后,也会将一些验证信息保存到电脑当中,之后再次使用就不用再手动登录了

03-登录Gitee验证.png

工作区、暂存区、版本库

  • 版本库:前面看到的 .git 隐藏文件夹 就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
  • 工作区:包含.git 文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码
  • 暂存区:.git 文件夹中有很多文件,其中有一个 index 文件 就是暂存区。暂存区是一个临时保存修改文件的地方

Git 工作区中文件的状态

Git 工作区中的文件存在两种状态:

  • untracked:未跟踪(未被纳入版本控制)
  • tracked:已跟踪(被纳入版本控制)
    • Unmodified 未修改状态
    • Modified 已修改状态
    • Staged 已暂存状态

本地仓库常用操作

  • git status:查看文件状态
  • git add:将文件的修改加入暂存区
  • git reset:将暂存区的文件取消暂存或者是切换到指定版本
  • git commit:将暂存区的文件修改提交到版本库
  • git log:查看日志

git status

可以通过 git status 来查看当前状态
04-status查看状态.png

git add

1
git add fileName

git reset

每次 Git 提交都会产生新的版本号,通过版本号就可以回到历史版本

1
2
git reset --hard 版本号
git reset --hard 76b00c3fd44c92359d70e02cb4ff35c3acf90b40

git commit

1
2
git commit -m msg 文件名
git commit -m "提交一个文件" User.java

红色字体:未跟踪,也就是还没有纳入 git 的版本管理
绿色字体:文件已经放到了缓存区

git log

git log 命令的作用是查看提交日志;通过 git log 命令查看日志,可以发现每次提交都会产生一个版本号,提交时设置的 message、提交人、邮箱、提交时间等信息都会记录到日志中

05-log查看日志.png

远程仓库常用命令

  • git remote:查看远程仓库
  • git remote add:添加远程仓库
  • git clone:从远程仓库克隆
  • git pull:从远程仓库拉取
  • git push:推送到远程仓库

git remote

origin 表示远程仓库的简称

1
2
git remote
git remote -v

06-查看远程仓库简称.png

说明当前本地的仓库已经和远程的仓库之间建立好了连接了。如果输入以上两个命令没有返回值的话,说明这仅仅只是一个本地仓库

git remote add

1
git remote add 简称 远程仓库地址

注意

  • 一个本地仓库可以关联多个远程仓库
  • 这个简称我们习惯命名为 origin

比如我这边初始化了一个本地仓库,然后还有一个远程仓库,想要将这个本地仓库和远程仓库联系起来

1
git remote add origin https://gitee.com/coffeelize/repo1.git

此时再输入命令 git remote -v,即可查看是否已经关联成功

git clone

Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等)

1
git clone 远程仓库地址

git push

将本地仓库内容推送到远程仓库

1
2
git push 远程仓库简称 分支名称

先需要将文件提交到本地仓库 (add & commit),再推送到远程仓库

切换远程仓库

如果当前本地仓库需要链接到另一个远程仓库呢,怎么处理?
比如说本地仓库当前绑定的是 repo1 仓库,想要将本地仓库绑定到另外一个远程仓库 hellogit。当前如果已经连接到了一个远程仓库,是无法直接通过添加远程仓库 URL 来覆盖掉原来的 URL,如下图所示:

017-无法直接覆盖远程连接的URL.png

方式一:直接修改远程仓库地址,更换远程仓库地址

1
2
3
git remote set-url origin URL
git remote set-url orgin https://gitee.com/coffeelize/hellogit.git

方式二:先先删除当前连接的远程仓库地址,然后在添加

1
2
git remote rm origin
git remote add origin url

分支操作

分支是 Git 使用过程中非常重要的概念。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。

本地仓库和远程仓库中都有分支,同一个仓库可以有多个分支,各个分支相互独立,互不干扰。通过 git init 命令创建本地仓库时默认会创建一个 master 分支。

查看分支

  • git branch:列出所有本地分支
  • git branch -r:列出所有远程分支
  • git branch -a:列出所有本地分支和远程分支

创建分支

1
2
git branch 分支名称
git branch test

07-创建分支.png

切换分支

1
2
git checkout 分支名称
git checkout test

08-切换分支.png

推送至远程仓库分支

1
2
3
git push 远程仓库简称 分支名称
//将test分支推送到远程仓库
git push origin test

合并分支

1
2
git merge 分支名称
git merge test

分支合并时需注意合并的方向,是将命令中的分支合并到当前所在的分支

09-合并分支.png

在合并分支这种大操作下,会进入 vim 模式要求我们写日志,按照 vim 的操作即可

如果在合并当中遇到文件冲突,比如说主分支对 A 文件进行了修改,测试分支也对 A 文件进行了修改,然后在主分支中合并分支时,报如下错误:Automatic merge failed; fix conflicts and then commit the result.

10-合并分支报错.png

此时冲突的文件会自动加入如下内容。
011-合并后的冲突文件.png

假如我们是想要保留这两行,那么可以把这些自动生成的符号删除,然后还需要将这个有冲突的文件再 add 和 commit 一下,此时,仍然会有报错:
fatal: cannot do a partial commit during a merge.(不能在合并的时候只提交一部分)
012-合并解决冲突文件后再次报错.png

这个时候我们需要在 commit 后面添加一个 -i 参数,此时这个冲突被我们手动解决了,然后就可以正常 push 了

1
2
git commit -m "modify by me" testBranch.txt -i
git push origin master

标签操作

Git 中的标签,指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 、v1.2 等)。

查看标签

1
git tag

创建标签

1
2
git tag 标签名
git tag v0.1

删除本地标签

1
2
git tag -d 标签名
git tag -d v0.1

删除远程标签

1
2
git push origin :refs/tags/标签名
git push origin :refs/tags/v0.1

013-删除远程标签.png

将标签推送至远程仓库

1
2
git push 远程仓库简称 标签名
git push origin v0.1

014-将标签推送至远程仓库.png

检出标签

检出标签时需要新建一个分支来指向某个标签。会自动将某个 tag 中的内容检出到一个新的分支下面

1
2
git checkout -b 新建的一个分支名 标签名
git checkout -b aNewBranch v0.2

015-检出标签.png