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

推荐订阅源

C
Cisco Blogs
Schneier on Security
Schneier on Security
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
Scott Helme
Scott Helme
Webroot Blog
Webroot Blog
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
Hacker News: Ask HN
Hacker News: Ask HN
PCI Perspectives
PCI Perspectives
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News | PayPal Newsroom
Help Net Security
Help Net Security
The Hacker News
The Hacker News
H
Heimdal Security Blog
O
OpenAI News
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security Affairs
P
Proofpoint News Feed
S
Secure Thoughts
腾讯CDC
Google DeepMind News
Google DeepMind News
量子位
罗磊的独立博客

Dejavu's Blog

甲骨文 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 镜像 烽火 HG5582A 光猫开启桥接模式 Docker 自托管 Shlink 短链服务 部署 Obsidian LiveSync 实时同步服务指南 我的 2025 年不完全回顾 Linux 下 Intel 核显驱动配置与硬件加速 Fedora Linux 安装配置记录 2025 年优雅地自托管 RSS 服务 Woodpecker CI 和 Gitea 实现 Hugo 自动部署 Gitea/Forgejo 集成 Woodpecker CI/CD 在 Blinko 中使用 Ollama 作为 AI 供应商 Docker 部署 Gitea/Forgejo Plausible CE 启用城市级地理位置识别 Blinko 开源 AI 知识库 Docker 部署指南 Netcup 免税账号注册及购买服务器全记录 Docker 自托管 Cloudreve Pro 私有网盘服务 GiffGaff SIM 卡使用体验和注意事项 简体中文互联网在变得糟糕吗? 如何低成本申请 S/MIME 证书用于个人邮件服务 迁移到 NameCrane Mail 域名邮箱套件服务 香烟与咖啡 在 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 签名和认证应用指南 Canokey 的基本使用指南 Canokey Pigeon 揽件日志及简单开箱 关于 Google Play 保护机制和 DRM 安全等级的那些事 记录一次捡垃圾装机 GitHub 使用 GPG 密钥提交签名认证 使用 Scoop 管理 Windows 下的软件和开发环境 Windows Terminal+PowerShell 7 打造 Windows 下最好用的终端 一个好用的 Telegram 文件批量上传/下载工具 Clash for Windows 优雅地使用 TUN 模式接管系统流量 全平台搭建 Hexo 静态博客指南 尝试将 Manjaro 作为主力操作系统使用 Hexo 进行 SEO 优化的基本指南 使用本地代理给 Git 和 NPM 加速 使用 flowerss 部署 Telegram RSS 订阅机器人
Git 版本控制学习笔记(一)
Dejavu Moe · 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 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

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

参考信息: