第一章 快速入门
1.1 什么是git
Git 是一个分布式的版本控制软
- 软件: 类似qq, 等安装到电脑上才能使用的工具
- 版本控制,类似域毕业论文, 写文案等,需要反复修改和保留原历史数据
- 分布式 - 文件夹拷贝- 本地版本控制- 集中式版本控制- 分布式版本控制
1.2 为什么需要版本控制
1.2.1 版本控制软件
- 概念: 版本控制软件是一个用来记录文件变化,以便将来查阅特定版本修订情况的系统,因此有时也叫做“版本控制系统”。通俗理解把手工管理文件版本的方式,改为由软件管理文件的版本;这个负责管理文件版本的软件,叫做“版本控制软件”。
1.2.1 版本控制的好处
- 操作简便: 只需识记几组简单的终端命令,即可快速上手常见的版本控制软件
- 易于对比: 基于版本控制软件提供的功能,能够方便地比较文件的变化细节,从而查找出导致问题的原因
- 易于回溯: 可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态
- 不易丢失: 在版本控制软件中,被用户误删除的文件,可以轻松的恢复回来
- 协作方便: 基于版本控制软件提供的分支功能,可以轻松实现多人协作开发时的代码合并操作
1.2.2 版本控制系统分类
- 本地版本控制系统: 单机运行,使维护文件版本的操作工具化 - 特点: 使用软件来记录文件的不同版本,提高了工作效率,降低了手动维护版本的出错率- 缺点: 单机运行,不支持多人协作开发版本数据库故障后,所有历史更新记录会丢失
- 集中化版本控制系统: 联网运行,支持多人协作开发;性能差、用户体验不好 - 特点: 基于服务器、客户端的运行模式 - 服务器保存文件的所有更新记录- 客户端只保留最新的文件版本- 优点: 联网运行,支持多人协作开发- 缺点: 不支持离线提交版本更新,中心服务器崩溃后,所有人无法正常工作,版本数据库故障后,所有历史更新记录会丢失
- 分布式版本控制系统: 联网运行,支持多人协作开发;性能优秀、用户体验好 - 特点: 基于服务器、客户端的运行模式 - 服务器保存文件的所有更新版本- 客户端是服务器的完整备份,并不是只保留文件的最新版本- 优点: 联网运行,支持多人协作开发客户端断网后支持离线本地提交版本更新服务器故障或损坏后,可使用任何一个客户端的备份进行恢复
1.2.3 什么是Git
Git是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。可以快速高效地处理从很小到非常大的项目版本管理。
- 特点:项目越大越复杂,协同开发者越多,越能体现出 Git 的高性能和高可用性!
- 特性:直接记录快照,而非差异比较近乎所有操作都是本地执行
1.2.4 与SVN差异比较
传统的版本控制系统(例如 SVN)是基于差异的版本控制,它们存储的是一组基本文件和每个文件随时间逐步累积的差异。
好处:节省磁盘空间缺点:耗时、效率低 每次切换版本的时候,都需要在基本文件的基础上,应用每个差异,从而生成目标版本对应的文件。
1.2.5 Git记录快照
Git 快照是在原有文件版本的基础上重新生成一份新的文件,类似于备份。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
- 缺点:占用磁盘空间较大
- 优点:版本切换时非常快,因为每个版本都是完整的文件快照,切换版本时直接恢复目标版本的快照即可。
- 特点:空间换时间
几乎所有的操作都是本地执行
在 Git 中的绝大多数操作都只需要访问本地文件和资源,一般不需要来自网络上其它计算机的信息。
- 特性 - 断网后依旧可以在本地对项目进行版本管理- 联网后,把本地修改的记录同步到云端服务器即可
1.3 安装git
安装地址
: https://git-scm.com/downloads/win
1.4 基本概念
1.4.1 概念
版本库:: .git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等
工作区:: 包含.git文件夹的目录就是工作区, 也称为工作目录, 主要用于存放开发代码
暂存区:: .git文件夹中有很多文件, 其中有一个index文件就是暂存区, 也可以叫做stage, 暂存区是一个临时保存修改文件的地方
注意
: 工作区存放的是git未跟踪以及以修改的文件,进入暂存区还是被git所跟踪即被管理,被管理不代表已进版本库,需要将暂存区的文件,提交git会自行帮我们生成版本库(每次提交都会生成其对应的版本号)
1.4.2 工作区文件状态
Git工作区中的文件存在两种状态:
- untracked 未跟踪: 表示未被纳入版本控制
- tracked: 已跟踪: 表示被纳入版本控制 - Unmodified: 未修改状态- Modified: 已修改状态- Staged: 已暂存状态
注意: 这些文件状态会随着我们的执行Git的命令发生变化
1.5 Git基础 - 基本操作
1.5.1 获取Git仓库的两种方式
- 将尚未进行版本控制的本地目录转换为 Git 仓库
- 从其它服务器克隆一个已存在的 Git 仓库
1.5.2 在现有目录下初始化仓库
- 在项目目录中,通过鼠标右键打开
Git Bash
- 执行
git init
命令将当前的目录转化为 Git 仓库> git init 命令会创建一个名为 .git 的隐藏目录,这个 .git 目录就是当前项目的 Git 仓库,里面包含了初始的必要文件,这些文件是 Git 仓库的必要组成部分。
1.5.3 检查文件状态
通过
git status
这个命令检查命令查看文件处于什么状态
在上面的状态报告中可以看到新建的
index.html
文件出现在
Untracked files
(未跟踪的文件) 下面
未跟踪的文件意味着
Git
在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非明确地告诉它“我需要使用 Git 跟踪管理该文件”。
1.5.4 以精简方式显示文件状态
使用
git status
输出的状态报告很详细,但有些繁琐。如果希望以精简的方式显示文件的状态,可以使用如下两条完全等价的命令,其中
-s
是
--short
的简写形式:
# 以精简的方式显示文件状态
git status -s
git status --short
而未被跟踪文件前面有红色的??标记
1.5.5 跟踪新文件
使用命令
git add
开始跟踪一个文件。 所以,要跟踪 index.html 文件,运行如下的命令即可:
git add index.html
此时再运行
git status
命令,会看到 index.html 文件在
Changes to be committed
这行的下面,说明已被跟踪,并处于暂存状态:
在已跟踪但未提交时我们可以通过
git reset 文件名
方式 或
git reset .
将暂存区文件移出,再以精简的方式显示文件的状态:新添加到暂存区中的文件前面有绿色的 A 标记
注: git reset 文件名 指定的文件从暂存区移除 git reset . 只会将当前目录下的文件从暂存区移除
1.5.6 提交更新
现在暂存区中有一个 index.html 文件等待被提交到 Git 仓库中进行保存。可以执行
git commit
命令进行提交,其中
-m
选项后面是本次的提交消息,用来对提交的内容做进一步的描述:
git commit -m "新建了index.html文件"
提交成功之后,会显示如下的信息:
提交过后我们可以通过一下代码查看提交信息
git log
## 精简
git reflog
我们也可以查看文件状态
git status
会得到如下提示
此信息表示所有文件都处于
未修改
的状态;
没有任何文件需要被提交
1.5.7 对已提交的文件进行修改
index.html 文件已经被 Git 跟踪,并且工作区和 Git 仓库中的 index.html 文件内容保持一致。当我们修改了工作区中 index.html 的内容之后,再次运行 git status 和 git status -s 命令,会看到如下:
文件 index.html 出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。
注意:修改过的、没有放入暂存区的文件前面有红色的 M 标记
1.5.8 暂存已修改的文件
工作区中的 index.html 文件已被修改,如果要暂存这次修改,需要再次运行
git add
命令,这个命令是个多功能的命令,主要有如下 3 个功效:
- 可以用它开始跟踪新文件
- 把已跟踪的、且已修改的文件放到暂存区
- 把有冲突的文件标记为已解决状态
1.5.9 提交已暂存的文件
再次运行 git commit -m “提交消息” 命令,即可将暂存区中记录的 index.html 的快照,提交到 Git 仓库中进行保存:
工作流程:
1.5.10 撤销对文件的修改
撤销对文件的修改指的是:把对工作区中对应文件的修改,还原成 Git 仓库中所保存的版本。操作的结果:所有的修改会丢失,且无法恢复!危险性比较高,请慎重操作!
撤销操作的本质:用 Git 仓库中保存的文件,覆盖工作区中指定的文件。
1.5.11 向暂存区中一次性添加多个文件
如果需要被暂存的文件个数比较多,可以使用如下的命令,一次性将所有的新增和修改过的文件加入暂存区:
git add .
1.5.12 取消暂存的文件
如果需要从暂存区中移除对应的文件,可以使用如下的命令
git reset HEAD 要移除的文件名称
git reset 要移除的文件名称
git reset . 上面已经提过
1.5.13 跳过使用暂存区域
Git 标准的工作流程是工作区 → 暂存区 → Git 仓库,但有时候这么做略显繁琐,此时可以跳过暂存区,直接将工作区中的修改提交到 Git 仓库,这时候 Git 工作的流程简化为了工作区 → Git 仓库
Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:
## 它省略了 conmmit add 的操作 让其跳过添加暂存区 直接提交(其内部已经暂存了)
git commit -a -m "描述信息"
1.5.14 移除文件
从 Git 仓库中移除文件的方式有两种:
- 从 Git 仓库和工作区中同时移除对应的文件
- 只从 Git 仓库中移除指定的文件,但保留工作区中对应的文件
# 从 Git 仓库和工作区中同时移除 index.js文件
git rm -f index.js
# 只从 Git 仓库中移除 index.css, 但保留工作区中的 index.css 文件
git rm --cached index.css
1.5.15 查看提交历史
如果希望回顾项目的提交历史,可以使用 git log 这个简单且有效的命令。
# 按时间先后顺序列出所有的提交历史, 最近的提交排在最上面
git log
# 只展示最新的 n 条提交历史记录
git log -n
7 #在一行上展示最近 n 条提交历史的信息
git log -n --pretty=oneline
# 在一行上展示最近 n 条提交历史的信息, 并自定义输出的格式
# %h 提交的简写哈希值 %an 作者名字 $ar作者参订日期, 按多久以前的方式显示 %s提交说明
git log -2 --pretty=format: "%h | $an | %ar | %s"
第二章 分支
2.1 分支概念
分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!
所以在git中分支的使用非常重要, 使用分支意味着你可以把你的工作从开发主线上分离开, 以免影响主线开发,在同一个仓库可以有多个分支, 各个分支相互独立互不干扰,通过
git init
命名创建本地仓库时默认会创建一个master分支
2.2 master 主分支
在初始化本地 Git 仓库的时候,Git 默认已经帮我们创建了一个名字叫做 master 的分支。通常我们把这个 master 分支叫做主分支。
在实际工作中,master 主分支的作用是:用来保存和记录整个项目已完成的功能代码。因此,不允许程序员直接在 master 分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃
2.3 功能分支
我们不能直接在 master 分支上进行功能的开发,所以就有了功能分支的概念。功能分支指的是专门用来开发新功能的分支,它是临时从 master 主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到 master 主分支上,如图所示:
2.4 本地分支操作
2.4.1 查看分支列表
使用如下的命令,可以查看当前 Git 仓库中所有的分支列表:
git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有本地分支和远程分支
运行的结果如下所示:
注意:分支名字前面的 * 号表示当前所处的分支。
2.4.2 创建新分支
使用如下的命令,可以基于当前分支,创建一个新的分支,此时,新分支中的代码和当前分支完全一样:
git branch 新分支名称
图示如下:
2.4.3 切换分支
使用如下的命令,可以切换到指定的分支上进行开发:
git checkout 分支名称
图示如下:
J3-1732076907868)
2.4.4 分支快速创建和切换
使用如下的命令,可以创建指定名称的新分支,并立即切换到新分支上:
# -b 表示创建一个新分支
# checkout 表示切换到刚才新建的分支上
git checkout -b 分支名称
图示如下:
注意:“git checkout -b 分支名称” 是下面
两条命令的简写形式:
git branch 分支名称
git checkout 分支名称
2.4.5 合并分支
功能分支的代码开发测试完毕之后,可以使用如下的命令,将完成后的代码合并到 master 主分支上:
# 1. 切换到 master 分支
git checkout master
# 2. 在 master 分支上运行 git merge 命令, 将 login 分支代码合并到 master 分支
git merge login
图示如下:
注意: 合并代码是将指定分支合并到当前分支, 所以在开发完功能时, 因切换回主分支再合并!!!
2.4.6 删除分支
当把功能分支的代码合并到 master 主分支上以后,就可以使用如下的命令,删除对应的功能分支:
git branch -d 分支名称
图示如下:
2.4.7 遇到冲突时的分支合并
如果在两个不同的分支中,对同一个文件进行了不同的修改,Git 就没法干净的合并它们。 此时,我们需要打开这些包含冲突的文件然后手动解决冲突。
# 假设: 在 reg 分支 合并到 master 分支期间, 代码发生了冲突
git checkout master
git merge reg
# 打开包含冲突的文件, 手动解决冲突之后,再执行如下的代码
git add .
git commit -m "...."
第三章 远程分支操作
3.1 将本地分支推送到远程仓库
如果是第一次将本地分支推送到远程仓库,需要运行如下的命令:
# -u 表示把本地分支和远程分支进行关联, 只在第一次推送的时候需要带 -u 参数
git push -u 远程仓库的别名 本地分支名称:远程分支名称
# 实际案例:
git push -u origin payment:pay
# 如果希望远程分支的名称和本地分支名称保持一致, 可以对命令进行简化
git push -u origin payment
注意:第一次推送分支需要带 -u 参数,此后可以直接使用 git push 推送代码到远程分支。
3.2 查看远程仓库中所有的分支列表
通过如下的命令,可以查看远程仓库中,所有的分支列表的信息:
git remote show 远程仓库名称
3.3 跟踪分支
跟踪分支指的是:从远程仓库中,把远程分支下载到本地仓库中。需要运行的命令如下:
# 从远程仓库中, 把对应的远程分支下载到本地仓库, 保持本地分支和远程分支名称相同
git checkout 远程分支的名称
# 示例
git checkout pay
# 从远程仓库中, 把对应的远程分支下载到本地仓库, 并把下载的本地进行重命名
git checkout -b 本地分支名称 远程仓库名称/远程分支名称
# 示例:
git checkout -b payment origin/pay
3.4 拉取远程分支的最新的代码
可以使用如下的命令,把远程分支最新的代码下载到本地对应的分支中:
# 从远程仓库, 拉取当前分支最新的代码, 保持当前分支的代码和远程分支代码一致
git pull origin 需要拉取的分支名称
3.5 删除远程分支
可以使用如下的命令,删除远程仓库中指定的分支:
# 删除远程仓库中, 指定名称的远程分支
git push 远程仓库名称 --delete 远程分支名称
# 示例
git push origin -- delete pay
第四章 常见命令
4.1 第一阶段 项目开始
想要让git对一个目录进行版本控制需要以下步骤:
- 首先进入要管理的文件夹
- 个人信息配置: 用户名/邮箱 [配置一次即可]
git config --global user.emil "[email protected]"git config --global user.name "your Name"
> 通过 git config --global user.name 和 git config --global user.email 配置的用户名和邮箱地址,会被写入到 C:/Users/用户名文件夹/.gitconfig 文件中。这个文件是 Git 的全局配置文件,配置一次即可永久生效。 - 执行初始化命令
git init
- 管理目录下的文件状态
git status -sgit status --shortgit status 注: 新增的文件和修改过后的文件都是红色
- 管理指定文件 (红变绿)
git add 文件名 ---> 一次管理一个文件git add. ----> 将所有未管理的文件一次性管理
- 生成版本
git commit -m "描述信息"
- 查看版本记录
git log
- 获取帮助信息
# 要想打开 git config 命令的帮助手册git help config# 如果不想查看完整的手册, 那么可以用-h 选项获得更简明的help输出git con fig -h
4.2 第二阶段 扩展功能
git add
git commit -m "新功能"
4.3 第三阶段 回滚
- 回滚至之前版本
git loggit reset --hard "版本号"
- 回滚之后版本
git refloggit reset --hard 版本号
4.4 总结
git init 初始化
git add 添加至暂存区
git commit 提交
git log 日志
git reflog 详细日志
git reset --hard 回滚
git checkout 对工作区修改文件有效 让工作区已修改的文件 回退到 跟踪
git reset HEAD 对暂存区文件有效 让其回退到工作区
4.5 第四阶段 紧急修复BUG
4.5.1 分支
分支的作用就是给使用者提供多个环境,意味着你可以把自己的工作区从开发主线上分离, 以免影响开发主线
4.5.2 修复BUG方案
4.5.3 命令总结
- 查看分支
git branch
- 创建分支
git branch 分支名称
- 切换分支
git checkout 分支名称
- 合并分支
git merge 要合并的分支注意: 切换分支后再合并
- 删除分支
git branch -d 分支名称
4.5.4 工作流
4.6 第五阶段: 推送远端(基于Github)
4.6.1 上传代码
- 步骤如下:- 首先注册github账号,并创建远程仓库, 然后再执行命令,将代码上传到github
- 给远程仓库起别名
git remote add origin 远程仓库地址
- 给远程仓库起别名
- 向远程仓库推送代码
git push -u origin 分支
- 向远程仓库推送代码
4.6.2 拉取代码
- 克隆远程仓库代码
git clone 远程仓库地址 (内部实现了git remote add origin 远程地址)
- 克隆远程仓库代码
- 切换分支
git checkout 分支
- 切换分支
公司继续开发
- 切换到dev分支进行开发
git checkout dev
- 切换到dev分支进行开发
- 把master分支合并到dev[仅一次]
git merge master
- 把master分支合并到dev[仅一次]
- 修改代码…
- 提交代码
git add .git commit -m 'xx'git push origin dev
- 提交代码
4.6.3 家中继续开发
- 切换到dev分支进行开发
git checkout dev
- 云端拉取代码
git pull origin dev
- 写代码…
- 提交代码
git add .git commit -, 'x'git push origin dev
4.6.4 公司继续开发
- 切换到dev分支进行开发
git checkout dev
- 切换到dev分支进行开发
- 拉取最新代码(不必使用clone, 只需要通过pull获取最新代码即可)
git pull origin dev
- 拉取最新代码(不必使用clone, 只需要通过pull获取最新代码即可)
- 继续开发
- 提交代码
git add .git commit -m 'xx'git push origin dev
开发完毕, 代码上线
- 提交代码
- 将dev分支合并到master,进行上线
git checkout mastergit merge devgit push origin master
- 将dev分支合并到master,进行上线
- 把dev分支也推送到远程
git checkout devgit merge mastergit push origin dev
- 把dev分支也推送到远程
4.6.5 忘记提交代码
- 拉取代码
git pull origin dev
- 拉取代码
- 继续开发
- 提交代码
git add .git commit -m 'xx'注意: 忘记push了
- 提交代码
4.6.6 继续开发
- 拉取代码, 发现仓库中并没有上次公司的代码 忘记提交…
git pull origin dev
- 拉取代码, 发现仓库中并没有上次公司的代码 忘记提交…
- 继续开发其他功能
- 把dev分支也推送到远程
git add .git commit -m 'xx'git push origin dev
- 把dev分支也推送到远程
4.6.7 回到公司
- 拉取代码, 将在家写代码的代码拉倒本地(有合并, 可以能会发生冲突)
git pull origin dev
- 拉取代码, 将在家写代码的代码拉倒本地(有合并, 可以能会发生冲突)
- 如果有冲突, 手动解决冲突
- 继续开发其他功能
- 把dev分支也推送到远程
git add .git commit -m 'xx'git push origin dev
- 把dev分支也推送到远程
4.6.8 其他
git pull origin dev
等价于
git fetch origin dev
git merge origin/dev
4.6.9 快速解决冲突
- 安装Beyond compare
- 在git中配置
git config --local merge.tool bc3git config --local mergetool.path '安装路径'git config --local mergetool.keepBackup false
- 应用Beyond compare 解决冲突
git mergetool
4.7 总结
- 添加远程连接 (别名)
git remote add origin 地址
- 推送代码
git push origin dev
- 下载代码
git clone 地址
- 拉取代码
git pull origin dev等价于git fetch origin devgit merge origin/dev
- 保持提交整洁 (变基)
git rebase 分支
- 记录图形展示
git log --graph --pretty=format: "%h %s"
版权归原作者 D.eL 所有, 如有侵权,请联系我们删除。