简介

Git 是一种分布式版本控制系统,和集中式版本控制系统相对,其特点是每个用户在本地都有一份完整的版本库。

Git 的优点:

  • 直接记录快照,而非差异比较。如果文件没有更改,Git 不会重新存储该文件,而是建立一个链接,故能节省空间。建议某转发文件存多份的互联网大厂好好学一下
  • 近乎所有操作都是本地执行。不需要连接服务器,速度快,且可以在无网络的环境下工作
  • 保证完整性。所有数据在储存前都会计算检验和
  • 一般只添加数据。能够保证 Git 可以成功恢复之前的版本

文件的三种状态:

  • 已提交 committed
  • 已修改 modified
  • 已暂存 staged

Git 的三个区域:

  • 工作区
  • 暂存区
  • Git 目录

三种区域及其关系

基本的 Git 工作流程如下:

  • 在工作区中修改文件
  • 将你想要下次提交的更改选择性地暂存。将更改的部分添加到暂存区
  • 提交更新。将暂存区的文件的快照永久性存储到 Git 目录

起步

安装与美化

官网下载

把 Git Bash 添加到 Windows Terminal 中

在 Windows Terminal 的配置文件中添加:

"profiles":
{
"defaults": {},
"list":
[ # 找到此 list ,在里面添加如下
{
"guid": "{1cb09cbb-0365-91bf-c98f-d8d03c510274}",
"commandline": "%PROGRAMFILES%/git/usr/bin/bash.exe -i -l",
"icon": "%PROGRAMFILES%/Git/mingw64/share/git/git-for-windows.ico",
"name" : "Bash",
"startingDirectory" : "%USERPROFILE%",
"acrylicOpacity" : 0.75,
"closeOnExit" : true,
"colorScheme" : "Campbell",
"cursorColor" : "#FFFFFF",
"cursorShape" : "bar",
"fontFace" : "MesloLGM NF",
"fontSize" : 12,
"historySize" : 9001,
"padding" : "0, 0, 0, 0",
"snapOnInput" : true,
"useAcrylic" : true
},
]
}

使用 PowerShell 命令来安装 oh-my-posh

Set-ExecutionPolicy Bypass -Scope Process -Force; Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://ohmyposh.dev/install.ps1'))

将其安装路径 C:\Users\你的用户名\AppData\Local\Programs\oh-my-posh\bin 添加 PATH

使用某一主题 jandedobbeleer.omp.json其它主题同理:

oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\jandedobbeleer.omp.json"

安装官方推荐使用的 Meslo LGM NF 字体,避免乱码:

  • 下载其中的 Meslo.zip
  • 安装字体 LGM

配置

可以通过以下命令查看所有的配置:

git config --global --list

设置你的用户名和邮件地址:

git config --global user.name "old-driver-zero"
git config --global user.email 2771503468@qq.com

获取帮助

git 指令名称 --help

基础用法

获取仓库

新建一个

git init

该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件。

克隆现有的仓库

git clone 链接

记录每次更新到仓库

你的文件依次有四种状态:

  1. 未跟踪 untracked
  2. 未修改 unmodified
  3. 已修改 modified
  4. 已暂存 staged

检查当前文件状态

git status

跟踪新文件和暂存已修改的文件

git add 文件名

忽略文件:向 .gitignore 中添加要忽略的文件名或后缀(支持简化的正则表达式)

查看文件修改

  • git diff:检查当前文件和暂存区域快照之间的差异
  • git diff --staged:已暂存文件与最后一次提交的文件差异

提交更新

git commit -m "提交信息"

如果是已经跟踪过的文件并修改了,为了省略再次 add,可以给 commit 添加 -a 标记

移除文件:从 Git 中移除某个文件,即从已跟踪文件清单中移除,并连带从工作目录中删除指定的文件

git rm 文件名

仅从 Git 中移除某个文件,保留本地文件:

git rm --cached 文件名

移动文件:因为 Git 关注文件的内容,所以一般来说无法记录改名操作,但可以手动记录毕竟科技以改名为本

git mv 旧文件名 新文件名

查看历史

git log

该命令会按时间先后顺序列出所有的提交,最近的更新排在最上面,并列出每个提交的 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 模式:

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.lgg "log --no-merges --color --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.ls "log --no-merges --color --stat --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"

撤消操作

重新提交

git commit --amend

本质上是用一个新的提交替换旧的提交

从某个区域恢复指定文件 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 remote -v

添加远程仓库:

git remote add 简写 地址

从远程仓库中抓取与拉取

git fetch 远程仓库名(简写或地址)

这个命令会访问远程仓库,从中拉取所有你还没有的数据。执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。

推送到远程仓库

git push 远程仓库名 分支名称

查看某个远程仓库

git remote show 远程仓库名

这个命令列出了:

  • 哪些远程分支不在本地,哪些远程分支已经从服务器上移除了
  • 当你执行 git pull 时哪些本地分支可以与它跟踪的远程分支自动合并。
  • 当你在特定的分支上执行 git push 会自动地推送到哪一个远程分支

远程仓库的重命名

git remote rename 旧名字 新名字

远程仓库的移除

git remote rm 远程仓库名

打标签

列出标签git tag

创建标签::

  • 轻量标签:git tag 标签名 只是某个特定提交的引用
  • 附注标签:git tag -a 标签名 -m "信息" 其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息

后期打标签

git tag -a 标签名 校验和

共享标签git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签到共享服务器上

git push 远程仓库名 标签名
git push origin --tags # 一次推送所有标签

删除标签

  • 本地删除:git tag -d 标签名
  • 删除远程标签:git push origin --delete 标签名

别名

git config --global alias.ci commit

分支

分支创建与合并

分支创建git branch 分支名

分支切换git switch 分支名

分支创建并切换git switch -c 分支名

切换到 commitIdgit switch -d commitId

分支删除git branch -d 分支名

分支合并git merge 被合并的分支

遇到冲突时的分支合并:Git 会暂停下来,等待你去解决合并产生的冲突。Git 会在有冲突的文件中加入标准的冲突解决标记,这样你可以打开这些包含冲突的文件然后手动解决冲突。在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。

分支管理

如果不加任何参数运行 git branch,会得到当前所有分支的一个列表

如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令

变基

git rebase 目标分支

将当前分支变基目标分支

变基的本质:把当前分支的修改转移到目标分支上,使提交历史变成一条直线

变基的准则:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。即只是为了整理自己本地的提交历史才使用变基

git commit 信息

七项规则

  1. 用空行将主题与正文分开

  2. 将主题行限制为 50 个字符

  3. 将主题行大写

  4. 不要以句点结束主题行

  5. 在主题行中使用祈使语气

  6. 将正文换行为每行 72 个字符

  7. 用正文解释什么以及为什么与怎么做

文本编辑器

可以配置默认文本编辑器,当 Git 需要你输入信息时会调用它。如果未配置,Git 会使用操作系统默认的文本编辑器。

如果你想使用不同的文本编辑器,可以这样做:

git config --global "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

亲自动手实现

没有什么比自己实现一个(简单的)git 更能掌握 git 的方法了