Git学习笔记
Git学习笔记
Git的工作流程

相关命令的解释如下:
clone:克隆,从远程仓库中克隆代码到本地仓库checkout:检出,从本地仓库中检出一个仓库分支然后进行修订add:添加,在提交前先将代码提交到缓存区commit:提交,提交到本地仓库。本地仓库中保存修改的各个历史版本fetch:抓取,从远程仓库,抓取到本地仓库,不进行任何合并动作,一般操作比较少pull:从远程库拉取到本地库,自动进行合并(merge),然后放到工作区,相当于fetch + mergepush:推送,修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
Git的安装与配置
下载与安装
下载地址:https://git-scm.com/download
双击下载得到的 .exe 文件即可得到下面两个工具

- Git GUI:Git提供的图形化工具
- Git Bash:Git提供的命令行工具
基本配置
设置用户信息
因为Git每次提交时都需要使用到用户的信息,所以需要设置优先设置用户的基本信息
# 设置用户的名称和邮箱,邮箱无需真实邮箱
git config --global user.name "TaiZai"
git config --global user.email "taizai@123.cn"
# 查看配置信息
git config --global user.name
git config --global user.email为常用指令配置别名
对于参数较多的常用指令,可以使用别名,打开用户目录 root,创建并编辑 .bashrc 文件,在此文件中进行别名的设置
# 用户Git提交日志的输出
# --all 显示所有的分支
# --pretty=oneline 将提交信息显示为一行
# --abbrev-commit 使得输出的commitId更简短
# --graph 以图的形式显示
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
# 用于输出当前目录所有文件及基本信息
alias ll='ls -al'在gitBash中执行 source ~/.bashrc 使配置生效
解决GitBash乱码问题
git config --global core.quotepath false
# 在${git_home}/etc/bash.bashrc 文件最后加入下面这两行
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"获取本地仓库以及基础操作命令
获取本地仓库
- 在电脑建立一个文件夹作为本地仓库
- 通过GitBash进入该文件夹所在目录执行
git init命令 - 若成功创建后即可在该文件夹看到
.git目录(默认隐藏的)
基础操作命令
Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git 的命令而发生变化

基础命令详解
| 命令 | 说明 | 命令形式 | |
|---|---|---|---|
git add | 添加工作区一个或多个文件的修改到暂存区 | `git add 单个文件名 | 通配符` |
git status | 查看修改的状态(暂存区、工作区) | git status | |
git commit | 提交暂存区内容到本地仓库的当前分支 | git commit -m "注释内容" | |
git log | 查看提交记录 | git log [options] | |
git reset | 版本切换 | git reset --hard commitId | |
git reflog | 查看已经删除的记录 | git reflog |
版本切换的功能比较强大,在上述练习中,如果将版本切换到创建并提交 text_01.xtx 文件的那次提交ID,则会丢失更新文件信息的状态,但是仍然可以再次进行版本切换到更新 text_01.txt 文件的那个版本。只要确保知道该提交版本的ID就行。此外,如果已经删除了的提交记录,无法通过 git log 查看时,仍然可以通过 git reflog 查看对应的ID。
添加文件至忽略列表
当本地仓库的有些文件不需要git进行管理时,即可将其添加至忽略列表,这样git进行文件管理时就会自动忽略这些文件。在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例
#忽略 .a 为后缀的文件
*.a
# 但是要跟踪库文件lib.a,即使你在上面忽略了.a文件
!lib.a
# 只忽略当前目录中的TODO文件,不要忽略子目录中的TODO文件或TODO文件夹。
# 忽略build/目录中的所有文件。
build/
# 忽略doc/notes.txt文件,但不忽略doc/server/arch.txt文件。
doc/*.txt
# 忽略doc/目录中的所有PDF文件。
doc/**/*.pdf分支
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线
分支的相关命令
| 命令 | 说明 |
|---|---|
git branch | 查看本地分支 |
git branch 分支名 | 创建本地分支 |
git checkout 分子名 | 切换本地分支 |
git checkout -b 分支名 | 创建并切换到分支 |
git merge 分支名 | 将一个分支合并到当前处于的分支上 |
git branch -d 分支名 | 删除分支,并做一系列检查 |
git branch -D 分支名 | 删除分支,并不做任何检查 |
关于分支之间文件的可见性
在当前分支上创建一个分支,那么当前分支所有已经操作并提交的版本,在创建的分支中都是可见的,但是未提交的均是不可见的。例如在 master 分支中创建一个文件 text.txt 但是未提交,此时再创建一个 wl_01 分支,初始时在 wl_01 分支中对文件 text.txt 是可见的,但是回到 master 分支后对文件进行提交,此时 wl_01 分支已经不可见 text.txt 文件了
总之,在一个分支中进行一些操作并且提交后,再其余分支中均是不可见的。
合并分支
如果要将分支 $A$ 合并到分支 $B$ 中,需要进行下列几部
- 进入分支 $B$
- 合并分支 $A$
将分支 $A$ 合并到分支 $B$ 中后,分支 $B$ 对分支 $A$ 中的文件会变成全部可见
如何解决合并分支时出现冲突
当两个分支上对相同文件的修改出现冲突时,例如同时修改了同一个文件中的同一行,此时就需要手动解决冲突
- 解决文件中冲突的地方
- 将文件添加至缓存区
- 提交到仓库再进行合并
开发中分支使用的原则和流程
- master(生产)分支,线上分支,主分支,中小规模项目作为线上运行的应用对应的分支
- develop(开发)分支,是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要合并到master分支中
- feature/xxx分支,从develop创建的分支,一般是同期并行开发。但不同期上线时创建的分支,分支上的任务完成后合并到develop分支
- hotfix/xxx分支,从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master、test、develop分支
- 其他分支,test分支用于代码测试,pre分支用于预上线

Git远程仓库
配置SSH公钥
便于访问远程仓库,配置SSH非对称密钥密钥对。
- 生成SSH公钥:
ssh-keygen -t rsa,不断回车即可,若已经存在密钥则会自动覆盖 - 查看公钥:
cat ~/.ssh/id_rsa.pub - 将公钥配置至gitee

- 查看是否配置成功:
ssh -T git@gitee.com

操作远程仓库
常用命令
| 命令 | 说明 |
|---|---|
git remote add <远端名称> <仓库路径> | 进行此操作时需要先创建本地仓库,然后建立于远端仓库的连接。 |
git remote | 查看远程仓库 |
git push | 将分支推送到远程仓库 |
git branch -vv | 查看本地分支与远程分支的关联关系 |
git clone <仓库路径> [本地目录] | 将远端仓库克隆到本地,若不指定本地目录则会自动生成一个和仓库名相同的文件夹 |
git fetch [远端名] [本地名] | 将仓库里的更新都抓取到本地,不会进行合并。 如果不指定远端名称和分支名,则抓取所有分支 |
git pull [远端名] [本地名] | 将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge 如果不指定远端名称和分支名,则抓取所有并更新当前分支 |
添加远程仓库
- 远端名称,默认是origin,便于分辨,最好不要使用其他的
- 仓库路径,从远端服务器获取的URL
- 命令的主要作用就是在本地添加一个远程仓库,仓库名是
<远端名称>
推送到远程仓库
完整命令:git push [-f] [--set-upstream] [远端名称] [本地分支名]:[远端分支名]
如果远程分支名和本地分支名相同,则可以省略远端分支名,直接写本地分支名即可,如:
git push origin master-f表示强制覆盖--set-upstream推送到远端的同时并且建立起和远端分支的关联关系,如:git push --set-upstream origin master如果当前分支已经和远端分支关联,则可以省略分支名和远端名,如:
git push直接将master分支推送到已经关联的远端分支
如何判断本地分支与远端分支的关联关系

