Git使用教程
一、Git安装配置
1. Git下载安装
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
https://git-scm.com/install/桌面右键出现如下选项即为安装成功。

说明:
- Git GUI:Git提供的图形界面工具;
- Git Bash:Git提供的命令行工具。
2. Git的配置
安装完毕后,我们需要提供姓名及邮箱,来让Git确保每次用户操作都能落实到人。 如果不设置,某些涉及到用户的行为就无法完成。 类似于,淘宝上可以浏览列表页,一旦要买东西,就必须要登录。
打开Bash,按照以下命令执行(用户名与邮箱更换为自己的)。
设置用户名称 ;
bashgit config --global user.name "QingBeryl"设置用户邮箱 邮箱设置可以任意,没有邮箱校验;
bashgit config --global user.email "QingBeryl@163.com"查看配置信息。
bashgit config --global user.name git config --global user.email
事实上,Git的配置信息,都会保存在:C:\Users\用户.gitconfig。
3. 指令简化
有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
打开用户目录,创建.bashrc文件 部分windows系统不允许用户创建点号开头的文件,可以打开gitBash,执行
touch ~/.bashrc;在.bashrc文件中输入如下内容;
bash# 声明 简化名 = 简化命令 alias git-log='git log --pretty=oneline --abbrev-commit --all --graph --decorate'打开gitBash,执行以下代码使配置生效。
bashsource ~/.bashrc
4. 乱码解决
打开GitBash执行下面命令;
bashgit config --global core.quotepath false${git home}/etc/bash.bashrc文件最后加入下面两行。bashexport LANG="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8"该操作适用于解决Git Bash中中文显示乱码问题,如无该问题则忽略该操作。
二、获取本地仓库
要使用Git对我们的代码进行版本控制,首先需要初始化本地仓库。
在电脑的任意位置创建一个空目录(非空也行),作为我们的本地Git仓库;
进入这个仓库,右键选择Git Bash打开;
执行以下命令初始化本地仓库;
bashgti init如图所示即可:

如图所示,在文件夹中可以看到一个
.git文件夹即为初始化成功。
三、基础操作指令
Git工作目录下对于文件的修改(增加、删除、修改)会存在几个状态,这些修改会随着我们执行Git命令而发生变化。
说明:Git工作目录指文件夹中除.git文件夹中的内容外的所以内容。

1. 查看文件状态
可以使用如下命令来查看文件的状态。
git status如图所示为文件的三种状态(untracked、unstaged、staged):

如图所示即是所有文件都已提交到本地仓库:
2. 工作区到暂存区
我们可以使用如下命令将指定文件由工作区添加到暂存区。
git add 文件名或者也可以使用下面的命令将工作区未跟踪和未暂存的所有文件全部添加到暂存区。
git add .如图所示,运行命令后如没有报错,即为成功,同时可以使用查看文件状态命令检查是否成功。

3. 暂存区到本地仓库
文件添加到暂存区后,即可通过如下命令提交到本地仓库,形成一次提交记录;
git commit -m 注释或者可以去掉-m 注释直接提交,则会打开vi编辑器,可在其中输入注释,适用于注释很长的情况。
git commit注释即为每次提交的解释说明,方便团队或个人辨别每次提交的内容,英文与中文都可;此处命令注释不能为空,若需要注释为空这需要使用如下的强制提交命令,但会导致提交信息模糊,团队协作时难以追溯改动,仅适用于本地临时草稿提交。
git commit --allow-empty-message -m ""如图所示即为提交成功:

4. 查看提交日志
当讲代码提交到了本地仓库以后,我们可以查看提交的历史记录,可以使用一下命令:
git log效果如图所示:

当有大量提交记录时,使用git log指令查看记录会不方便,此时我们可以使用如下指令,更直观明了:
git-log效果如图所示:

说明:该指令为简化后指令,简化前为git log --pretty=oneline --abbrev-commit --all --graph --decorate。
5. 版本回退
使用git管理代码的一个重要原因便是git可以进行版本回退,浏览编辑之前的提交,版本回溯分别为三种方式。
soft
取消提交,暂存区和工作区都不回溯,即仅取消commit操作,不取消add操作,适用于合并多次commit,修改提交备注;
bashgit reset --soft commitIDmixed
取消提交,暂存区文件回溯,工作区文件不回溯,即取消commit、add操作,适用于取消
git add操作;bashgit reset --mixed commitIDhard
取消提交,暂存区和工作区都回溯,适用于彻底回到某个版本。
bashgit reset --hard commitID
说明:commitID(提交哈希值)为每次提交生成的唯一40位十六进制字符串,相当于每个版本的身份证,使用时取前七位即可。

6. 添加文件至忽略列表
一般我们总会有些文件由于各种原因无需纳入Git管理,也不希望它们总出现在未跟踪文件列表中。这列文件通常都是一些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件,以及视频之类的大文件等。在这种情况下,我们可以在工作目录中创建一个名为.gitignore的文件(文件名固定),列出要忽略的文件(可使用通配符)。下面是一个示例:
*.a
!lib.a
/TODO
build/
doc/*.txt
doc/**/*.pdf三、分支操作
几乎所有版本控制系统都有类似分支的功能,使用分支意味着你可以把你的工作从开发主线上分离开来进行重大Bug的修改、开发新的功能,以免影响开发主线。
1. 创建本地分支
使用如下命令可以创建本地分支:
git branch 分支名如图所示无报错即为创建成功:

2. 查看本地分支
使用如下命令可以查看:
git branch结果如图所示:

3. 切换分支
使用如下命令可切换至对应分支:
git checkout 分支名如图提示即为切换成功:

平时正常情况下在Git界面的路径后方会显示目前处于那个分支,如图所示则分别处于master分支和dev分支:

当使用git-log命令后,HEAD ->所指向的分支即为目前所处分支,如图所示:

上述情况两个分支的提交是一模一样的,所以在一起,当两个分支提交有差异后,会呈现如图所示效果,从update1提交开始分为了两条线,一条master上的mastercommit提交,一条dev上的devcommit提交,可随时在两条分支间来回切换,切换后工作区文件也将改变。

我们还可以直接切换到一条不存在的分支(创建并切换),使用如下命令:
git checkout -b 分支名说明:切换分支前应该先将工作区和暂存区的所以改动全部提交到本地仓库后再进行分支的切换。
4. 合并分支
使用如下命令,可以将一个分支上的提交合并到另一个分支上,代码含义为将**分支名上的提交合并到现在的分支**。
git merge 分支名使用如上命令后会进入vi编辑器,可在其中添加注释(有默认内容),同commit提交,如图所示:

合并后使用git-log效果如图:

合并的原理并不是比较两个分支的差异,而是比较两个分支相对于对于共同的祖先的修改。如下实例:
场景一:
公共分支master:无
test.py文件A分支:新增
test.py文件B分支:无改变
A合并到B:B分支新增
test.py文件B合并到A:A分支无改变
场景二:
公共分支master:有
test.py文件A分支:删除
test.py文件B分支:无修改
A合并到B:B分支删除
test.py文件B合并到A:A分支无变化,不会因为B分支文件存在合并后A分支删除的文件也存在,无修改的分支合并到有修改的分支,即使是删除也无变化。
5. 删除分支
说明:不能删除当前所在分支,只能删除其它分支,若要删除当前分支,可先切换到其它分支。
使用如下命令删除分支时需要各种检查,适用于删除已经合并到主分支的分支:
git branch -d 分支名使用如下命令删除分支时不做任何检查,强制删除,适用于删除未合并到主分支但已废除的分支:
git branch -D 分支名6. 冲突解决
当对两个分支上的文件同时进行修改时,例如同时修改同一个文件的同一行,可能会存在冲突,此时自动合并无法完成,需要手动解决冲突后再继续合并,步骤如下:
- 处理文件中冲突的地方;
- 将解决完的文件添加到暂存区;
- 提交到本地仓库。
流程如下图:

说明:处理冲突也可以直接在文件中进行编辑,在idea中更加清晰明了。
7. 开发中分支使用原则与流程
几乎所有的版本控制系统,都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
master(生产/主)分支
线上分支,主分支,中小规模项目作为线上运行的应用对应分支;
develop(开发)分支
是从master创建的分支,一般作为主要的开发分支,如果没有其他并行开发要求,都可 以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线;
feature/xxxx分支
从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支,然后删除;
hotfix/xxxx分支
从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支;
还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。

四、Git远程仓库
1. 常见的代码托管服务
前面我们介绍了Git本地仓库,代码存放在本地自己的电脑上,但如此代码还是有丢失的风险,此时我们可以搭建一个远程仓库,将代码推送到远程仓库中,即使本地代码丢失,还可以从远程仓库中拉取回来。常见的远程仓库有如下三种:
- Github:一个面向开源项目的代码托管平台,因服务器在国外,国内访问速度可能较慢;
- Gitee:国内的一个代码托管平台,访问速度更快;
- GitLab:一个仓库管理系统的开源项目,私密性更好。
本教程以Github为例讲解,注册过程略。
2. 创建远程仓库
打开Github,登陆账号,点击头像,选择Repositories(仓库)进入。

点击New创建一个新的仓库。

填写好仓库信息后点击Create repository(创建仓库)创建仓库。

3. 配置SSH公钥
输入如下命令生成SSH公钥:
ssh-keygen -t rsa随后一路回车,直到出现如下界面即为成功:

输入如下命令查看生成的SSH公钥:
cat ~/.ssh/id_rsa.pub结果如图所示,将结果复制备用:

打开Github,进入设置:

点击添加新的SSH公钥:

将刚才复制的内容填写到框中,名称随意,然后点击Add SSH key(添加SSH公钥):

输入以下命令验证配置是否成功:
ssh -T git@github.com如图所示即为成功:

4. 添加远程仓库
执行以下命令,将本地仓库与远程仓库链接,远端名称好记即可,后续每次推送都需要,一般默认为origin;
git remote add <远端名称> <远程仓库路径>远端名称:远端名称好记即可,后续每次推送都需要,一般默认为origin;
远程仓库路径:获取远程仓库路径,在Github打开新建的仓库,选择SSH,复制后方的路径,如图所示:

执行结果如图所示:

5. 查看远程仓库
使用如下命令可以查看已有的远程仓库:
git remote结果如图所示:

6. 推送到远程仓库
使用如下命令可以将本地代码推送到远程仓库:
git push [-f] [远端名称] [本地分支名]:[远端分支名]效果如图所示:

- [本地分支名] :[远端分支名]:若两个名称相同,那么可以只写一个,一般情况下都是相同的;
- [远端名称]:添加远程仓库时设置的,默认为
origin,远程仓库可以有多个; - -f:强制推送覆盖远程仓库中的代码。
说明:首次推送时会需要验证身份,输入Github的账号密码即可,如图所示:

7. 本地分支与远程分支的关联关系
在git push命令后添加以下参数,可以建立本地分支与远程分支的关系,使用后后续推送可省略git push后的所有内容:
git push --set-upstream [远端名称] [本地分支名]使用如下命令可以查看本地分支与远程分支的付对应关系:
git branch -vv效果如图所示:

8. 从远程仓库克隆
使用如下命令,可以将已有的一个远程仓库克隆到本地:
git clone <远程仓库路径> <本地路径>说明:本地路径可以省略,会自动生成一个目录。
效果如图所示:

9. 从远程仓库抓取和拉取
抓取:将仓库里的更新都抓取到本地,但不进行合并,需额外使用
merge命令合并分支;命令如下:
bashgit fetch <远端名称> <分支名>效果如图所示:


拉取:将仓库里的更新都拉取到本地并进行合并,等同于
fetch+pull。命令如下:
bashgit fetch <远端名称> <分支名>效果如图所示:

说明:如果该分支前面配置了与远程分支的关联,则远端名称与分支名可以省略。
10. 冲突解决
在一段时间,A与B用户修改了同一个文件的同一行代码,此时会发生合并冲突。
A用户在本地修改代码后较先推送到远程仓库,此时B在本地修改代码后也要推送到远程仓库,B晚于A,此时B会出现如图所示情况,则是产生了冲突。

故需要先抓取远程仓库的提交到本地,经过合并解决冲突后才能推送到远程仓库,如图所示:

远程分支也是一种分支,所以合并时冲突的解决方式也和解决本地分支冲突相同,此处不再赘述。
附:几条铁令
- 切换分支前先提交本地的修改;
- 代码及时提交,提价了就不会丢;
- 不要删除仓库。
附:疑难问题解决
1. windows无法创建以.开头的文件
这里以创建.gitignore为例,在对应目录打开git终端,使用如下命令创建文件:
touch .gitignore效果如图所示:

2. windows下看不到隐藏的文件、
有时使用命令初始化了本地仓库,在windows中的文件夹中却看不到.git文件夹,此时只需打开此电脑,点击查看,将隐藏的项目勾选即可,如图所示:

附:Git常用指令速查
基本操作类
- git init 初始化仓库
- git-log 查看提交日志
- git add <文件名> 添加到暂存区
- git commit -m <注释> 提交到仓库
- git merge <分支名> 合并分支
分支切换类
- git checkout <分支名> 切换到某个分支
- git checkout -b <分支名> 创建并切换到某个分支
远程操作类
- git clone <远程仓库路径> 克隆仓库
- git push <远端名称> <本地分支名> 推送提交到远程仓库
- git pull 拉取远程仓库的修改并合并
附:约定式提交结构
1. 完整的提交信息结构
<type>: <简短描述>
空行
<详细描述>2. 常用的提交类型
| 类型 | 用途 |
|---|---|
| feat | 新功能 |
| fix | 修复bug |
| docs | 仅文档变更 |
| style | 不影响代码逻辑的格式调整(空格、缩进、分号等) |
| refactor | 代码重构(既不加新功能也不修Bug) |
| test | 添加或修改测试代码 |
| chore | 杂务(依赖更新、构建任务、配置修改等) |
| perf | 性能优化 |
| build | 影响构建系统或外部依赖的变更(如webpack、npm、gulp) |