惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

Dejavu's Blog

使用 auto-cpufreq 平衡 Linux 性能功耗 哪吒监控面板部署教程 NodeBB 论坛部署教程 Scaleway VPS 安装 Alpine Linux 甲骨文 ARM 实例部署 Gemma 4 模型 Headscale + Tailscale 组建虚拟专用网 在 Linux 上使用 Yubikey OpenPGP 应用 BuyVM VPS 块存储挂载教程 Alpine Linux 服务器配置指南 Alpine Linux 安装 Cloudflared Docker 多容器共享中心数据库 安装 Komari 服务器监控工具 Scaleway VPS 安装 Debian Linux Debian 13 下部署 AsmBB 论坛 使用 Kopia 自动化备份服务器数据 给 Docker 启用 IPv6 支持 Netcup 服务器安装自定义 ISO 镜像 在 Debian 13 上自托管 Mox 邮局 使用 Stalwart 自托管邮局服务 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 我的 2025 年度自托管服务报告 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 自托管部署 Pocket ID 与 Tinyauth 完全指南 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 新到手的 Linux 服务器,我这样设置 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 在 n8n 中使用 Ollama 的本地 LLM 模型 简体中文互联网在变得糟糕吗? 如何低成本申请 S/MIME 证书用于个人邮件服务 迁移到 NameCrane Mail 域名邮箱套件服务 香烟与咖啡 联系我 Now 近况 在 Windows 中使用 Yubikey 的 OpenPGP 应用 Windows 11 IoT LTSC 养老指南 巧用浏览器生成 HAR 文件批量下载所需网页资源 聊聊静态网站的评论系统 在 Hugo 站点中优雅地展示实况照片 使用 snac 部署一个简洁优雅的 ActivityPub 实例 当 25 岁来临的时候 断网的这两年 从 Bitwarden/Vaultwarden 到 KeePassXC 更新日志 也许是 Android 上最好的本地播放器 - 椒盐音乐 2023 半年小结 写一个好玩的 Hugo 货币汇率转换短代码 写一个 Hugo 短代码将不同类别的总字数统计转换为书名显示 海信 Touch Lite 墨水屏音乐阅读器的简单体验 从 Debian 11(bullseye) 无感升级到 Debian 12(bookworm) 使用 GitHub Actions 自动提交 URL 到 IndexNow 批量重写 Git 历史提交记录 使用 cgit 托管小小的也很可爱的 Git 服务器 在 Debian 上使用 stagit 和 Nginx 的简单 Git 服务器 托管简单 Git 服务器的一些尝试 使用 stagit 自托管纯静态 Git 存储库 使用 Docker 快速部署单人 Fediverse 实例 我是如何建立自己的个人博客的? 简单、隐私友好的谷歌分析替代品,Plausible 自托管部署指南 服务器使用 Cloudflare CDN 的最佳实践 甲骨文服务器分配并启用 IPv6 地址 Git 版本控制学习笔记(二) Cloudflare WAF 防护策略简易指南 Mastodon 服务器批量导入自定义表情 低成本自托管 Mastodon 实例简明指南 自托管服务指南──有了服务器可以做什么? 使用 Miniflux + RSSHub 打造个人 RSS 阅读器 构建支持多种 CPU 架构的 Docker 镜像 一个可自托管的静态短链接应用 别了,二〇二二! Duplicacy CLI 进阶使用指南 Duplicacy CLI 备份工具的基本使用 初探 Cloudflare 零信任 - 通过 Docker 部署 Bitwarden 密码管理器 Yubikey 转运日志及上手指南 初探 Cloudflare 零信任 — 通过 Cloudflare Tunnel 搭建 SSH 聊天室 初探 Cloudflare 零信任 - 通过 Cloudflare Tunnel 访问服务 某科学的 PGP 算号指南 版权声明 2022 年的 MacBook Air M1 使用体验及应用推荐 使用 Vercel 和 Supabase 自托管 Cusdis 评论系统 为什么你的搜索引擎不好用? 个人在 Windows 上常用软件清单 macOS 基础开发环境设置指南 在 macOS 上使用 Canokey 的 OpenPGP 应用 提取 Windows UWP 应用商店的安装包以供离线安装 使用 Notion 管理 GitHub Star 项目 使用 Vercel 免费部署 Giscus 评论系统 将博客评论从 Utterances 无缝迁移到 Giscus Canokey 签名和认证应用指南
Git 版本控制学习笔记(一)
2022-04-03 · via Dejavu's Blog

前言

Git 是一个分布式版本控制系统,每次用户提交更新或在 Git 中保存项目状态时,它主要对当时的全部文件制作一个快照并保存这个快照的索引。 为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个连结指向之前存储的文件。 Git 对待数据更像是一个 快照流

Git Flow

Git 数据库中保存的信息都是以文件内容的哈希值(SHA-1)来索引,而不是文件名,Git 中所有数据在存储前都计算校验和,然后以校验和来引用

Git 主要工作区域:Git 存储仓库1、工作目录2、暂存区域3

Git WorkSpace

不同系统下安装 Git 过程略微有些不同,请参阅 Git - Downloads

配置用户信息

安装完 Git 后首要任务是配置你的用户名(username)邮件地址(email address),接下来我们在 Git 中的每一次提交都会使用这些信息

git config --global user.name "[username]"
git config --global user.email "[email address]"
# [可选] 启用带帮助的彩色命令行输出
git config --global color.ui auto
# 对于 Windows 用户,建议额外执行下面两条配置
git config --global core.autocrlf true
git config --global core.safecrlf warn

--global 参数表示全局配置选项,带上该参数后我们在这台计算机上所有的 Git 操作默认情况下都会使用上面这些信息

如果要在某个 Git 存储仓库设置其他的的用户信息,可以在这个存储仓库内单独设置用户名程和邮件信息(不带 --global 参数)

检查配置

配置完成后,检查下你的配置

# 检查现在的配置
git config --list
# 获得 config 命令手册
git help config

创建新存储库

如果要创建一个新的存储库,可以从本地创建,也可以在 GitHub 上 clone 一个现有的存储库

创建本地存储库

比如,我现在想要用来演示的 Git 存储库名为 git-tour

第一种方式是在当前目录下新建一个 Git 存储库

# 手动新建一个名为 git-tour 的文件夹(如果该目录不存在)
mkdir git-tour && cd git-tour
# 初始化 Git 存储库
git init

还有一种方式是创建一个空白目录,并在该目录初始化一个 Git 存储库

# 用法: git init [git-repo-name]
# 比如: 创建一个名为 git-tour 的文件夹并初始化为一个 Git 存储库
git init git-tour

从远程拉取存储库

如果想要创建一份现有 Git 存储仓库上的拷贝到本地,使用 git clone [url] 命令,默认情况下,会将该 Git 仓库的所有版本历史都克隆下来

# GitHub HTTPS 协议
git clone https://github.com/MoeOffice/git-tour.git
# 或者使用 GitHub SSH,用法: git clone user@server:path/to/repo.git
git clone [email protected]:MoeOffice/git-tour.git

Git 下的文件生命周期

在一个 Git 存储仓库下,所有的文件只有两种状态:已追踪(tracked)4和未追踪(untracked)5

Git Life Cycle

跟踪文件

使用 git add 命令指定对特定文件的追踪,比如在 git-tour 工作目录下新建一个 a.txt 文件(内容为 Hello World!),要对其进行追踪

git add a.txt

使用 git status 命令查看当前 Git 工作目录下的文件变动状态

git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   a.txt

关于 git status -s 命令6,举个例子:

git status -s
M LICENSE        # LICENCE 文件被修改了单还没放入暂存区域
MM README.md      # README.md 在工作区被修改后提交到暂存区域然后在工作区又被修改了
A  HEAD.md        # HEAD.md 文件被新添加到暂存区域 
M  src/index.html # src/index.html 文件被修改后添加到暂存区域
?? 1.txt          # 1.txt 文件是新添加且未跟踪

忽略文件

我们不希望一些文件被纳入 Git 管理或被跟踪,比如:一些涉及秘密的文件、编译输出文件、临时文件,我们可以在 Git 存储仓库根目录下创建一个特殊的 .gitignore 文件,它其实是一个纯文本文件,可以使用标准的 glob 模式匹配7,此外:

  • 所有空行或者以 开头的行都会被 Git 忽略
  • 匹配模式可以以 / 开头防止递归
  • 匹配模式可以以 / 结尾指定目录
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号 ! 取反

GitHub 官方维护了一个仓库 github/gitignore ,包含了常用语言和项目的 .gitignore 模板

查看修改

git status 可以查看哪些文件修改了,但是看不到具体修改了哪些地方,我们使用 git diff 命令查看已暂存/未暂存文件的修改,比如:

# 查看尚未暂存的文件修改差异,直接使用 git diff
# 对于已经暂存的文件,使用 git diff --statged 或 git diff --cached 查看修改差异
git diff --staged
diff --git a/a.txt b/a.txt
new file mode 100644
index 0000000..c57eff5
--- /dev/null
+++ b/a.txt
@@ -0,0 +1 @@
+Hello World!
\ No newline at end of file

提交修改

暂存区域处理完成了,现在想要把我们的文件修改记录提交到 Git 存储仓库,就需要使用 git commit 命令进行提交

# 后面带上 -m 参数可以添加提交信息,规范的提交记录都应该加上提交信息,方便协作的其他人理解修改
git commit -m "add a.txt"
[master 7896990] add a.txt
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

现在,完成了我们的第一次提交了,master 表示我们提交所在的分支,7896990 是这次提交的 SHA-1 校验和

有时候,人们觉得使用暂存区域的过程过于繁琐,就可以在 git commit 后带上 -a 参数跳过手动 git add 步骤,这可以将所有已跟踪过的文件自动暂存并一起提交

# 对于已跟踪文件
git commit -a -m 'tips: tracked file without git add'
[master 0afe637] tips: tracked file without git add
1 file changed, 3 insertions(+), 1 deletion(-)

# 对于未跟踪文件是不能省略 git add 步骤的
git commit -a -m 'error: untracked file without git add'
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

Untracked files:
(use "git add <file>..." to include in what will be committed)
     b.txt

nothing added to commit but untracked files present (use "git add" to track)

查看历史

使用 git log 命令回顾 Git 提交的历史记录,这会显示所有的提交历史

# git log 使用 -p 参数加上数字显示最近的几次提交,比如显示最近两次的提交
git log -p -2
commit 29484f3084f2510438ac4038b678b426c9aeb38d (HEAD -> master)
Author: DejavuMoe <[email protected]>
Date:   Tue Apr 5 00:19:34 2022 +0800

    steps: untracked files need git add before git commit

diff --git a/b.txt b/b.txt
new file mode 100644
index 0000000..8a92e27
--- /dev/null
+++ b/b.txt
@@ -0,0 +1 @@
+有时候,人们觉得使用暂存区域的过程过于繁琐,就可以在 git commit 后带上 -a 参数跳过手动 git add 步骤,这可以将所有已跟踪过的文件自动暂存并一起提交
\ No newline at end of file

commit 0afe6378e9353aeb03375cf54bf661aa22618a91
Author: DejavuMoe <[email protected]>
Date:   Tue Apr 5 00:02:37 2022 +0800

    tips: tracked file without git add

diff --git a/a.txt b/a.txt
index c57eff5..c45b31a 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1,3 @@
-Hello World!
\ No newline at end of file
+---
+Hello World!
+---
\ No newline at end of file

另一个常用的参数就是 --pretty

# 比如只用一行显示提交历史
git log --pretty=oneline
29484f3084f2510438ac4038b678b426c9aeb38d (HEAD -> master, origin/master) steps: untracked files need git add before git commit
0afe6378e9353aeb03375cf54bf661aa22618a91 tips: tracked file without git add
7896990461d9ba994e8ec47ac15cb1c614f6524f add a.txt
a89eb2e2ec720b7094e80108d5f3cffd4d6beb95 init LICENSE

更多用法和说明,使用 git log --help 命令 查看

此外,也可以在 Git 存储仓库下使用 gitk (任何平台) 和 gitx (仅有 macOS) 命令使用 Git 内置的图形化浏览器查看文件变更

gitk

第一部分暂时就到这里吧。

参考信息:


  1. Git 存储仓库(Repository)是 Git 用来保存项目的元数据和对象数据库的地方, 这是 Git 中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据 ↩︎

  2. 工作目录(Working Directory)是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改 ↩︎

  3. 暂存区域(Staging Area)是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作 索引,不过一般说法还是叫暂存区域 ↩︎

  4. 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区 ↩︎

  5. 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区 ↩︎

  6. 等同于 git status --shortM 可以出现在两个位置:靠右边的 M 表示文件被修改了但还没放入暂存区域,靠左边的 M 表示文件被修改了并已经放入了暂存区域;A 表示文件新添加到暂存区域;?? 表示新添加且未被跟踪的文件 ↩︎

  7. glob 是用于匹配符合指定模式的文件集合的一种语言, 类似于正则表达式, 但更加简单,可以参考 命令行通配符教程 - 阮一峰的网络日志  ↩︎