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

推荐订阅源

Vercel News
Vercel News
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
G
Google Developers Blog
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
P
Proofpoint News Feed
J
Java Code Geeks
U
Unit 42
云风的 BLOG
云风的 BLOG
阮一峰的网络日志
阮一峰的网络日志
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
Docker
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Help Net Security
V
V2EX
T
Tailwind CSS Blog

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 卡使用体验和注意事项 简体中文互联网在变得糟糕吗?
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

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

参考信息: