Git 简明教程
什么是 Git
Git 是一个分布式版本控制工具,主要用于管理开发过程中的源代码文件(Java 类、xml 文件、html 页面等),在软件开发过程中被广泛使用
Git 能做什么
- 代码回溯:Git 在管理文件过程中会记录日志,方便回退到历史版本
- 版本切换:Git 存在分支的概念,一个项目可以有多个分支(版本),可以任意切换
- 多人协作:Git 支持多人协作,即一个团队共同开发一个项目,每个团队成员负责一部分代码,通过 Git 就可以管理和协调
- 远程备份:Git 通过仓库管理文件,在 Git 中存在远程仓库,如果本地文件丢失还可以从远程仓库获取
我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有 GitHub、码云、GitLab 等,这里以码云为例进行讲解
Git 全局设置
当安装 Git 后首先要做的事情是设置用户名称和 email 地址。这是非常重要的,因为每次 Git 提交都会使用该用户信息。在 Git 命令行中执行下面命令:
- 设置用户信息
1 | git config --global user.name "coffeelize" |
注意:上面设置的 user.name 和 user.email 并不是我们在注册码云账号时使用的用户名和邮箱,此处可以任意设置
- 查看配置信息
1 | git config --list |
获取 Git 仓库
要使用 Git 对我们的代码进行管理,首先需要获得 Git 仓库,获取 Git 仓库通常有两种方式
- 在本地初始化 Git 仓库(不常用)
- 从远程仓库克隆(常用)
在本地初始化 Git 仓库
- 在任意目录下创建一个空目录(例如 repo1)作为我们的本地 Git 仓库
- 进入这个目录中,点击右键打开 Git bash 窗口
- 执行命令
git init
初始化之后,目录中会多一个 .git
隐藏文件夹,命令行后会多出一个 master 分支
注意:本地仓库不是从远程仓库克隆下来的,且本地仓库中若已经存放了一些文件,此时再从远程仓库拉去文件的时候可能会报如下所示的错误:fatal: refusing to merge unrelated histories(原因是本地仓库中含有本地仓库中文件的历史记录,远程仓库中包含远程仓库中文件的记录信息,这两者间完全没有联系,此时就需要将两者建立起联系)
此时,可以通过如下命令解决
1 | git pull origin master --allow-unrelated-histories |
从远程仓库克隆
可以通过 Git 提供的命令从远程仓库进行克隆,将远程仓库克隆到本地
1 | git clone 远程仓库地址 |
注:第一次克隆远程仓库时,可能需要登录 Git Credential Manage,即登录 Gitee 的账号,登录之后即可正常操作。同时登录之后,也会将一些验证信息保存到电脑当中,之后再次使用就不用再手动登录了
工作区、暂存区、版本库
- 版本库:前面看到的
.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
来查看当前状态
git add
1 | git add fileName |
git reset
每次 Git 提交都会产生新的版本号,通过版本号就可以回到历史版本
1 | git reset --hard 版本号 |
git commit
1 | git commit -m msg 文件名 |
红色字体:未跟踪,也就是还没有纳入 git 的版本管理
绿色字体:文件已经放到了缓存区
git log
git log 命令的作用是查看提交日志;通过 git log 命令查看日志,可以发现每次提交都会产生一个版本号,提交时设置的 message、提交人、邮箱、提交时间等信息都会记录到日志中
远程仓库常用命令
- git remote:查看远程仓库
- git remote add:添加远程仓库
- git clone:从远程仓库克隆
- git pull:从远程仓库拉取
- git push:推送到远程仓库
git remote
origin 表示远程仓库的简称
1 | git remote |
说明当前本地的仓库已经和远程的仓库之间建立好了连接了。如果输入以上两个命令没有返回值的话,说明这仅仅只是一个本地仓库
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 | git push 远程仓库简称 分支名称 |
先需要将文件提交到本地仓库 (add & commit),再推送到远程仓库
切换远程仓库
如果当前本地仓库需要链接到另一个远程仓库呢,怎么处理?
比如说本地仓库当前绑定的是 repo1 仓库,想要将本地仓库绑定到另外一个远程仓库 hellogit。当前如果已经连接到了一个远程仓库,是无法直接通过添加远程仓库 URL 来覆盖掉原来的 URL,如下图所示:
方式一:直接修改远程仓库地址,更换远程仓库地址
1 | git remote set-url origin URL |
方式二:先先删除当前连接的远程仓库地址,然后在添加
1 | git remote rm origin |
分支操作
分支是 Git 使用过程中非常重要的概念。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
本地仓库和远程仓库中都有分支,同一个仓库可以有多个分支,各个分支相互独立,互不干扰。通过 git init 命令创建本地仓库时默认会创建一个 master 分支。
查看分支
- git branch:列出所有本地分支
- git branch -r:列出所有远程分支
- git branch -a:列出所有本地分支和远程分支
创建分支
1 | git branch 分支名称 |
切换分支
1 | git checkout 分支名称 |
推送至远程仓库分支
1 | git push 远程仓库简称 分支名称 |
合并分支
1 | git merge 分支名称 |
分支合并时需注意合并的方向,是将命令中的分支合并到当前所在的分支
在合并分支这种大操作下,会进入 vim 模式要求我们写日志,按照 vim 的操作即可
如果在合并当中遇到文件冲突,比如说主分支对 A 文件进行了修改,测试分支也对 A 文件进行了修改,然后在主分支中合并分支时,报如下错误:Automatic merge failed; fix conflicts and then commit the result.
此时冲突的文件会自动加入如下内容。
假如我们是想要保留这两行,那么可以把这些自动生成的符号删除,然后还需要将这个有冲突的文件再 add 和 commit 一下,此时,仍然会有报错:
fatal: cannot do a partial commit during a merge.(不能在合并的时候只提交一部分)
这个时候我们需要在 commit 后面添加一个 -i
参数,此时这个冲突被我们手动解决了,然后就可以正常 push 了
1 | git commit -m "modify by me" testBranch.txt -i |
标签操作
Git 中的标签,指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 、v1.2 等)。
查看标签
1 | git tag |
创建标签
1 | git tag 标签名 |
删除本地标签
1 | git tag -d 标签名 |
删除远程标签
1 | git push origin :refs/tags/标签名 |
将标签推送至远程仓库
1 | git push 远程仓库简称 标签名 |
检出标签
检出标签时需要新建一个分支来指向某个标签。会自动将某个 tag 中的内容检出到一个新的分支下面
1 | git checkout -b 新建的一个分支名 标签名 |