Git
1 版本管理工具概念
在平时开发中,可能有时要用到上个版本的内容,例如:
领导让写文档,写好了,领导让修改,改好了,领导觉得第一版不错,改回来吧,此时内心一脸懵,第一版长啥样没存档啊
实际上,代码开发中也需要这样的软件来管理我们的代码. 例如我们经常会碰到如下的现象:
改之前好好的,改完就报错了,也没怎么修改啊
在这种情况下如果不能查看修改之前的代码,查找问题是非常困难的.
如果有一个软件能记录我们对文档的所有修改,所有版本,那么上面的问题讲迎刃而解.而这类软件我们一般叫做版本控制工具
版本管理工具一般具有如下特性:
能够记录历史版本,回退历史版本
团队开发,方便代码合并
2 主流版本管理工具介绍
Git
工作流程
1 | Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS),分为两种类型的仓库: |
Windows下载地址: Git - Downloading Package (git-scm.com)
Linux/Unix下载方法: Git (git-scm.com)
3 Git工作流程
4 命令行-- git基本操作
4.1 环境配置
- 打开Git Bash
- 设置用户信息
邮箱可以是假邮箱
1 | git config --global user.name “wwhds” |
- 查看配置信息
1 | git config --global user.name |
4.2 为常用指令配置别名
有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
4.2.1 如何定义和使用别名
要定义 Git 的别名,请使用 git config
命令,加上别名和要替换的命令。例如,要为 git push
创建别名 p
:
1 | git config --global alias.p 'push' |
你可以通过将别名作为 git
的参数来使用别名,就像其他命令一样:
1 | git p |
要查看所有的别名,用 git config
列出你的配置:
1 | git config --global -l |
无论使用哪种方法,定义别名都能改善你使用 Git 的整体体验。更多关于定义 Git 别名的信息,请看《Git Book》。
4.2.2 有用的 Git 别名
-
Git 单行日志
以单行方式显示你的提交,使输出更紧凑:
1
git config --global alias.ll 'log --pretty=oneline --all --graph --abbrev-commit'
--pretty=oneline
: 将每个提交的信息压缩为一行,只显示提交的哈希值和提交信息。--all
: 显示所有分支的提交历史记录,包括本地分支和远程分支。--graph
: 以图形化的方式显示提交历史记录,显示分支、合并等关系。--abbrev-commit
: 缩短每个提交的哈希值为7个字符,减少显示的字符数,方便查看。
使用这个别名可以提供所有提交的简短列表:
1
2
3
4
5git ll
* ea12179 (HEAD -> master, origin/master) 导出运营数据报表 后端开发结束
* 96f64fd 数据统计功能开发
* 8fba9e4 用户催单和接单提醒功能开发
* 8c96623 地址簿相关功能开发 管理端订单功能开发 用户端订单功能开发 微信支付模拟xxxxxxxxxx * ea12179 (HEAD -> master, origin/master) 导出运营数据报表 后端开发结束* 96f64fd 数据统计功能开发* 8fba9e4 用户催单和接单提醒功能开发* 8c96623 地址簿相关功能开发 管理端订单功能开发 用户端订单功能开发 微信支付模拟$ git ll33559c5 (HEAD -> master) Another commit17646c1 test1 -
Git 的最近一次提交
这将显示你最近一次提交的详细信息。这是扩展了《Git Book》中 别名 一章的例子:
1
git config --global alias.last 'log -1 HEAD --stat'
用它来查看最后的提交:
1
2
3
4
5
6
7
8
9
10git last
commit f3dddcbaabb928f84f45131ea5be88dcf0692783 (HEAD -> branch1)
Author: ricardo <ricardo@example.com>
Date: Tue Nov 3 00:19:52 2020 +0000
Commit to branch1
test2 | 1 +
test3 | 0
2 files changed, 1 insertion(+) -
Git 远程仓库
git remote -v
命令列出了所有配置的远程仓库。用别名rv
将其缩短:1
git config --global alias.rv 'remote -v'
-
Git 配置列表
gl
别名可以更方便地列出所有用户配置:1
git config --global alias.gl 'config --global -l'
现在可以查看用户配置了
1
2
3
4
5
6
7user.name=Wwhds
user.email=a1605691832@163.com
core.quotepath=false
alias.ll=log --pretty=oneline --all --graph --abbrev-commit
alias.last=log -1 HEAD --stat
alias.rv=remote -v
alias.gl=config --global -l
4.3 解决GitBash乱码问题
- 打开GitBash执行下面命令
1 | git config --global core.quotepath false |
- ${git_home}/etc/bash.bashrc 文件最后加入下面两行
1 | export LANG="zh_CN.UTF-8" |
4.4 获取本地仓库
要使用Git对我们的代码进行版本控制,首先需要获得本地仓库
-
在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库
-
进入这个目录中,点击右键打开Git bash窗口
-
执行命令git init
-
如果创建成功后可在文件夹下看到隐藏的.git目录。
4.5 基础操作指令
4.5.1 查看修改状态 (status)
1 | git status |
不同文件状态不同
- Untracked files 新创建的文件是未跟踪状态
- Changes to be committed 即将被提交
- Changes not staged for commit 修改并未添加至暂存区来提交
- nothing to commit,working tree clean 提交后显示没有东西可以提交
1 | On branch master |
4.5.1 添加工作区到暂存区(add)
1 | git add . |
- 作用:添加工作区一个或多个文件的修改到暂存区
将暂存区指定文件回退
1 | git reset "文件名" |
将暂存区全部文件回退
1 | git reset |
4.5.2 提交暂存区到本地仓库(commit)
1 | git commit -m '注释内容' |
- 作用:提交暂存区汇总所有内容到本地仓库的当前分支
- 命令形式:git commit -m ‘注释内容’
4.5.3 查看提交日志(log)
在4.2.2中设置了git log的别名并添加设置。
我们使用别名即可:
1 | git ll |
效果如下:
1 | * 34fa638 (HEAD -> master) file01 |
若想获得更详细的信息:
1 | git log |
效果如下:
1 | commit 34fa638efcb9fbe96b997a0cab2fe2dd73f8f15b (HEAD -> master) |
提交时候添加的备注会被放到日志中
4.5.4 版本回退
撤回到之前的某个操作,他回去删除我们撤回到位置之后的版本
- 作用:版本切换
- 命令形式:git reset --hard commitID
- commitID 可以使用 git-log 或 git log 指令查看
- 如何查看已经删除的记录?
- git reflog
- 这个指令可以看到已经删除的提交记录
我们可以在reflog里面知道删除文件的id,我们可以直接使用命令git reset --hard commitID 还原
所以
git reset --hard commitID既可以做版本回退,也可以做版本还原
4.5.5 添加文件至忽略列表
一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动
生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录
中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。
下面是一个示例:
先创建一个.gitignore文件
1 | touch .gitignore |
然后使用vi指令对.gitignore文件进行编辑
在其中插入*.txt
那么之后的提交便会无视.txt后缀的文件
4.5.6 基础操作指令练习
- 新建一个文件夹在其中初始化git仓库
1 | git init |
- 创建file01.txt并在其中写入"12345"
1 | touch file01.txt |
- 查看工作目录状态
1 | git status |
此时我们会看到:
1 | On branch master |
- 将file01.txt加入暂存区
1 | git add . |
- 将暂存区的file01.txt提交到本地仓库
1 | git commit -m 'file01.txt' |
- 修改file01.txt内容为"23333"并提交到本地仓库
1 | git add . |
- 利用别名查看日志
1 | git ll |
- 回退到第一次提交的版本
1 | git reset a8c40cb --hard |
4.6 分支
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离
开来进行重大的Bug修改、开发新的功能,以免影响开发主线。master是我们的主线
每个人开发的那一部分就是一个分支,使得每个人的开发互不影响,在每个人都开发完后就将所有的代码汇总到一起,此时就要执行分支的合并操作
工作区只能在一个分支工作,每个分支存放的文件或者资源是不一样的,就相当于不同的文件夹
4.6.1 查看本地分支
1 | git branch |
带星号的表示当前分支
4.6.2 创建本地分支(branch)
1 | git branch "分支名" |
创建的新分支会建立在当前分支的版本之上,所以新建的分支会有当前分支的内容
4.6.3 切换分支(checkout)
1 | git checkout |
我们还可直接切换到一个不存在的分支(创建并切换)
1 | git checkout -b |
4.6.4 合并分支(merge)
1 | git merge "分支名" |
注意:分支上的内容必须先提交,才能切换分支
一个分支上的提交可以合并到另一个分支
在每个人都开发完后就将所有的代码汇总到一起,此时就要执行分支的合并操作
当分支岔开时表示多个人在修改同一个文件
4.6.5 删除分支
不能删除当前分支,只能删除其他分支
1 | git branch -d b1 删除分支时,需要做各种检查 |
4.6.6 解决冲突
当我们合并分支后,两个或者多个分支对同一个文件的同一个地方进行修改的时候(不是同一个地方是不会出现冲突的 ),此时git就不知道要取哪个分支修改的值,是取a分支修改的值,还是取b分支修改的值呢,此时就产生了冲突
冲突时文件具体内容如下:
第一个count值表示的是当前分支修改的值
第二个count值是在dev分支修改的值
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解
决冲突,解决冲突步骤如下:
其实我们就是直接手动去删除文件中的一个分支,留下一个分支,这样就不会冲突了
- 处理文件中冲突的地方
- 将解决完冲突的文件加入暂存区(add)
- 提交到仓库(commit)
4.6.7 开发中分支使用原则与流程
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离
开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
在开发中,一般有如下分支使用原则与流程:
- master (生产) 分支
线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;
- develop(开发)分支
是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线
要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。
例如我们要开发新功能,我们要可以在develop分支上在建一个分支,新功能一般叫做feature分支,开发完以后在合并到 develop分支上面去,而不是直接提交到master分支,最后项目做完了develop在合并到master分支上
develop和master分支是不可删除的
- feature/xxxx分支(用完可删)
从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完
成后合并到develop分支,用完后可删除。
- hotfifix/xxxx分支,
从master派生的分支,一般作为线上bug修复使用,修复测试完成后需要合并到master、test、develop分支。
- 还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。