Git 学习笔记
简介
Git 是一种分布式版本控制系统,和集中式版本控制系统相对,其特点是每个用户在本地都有一份完整的版本库。
Git 的优点:
- 直接记录快照,而非差异比较。如果文件没有更改,Git 不会重新存储该文件,而是建立一个链接,故能节省空间。
建议某转发文件存多份的互联网大厂好好学一下 - 近乎所有操作都是本地执行。不需要连接服务器,速度快,且可以在无网络的环境下工作
- 保证完整性。所有数据在储存前都会计算检验和
- 一般只添加数据。能够保证 Git 可以成功恢复之前的版本
文件的三种状态:
- 已提交 committed
- 已修改 modified
- 已暂存 staged
Git 的三个区域:
- 工作区
- 暂存区
- Git 目录
基本的 Git 工作流程如下:
- 在工作区中修改文件
- 将你想要下次提交的更改选择性地暂存。将更改的部分添加到暂存区
- 提交更新。将暂存区的文件的快照永久性存储到 Git 目录
起步
安装与美化
官网下载
把 Git Bash 添加到 Windows Terminal 中:
在 Windows Terminal 的配置文件中添加:
|
使用 PowerShell 命令来安装 oh-my-posh:
|
将其安装路径 C:\Users\你的用户名\AppData\Local\Programs\oh-my-posh\bin
添加 PATH
使用某一主题 jandedobbeleer.omp.json
,其它主题同理:
|
安装官方推荐使用的 Meslo LGM NF 字体,避免乱码:
- 下载其中的
Meslo.zip
- 安装字体
LGM
配置
可以通过以下命令查看所有的配置:
|
设置你的用户名和邮件地址:
|
获取帮助
|
基础用法
获取仓库
新建一个:
|
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件。
克隆现有的仓库:
|
记录每次更新到仓库
你的文件依次有四种状态:
- 未跟踪 untracked
- 未修改 unmodified
- 已修改 modified
- 已暂存 staged
检查当前文件状态:
|
跟踪新文件和暂存已修改的文件:
|
忽略文件:向 .gitignore
中添加要忽略的文件名或后缀(支持简化的正则表达式)
查看文件修改:
git diff
:检查当前文件和暂存区域快照之间的差异git diff --staged
:已暂存文件与最后一次提交的文件差异
提交更新:
|
如果是已经跟踪过的文件并修改了,为了省略再次 add
,可以给 commit 添加 -a
标记
移除文件:从 Git 中移除某个文件,即从已跟踪文件清单中移除,并连带从工作目录中删除指定的文件
|
仅从 Git 中移除某个文件,保留本地文件:
|
移动文件:因为 Git 关注文件的内容,所以一般来说无法记录改名操作,但可以手动记录毕竟科技以改名为本
|
查看历史
|
该命令会按时间先后顺序列出所有的提交,最近的更新排在最上面,并列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
常用选项
选项 | 说明 |
---|---|
-p |
按补丁格式显示每个提交引入的差异 |
--stat |
显示每次提交的文件修改统计信息 |
--shortstat |
只显示 --stat 中最后的行数修改添加移除统计 |
--name-only |
仅在提交信息后显示已修改的文件清单 |
--name-status |
显示新增、修改、删除的文件清单 |
--abbrev-commit |
仅显示 SHA-1 校验和所有 40 个字符中的前几个字符 |
--relative-date |
使用较短的相对时间而不是完整格式显示日期 |
--graph |
在日志旁以 ASCII 图形显示分支与合并历史 |
--pretty |
使用其他格式显示历史提交信息。可用的选项包括 oneline、short、full、fuller 和 format |
--oneline |
--pretty=oneline --abbrev-commit 合用的简写 |
限制 git log
输出的选项
选项 | 说明 |
---|---|
-<n> |
仅显示最近的 n 条提交 |
--since, --after |
仅显示指定时间之后的提交 |
--until, --before |
仅显示指定时间之前的提交 |
--author |
仅显示作者匹配指定字符串的提交 |
--committer |
仅显示提交者匹配指定字符串的提交 |
--grep |
仅显示提交说明中包含指定字符串的提交 |
-S |
仅显示添加或删除内容匹配指定字符串的提交 |
~~太长不看版:~~可以通过取别名自定义一个好用的 log
模式:
|
撤消操作
重新提交:
|
本质上是用一个新的提交替换旧的提交
从某个区域恢复指定文件 file
的方法:
- 从暂存区中恢复
file
到工作区:git restore [--worktree] file
- 从HEAD中恢复
file
到暂存区:git restore --staged file
- 从HEAD中恢复
file
到暂存区和工作区:git restore --staged --worktree file
- 从指定 commit 中恢复
file
到工作区:git restore --source=commitId file
远程仓库
查看远程仓库:
|
添加远程仓库:
|
从远程仓库中抓取与拉取:
|
这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
推送到远程仓库:
|
查看某个远程仓库:
|
这个命令列出了:
- 哪些远程分支不在本地,哪些远程分支已经从服务器上移除了
- 当你执行
git pull
时哪些本地分支可以与它跟踪的远程分支自动合并。 - 当你在特定的分支上执行
git push
会自动地推送到哪一个远程分支
远程仓库的重命名:
|
远程仓库的移除:
|
打标签
列出标签:git tag
创建标签::
- 轻量标签:
git tag 标签名
只是某个特定提交的引用 - 附注标签:
git tag -a 标签名 -m "信息"
其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息
后期打标签:
|
共享标签:git push
命令并不会传送标签到远程仓库服务器上,必须显式地推送标签到共享服务器上
|
删除标签:
- 本地删除:
git tag -d 标签名
- 删除远程标签:
git push origin --delete 标签名
别名
|
分支
分支创建与合并
分支创建:git branch 分支名
分支切换:git switch 分支名
分支创建并切换:git switch -c 分支名
切换到 commitId:git switch -d commitId
分支删除:git branch -d 分支名
分支合并:git merge 被合并的分支
遇到冲突时的分支合并:Git 会暂停下来,等待你去解决合并产生的冲突。Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。在你解决了所有文件里的冲突之后,对每个文件使用 git add
命令来将其标记为冲突已解决。一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
分支管理
如果不加任何参数运行 git branch
,会得到当前所有分支的一个列表
如果需要查看每一个分支的最后一次提交,可以运行 git branch -v
命令
变基
|
将当前分支变基到 目标分支
上
变基的本质:把当前分支的修改转移到目标分支上,使提交历史变成一条直线
变基的准则:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。即只是为了整理自己本地的提交历史才使用变基
git commit 信息
七项规则
-
用空行将主题与正文分开
-
将主题行限制为 50 个字符
-
将主题行大写
-
不要以句点结束主题行
-
在主题行中使用祈使语气
-
将正文换行为每行 72 个字符
-
用正文解释什么以及为什么与怎么做
文本编辑器
可以配置默认文本编辑器,当 Git 需要你输入信息时会调用它。如果未配置,Git 会使用操作系统默认的文本编辑器。
如果你想使用不同的文本编辑器,可以这样做:
|
亲自动手实现
没有什么比自己实现一个(简单的)git 更能掌握 git 的方法了