git实用命令
1.如何查看是否提交过某个文件
要查看某个文件是否被提交(commit)到 Git 仓库过,最快速、直接的命令是:
git log --oneline -- <文件路径>
1. 结果判断
- 如果有输出(显示了一行或多行 commit 哈希和提交信息):说明该文件被提交过。
- 如果没有任何输出(直接返回空白):说明该文件在 Git 历史中从未被提交过。
2. 常用查看场景及命令
- 查看该文件的完整提交历史(包含作者、日期):
git log -- <文件路径> - 查看某个文件目前是否属于“未追踪(Untracked)”或“已修改未提交”状态:
git status -- <文件路径>- 如果提示
Untracked files:说明该文件从未被提交过,且当前不在暂存区。 - 如果提示
Changes to be committed或Changes not staged for commit:说明它曾被提交过,或者已经被移入了暂存区,当前存在未提交的修改。
- 如果提示
- 如果你怀疑文件曾被提交过、但后来被彻底删除了,想查出是谁删的:
git log --all --full-history --oneline -- <文件路径>
2.gitignore详解
1. ! 符号:取反(白名单 / 强制不忽略)
在
.gitignore 中,叹号 ! 用于推翻之前的忽略规则。它告诉 Git:“即使前面写了要忽略,这个特定的文件或文件夹也绝对不能忽略”。- 核心陷阱(重要): 如果一个文件的父目录已经被整体忽略了,那么对该目录下子文件的
!取反规则是不会生效的(因为 Git 为了提高效率,根本不会去扫描被整体忽略的目录)。
正确示例:
# 忽略所有 .log 结尾的文件
*.log
# 但是!不要忽略这个特定的 log 文件
!important.log
错误与正确的目录取反对比:
# ❌ 错误示范:这样写没办法留住 important.log
logs/
!logs/important.log # 规则失效!因为 logs/ 目录已经被整体跳过了
# 正确写法:
logs/*
!logs/important.log # 成功!忽略 logs 下的所有内容,但给 important.log 留了白名单
2. 不带斜杠 /:全局递归匹配
如果一个匹配规则中完全不带有斜杠
/,Git 会将其视为一个全局通配符。它会递归地应用到项目里任何层级的目录中。vendor:会忽略根目录下的vendor,也会忽略rust/vendor、src/bin/vendor等任何子目录下的vendor文件夹或文件。*.ext:会忽略整个仓库里所有地方的.ext后缀文件。
带斜杠与不带斜杠的区别对比:
vendor(不带斜杠):匹配任何地方的 vendor。/vendor(开头带斜杠):只匹配根目录下的 vendor,不会影响rust/vendor。vendor/(结尾带斜杠):匹配任何地方名为 vendor 的文件夹,但不会忽略名为 vendor 的文件。
💡 规则总结速查表
| 规则语法 | 实际效果 | 匹配示例 |
|---|---|---|
vendor |
忽略任何层级名为 vendor 的文件或文件夹 | vendor/, rust/vendor/, src/vendor |
/vendor |
仅忽略根目录下的 vendor 文件夹/文件 | 根目录 vendor/(不会忽略 rust/vendor/) |
!rust/vendor |
不忽略 rust/vendor,强制将其纳入版本控制 |
保护 rust/vendor 不被前面的通用规则吞掉 |
如果想在
.gitignore 中确保不忽略 rust/vendor 目录(以便离线提交三方库),可以在 .gitignore 的末尾追加一行:!rust/vendor
如果在
.gitignore 中已经写了 /.cargo/config,但修改该文件后 Git 依然会提示它已被修改(出现在 git status 的 Changes not staged for commit 中),原因非常明确:这个文件在被加入
.gitignore 之前,就已经被提交(commit)到 Git 仓库中了。Git 的底层逻辑是:一旦一个文件被纳入了版本控制(tracked),
.gitignore 中的规则对它就会完全失效。🛠️ 彻底解决的步骤
你需要在不删除本地物理文件的情况下,把这个文件从 Git 的跟踪缓存中剔除(变成 Untracked 状态)。请在源码根目录下执行以下命令:
步骤 1:从 Git 暂存区移除跟踪(保留本地文件)
git rm --cached .cargo/config
(注:如果你的
.cargo 目录是在 rust/ 子目录下,路径请改为 git rm --cached rust/.cargo/config)步骤 2:提交这次“取消跟踪”的变更
git commit -m "chore: remove .cargo/config from version control"
参考资料:
2.git常见问题
浙公网安备 33010602011771号