- 第 122 篇 -
Date: 2025 - 09 - 07
Author: 郑龙浩(仟墨)
文章目录
- 查看差异 && 删除文件 && 忽略文件
- 1 git diff 可以查看哪些?
- 基本用法
- 比较不同提交
- 比较分支
- 文件比较
- 其他
- 2 彻底删除文件
- 3 忽略文件
- 「1」应该忽略哪些文件?
- 「2」如何让本地仓库忽视某些文件?
- **1 两种忽略方式**
- **2 如何创建和修改`.gigignore`文件?**
- 方法1:直接创建文件(推荐新手用)
- 方法2:用命令创建(稍微高级一点)
- 「3」已经提交的文件「无法被忽略」!!!
- **常见误区**:
- **为什么会这样?**
- 如果已经提交的文件想忽略,怎么办呢?
- 「4」如何检查文件是否在被跟踪:
- 「5」`.gitignore`匹配规则
- 基本规则
- 目录匹配
查看差异 && 删除文件 && 忽略文件
1 git diff 可以查看哪些?
基本用法
-
工作区与暂存区的差异(未 add 到「暂存区」的修改)
git diff
-
暂存区与最后一次提交的差异(已 add 但未 commit 到「本地仓库」的修改)
git diff --cached
-
工作区与最后一次提交的差异(所有未提交的修改)
git diff HEAD
比较不同提交
-
两次提交之间的差异(比如第n次提交与第m次提交的区别)
git diff 第n次提交的ID 第m次提交的ID
-
某次提交的差异与最后一次提交
git diff 某次提交的ID HEAD
-
上次提交的差异与最后一次提交
git diff HEAD~1 HEAD # 或 git diff HEAD~ HEAD
-
上n次提交的差异与最后一次提交
git diff HEAD~n HEAD
比较分支
-
两个分支之间的差异
git diff branch1 branch2
-
当前分支与其他分支的差异
git diff ..other_branch
文件比较
-
不同文件之间的差异
git diff -- file1 file2
-
特定文件的修改历史
git diff commit1..commit2 -- path/to/file
其他
-
统计变更而非显示具体内容
git diff --stat
-
比较单词级别的差异而非行级别
git diff --word-diff
-
查看重命名/移动文件的差异
git diff --find-renames
-
比较时忽略空格变化
git diff --ignore-all-space
-
比较两个远程分支的差异
git diff origin/branch1 origin/branch2
2 彻底删除文件
① 第一种方法 先从「工作区」删除文件,再从「暂存区」删除,再提交到「本地仓库」删除的记录
删除
file3.txt
文件
rm file3.txt 或者 fit add file3.txt
首先删除文件之后,我们使用git status
查看状态的时候,依然可以看到file3.txt
在「暂存区」中,如果使用git ls-files
命令,我们发现在「暂存区」中依然存储着「file3.txt」文件,并未在「暂存区」删除,
我们依然要执行 一次git add file3.txt
,告诉「暂存区」,我已经将「工作区」中的ile3.txt
文件删除
此时「暂存区」中肯定是没有file3.txt
,但是「本地仓库」中依然还有file3.txt
文件,所以我们依然要执行git commit -m "delete file3.txt"
告诉「本地仓库」file3.txt
文件已经删除
如何查看「暂存区」中的内容呢?
git ls-files
② 第二种方法:直接将文件从「工作区」和「暂存区」同时删除,再提交到「本地仓库」删除的记录
git rm file.txt
③ 第三种方法:把文件从「暂存区」中删除,但保留在当前「工作区」中,再提交到「本地仓库」删除的记录
git rm --cached file.txt
④ 递归删除某个目录下的所有「子目录」和「文件」,然后依然再提交到「本地仓库」删除的记录
git rm -r *
3 忽略文件
.gitignore
是一个纯文本文件,用于指定 Git 版本控制系统应忽略的文件和目录模式。这些被忽略的文件将不会被纳入版本控制。
「1」应该忽略哪些文件?
- 系统与IDE生成文件
- 操作系统文件:
.DS_Store
(Mac),Thumbs.db
(Windows) - IDE配置目录:
.idea/
,.vscode/
,*.swp
- 编译输出文件
- Java:
*.class
,target/
- C/C++:
*.o
,*.exe
,*.out
- Python:
__pycache__/
,*.pyc
- 依赖管理目录
- Node.js:
node_modules/
- PHP:
vendor/
- Go:
bin/
,pkg/
- 敏感信息文件
- 环境变量文件:
.env
,.env.local
- 密钥文件:
*.pem
,*.key
,*.crt
- 配置文件:
config.properties
- 构建产物与压缩包
- 打包文件:
*.zip
,*.tar.gz
,*.rar
- 构建输出:
dist/
,build/
,*.min.js
- 运行时生成文件
- 日志文件:
*.log
,logs/
- 临时文件:
*.tmp
,temp/
- 缓存文件:
.cache/
「2」如何让本地仓库忽视某些文件?
说白了,直接将需要忽视的文件加入到.gitignore
文件中即可
1 两种忽略方式
-
可以直接加某个文件,比如
aaa.exe
-
也可以利用通配符
*
,表示任意*.exe # 忽略所有.exe结尾的文件 *.log # 忽略所有.log结尾的文件
2 如何创建和修改.gigignore
文件?
方法1:直接创建文件(推荐新手用)
-
在项目文件夹里右键 → 新建文本文件
-
把文件名改成
.gitignore
-
打开文件,写入要忽略的内容,比如:
第一行一定要写:
node_modules/
node_modules/ .env *.log
方法2:用命令创建(稍微高级一点)
如果是第一次创建:
echo "node_modules/" > .gitignore
这个命令会创建 .gitignore
文件,并写入 node_modules/
–> 第一行必须要写这个
如果要追加内容(不覆盖原有内容):
echo ".env" >> .gitignore
注意这里用 >>
而不是 >
,这样不会清空原有内容,如果是一个>
的话,会覆盖的
「3」已经提交的文件「无法被忽略」!!!
常见误区:
很多新手以为只要把文件加到 .gitignore
里,Git 就会自动忽略它。但其实如果这个文件之前已经被提交过(在版本库里),光加 .gitignore
是不起作用的!
为什么会这样?
因为 Git 会记住所有已经被跟踪的文件,.gitignore
只能阻止 Git 跟踪新文件,不能让它"忘记"已经跟踪的文件。
如果已经提交的文件想忽略,怎么办呢?
流程大概是:
① 将该文件从本地仓库删除 (注意:只删除本地仓库中的即可,不要将工作区和暂存区的文件删除,不然这个文件就会在文件夹中被删除了)
② 将这个文件名添加到
.gitignore
文件当中,注意用追加,不要将原来的内容覆盖③ 最后提交这次更改(一定要提交这次修改,不要忘记)
用aaa.log
举例
-
先讲这个文件从
git
移除,也就是删除这个文件git rm --cached aaa.log
这个命令只移除 Git 的跟踪,不会删除电脑上的实际文件
-
然后再将这个文件名添加到
.gitignore
文件当中echo "aaa.log" >> .gitignore
用
>>
追加,避免覆盖原有忽略规则 -
然后提交这次的修改内容
git add .gitignore git commit -m "忽略 aaa.log 文件"
「4」如何检查文件是否在被跟踪:
git ls-files
这个命令的作用就是列出所有被 Git 跟踪的文件
「5」.gitignore
匹配规则
从上到下逐行匹配的,每一行都是一个独立的忽略模式
基本规则
-
#
开头:注释行(被忽略)# 这是一个注释,这行会被 Git 忽略
-
空行:被忽略,用于分隔
# 空行用于分隔不同类别的忽略规则 *.log
-
*
:匹配任意字符(除/
)*.tmp # 忽略所有 .tmp 后缀文件 temp* # 忽略所有以 temp 开头的文件
-
?
:匹配单个字符file?.txt # 忽略 file1.txt、fileA.txt 等
-
[]
:匹配括号内任意字符[0-9] 表示任意一位数字,[a-z]表示任意一位小写字母,大写反之
[abc].txt # 忽略 a.txt、b.txt、c.txt log[0-9].txt # 忽略 log0.txt 到 log9.txt test_[a-z].js # 忽略 test_a.js 到 test_z.js
-
!
:取反(表示不忽略匹配文件)*.log # 忽略所有 .log 文件 !error.log # 但不忽略 error.log
目录匹配
-
/
结尾:匹配目录# 只忽略当前目录下的 AAA 文件,不忽略其他子目录下的AAA文件 /AAA
-
/
开头:从根目录开始匹配# 忽视任何目录下的AAA文件夹 AAA/
-
AA/ab.txt
# 忽略AA文件夹中以.txt结尾的文件,但是不会忽略AA文件夹下面的子目录下面的 .txt文件 # 比如不会忽略AA/AB/ AA/*.txt
-
\**
:匹配多级目录
# 忽略 AA/目录及其所有子目录下的.exe文件
AA/**/*.exe