文章目录
在讲什么是git之前先来说说什么是版本控制系统以及分布式版本控制系统有哪些特点吧!!!以便我们更加理解git~
版本控制系统(软件)
什么是版本控制系统(软件)
版本控制系统(软件)是一个用来记录文件变化,以便将来查阅特定版本修订情况的系统。通俗来讲,版本控制软件是用来管理文件的各个版本的软件。
分布式版本控制系统的特点:
基于服务器、客户端的运行模式
① 服务器保存文件的所有更新版本
② 客户端是服务器的完整备份,并不是只保留文件的最新版本(集中化的版本控制系统的一个特点,典型代表:SVN)
分布式版本控制系统的优点:
① 联网运行,支持多人协作开发
② 客户端断网后支持离线本地提交版本更新
③ 服务器故障或损坏后,可使用任何一个客户端的备份进行恢复
什么是git
Git 是一个开源的分布式版本控制系统,是目前世界上最先进、最流行的版本控制系统。它可以快速高效地处理从很小到非常大的项目版本管理。
git的特性
Git 之所以快速和高效,主要依赖于它的如下两个特性:
① 直接记录快照,而非差异比较
Git 快照是在原有文件基础上生成一个新的文件,类似于备份,每次文件进行修改后,可以对修改后的文件进行备份。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
② 近乎所有操作都是本地执行
如果处于未联网状态,可以将修改后的文件先提交到本地,等联网后,再提交到云端的服务器。
git的基本概念
git的三个区域和对应的三种状态
工作区 => 已修改状态(modified)
暂存区 => 已暂存状态(staged)
仓库区 => 已提交状态(committed)
注意:
- 工作区的文件被修改了,但还没有放到暂存区,就是已修改状态。
- 如果文件已修改并放入暂存区,就属于已暂存状态。
- 如果Git仓库中保存着特定版本的文件,就属于已提交状态。
基本的 Git 工作流程
- 在工作区修改文件;
- 将下次要提交的更改进行暂存;
- 找到暂存区的文件,将快照提交到Git仓库,进行永久性的保存。
Git的相关命令
配置用户信息
// 用户名
git config --global user.name "itheima"
// 邮箱号
git config --global user.email "itheima@itcast.cn"
[注]:1. 如果使用了 --global 选项,那么该命令只需要运行一次,即可永久生效。
2. 配置信息存储在配置文件.gitconfig中,保存路径为:C:/Users/用户名文件夹/.gitconfig
查看配置信息
# 查看所有的全局配置项
git config --list --global
# 查看指定的全局配置项
git config user.name
git config user.email
获取帮助信息
git config -h
在现有目录中初始化仓库
git init
[注]:1. 执行初始化仓库后,在当前目录下会生成一个.git的隐藏目录,如下图。这个 .git 目录就是当前项目的 Git 仓库,里面包含了初始的必要文件,这些文件是 Git 仓库的必要组成部分。
如果不想要该目录下的文件被git控制,直接删除.git目录即可。
2. 补充知识点:
工作区中文件有 4 种状态:未被跟踪状态(Untracked)、未修改状态(Unmodified)、已修改状态(modified)、暂存状态(Staged)。
Git 操作的终极结果:让工作区中的文件都处于“未修改”的状态。
检查文件的状态
# 输出详细的状态报告
git status
# 以精简的方式显示文件状态
git status -s
git status --short
跟踪新文件或已修改文件到暂存区
# 添加单个文件
git add 文件名
# 添加目录下的所有文件
git add .
# 识别通配符-- 添加目录下所有名为index的文件
git add index.*
[注]:此处git add index.html也是对该文件进行跟踪。
提交更新
# 从暂存区提交
git commit -m "日志说明"
# 跳过暂存区,直接从工作区添加到Git仓库
git commit -a -m "日志说明"
[注]:日志说明必须要写,否则会报错。
对已提交的文件进行修改
将index.html修改后,查看该文件的状态:
暂存已修改的文件
用前面提到的git add命令
[总结]:git add命令的作用:
① 跟踪新文件
② 把已跟踪的且已修改的文件放到暂存区
③ 把有冲突的文件标记为已解决状态
取消暂存的文件
git reset HEAD 要移出的文件名称
撤销对文件的修改
把对工作区中对应文件的修改,还原成 Git 仓库中所保存的最近的一个版本。
git checkout -- 文件名
[注]:该命令不建议使用,会丢失工作区的所有修改,无法恢复,危险性较高!
移除文件
# 从 Git仓库和工作区中同时移除文件
git rm -f 文件名
# 只从 Git 仓库中移除,但保留工作区中的文件
git rm --cached 文件名
- 从Git仓库和工作区移除index.css文件
[注]:只有已跟踪的文件可以跳过暂存区直接提交到Git仓库,文件未被跟踪表示它未被git进行管理,因此也不能进行提交。 - 从Git仓库移除index.js文件
忽略文件
创建一个名为 .gitignore 的配置文件,列出要忽略的文件的匹配模式。被忽略的文件不会被 Git 管理,也不会出现在未跟踪文件列表。
① 以 # 开头的是注释
② 以 / 结尾的是目录
③ 以 / 开头防止递归
④ 以 ! 开头表示取反
⑤ 可以使用 glob 模式进行文件和文件夹的匹配(glob 指简化了的正则表达式)
- 星号 * 匹配零个或多个任意字符
- [abc] 匹配任何一个列在方括号中的字符 (此案例匹配一个 a 或匹配一个 b 或匹配一个 c)
- 问号 ? 只匹配一个任意字符
- 两个星号 ** 表示匹配任意中间目录(比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等)
- 在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)
实例:
# 忽略所有.a文件
*.a
# 前面忽略了所有.a文件,这里把lib.a排除在外,即.a文件中仅跟踪lib.a文件
!lib.a
# 只忽略当前目录下的done文件
/done
# 只忽略每一个目录下的done目录
done/
# 忽略doc目录下(doc的下一级目录)的所有.txt文件
doc/*.txt
# 忽略doc目录及其所有子目录下的所有.txt文件,不管是哪一级
doc/**.txt
查看提交历史
# 按时间先后顺序列出所有的提交历史,最近的提交在最上面
git log
# 只展示最新的两条提交历史,数字可以按需进行填写
git log -2
# 在一行上展示最近两条提交历史的信息
git log -2 --pretty=oneline
# 在一行上展示最近两条提交历史信息,并自定义输出的格式
# %h 简写的commitID %an 作者名字 %ar 作者修订日志 %s 提交说明
git log -2 --pretty=format:"%h | %an | %ar | %s"
回退到指定的版本
# 在一行上展示所有的提交历史
git log --pretty=oneline
# 使用 git reset --hard 命令,根据指定的提交 ID 回退到指定版本
git reset --hard CommitID
# 在旧版本中使用 git reflog --pretty=oneline 命令,查看命令操作的历史
git reflog --pretty=onelone
# 再次根据最新的提交 ID,跳转到最新的版本
git reset --hard CommitID
#回退到上一个版本
git reset --hard HEAD^