1. 背景说明
本文基于一次真实的项目整理与推送过程进行复盘,目标包括:
- 检查仓库当前状态
- 确认哪些文件已经被 Git 追踪
- 补全
.gitignore并验证忽略规则是否生效 - 检查并清理项目本地 Git 身份配置
- 配置 GitHub 远端仓库
- 创建提交并准备推送
本文不仅整理了本次实际使用到的 Git 命令,也补充了若干高频但当时没有完全展开的命令,尤其是:
- 新增追踪文件
- 停止追踪文件
- 删除追踪文件
- 清空索引后重新建立追踪关系
2. 本次会话中实际使用过的 Git 命令
2.1 查看仓库当前状态
git status --short
git status --short --ignored
git status --short --branch
git status
说明:
git status --short:使用短格式查看文件状态,适合快速扫描。git status --short --branch:除文件状态外,还会显示当前分支,例如## main。git status --short --ignored:把被.gitignore忽略的文件也显示出来,通常以!!标记。git status:显示更完整的信息,能清楚区分“已暂存改动”和“未暂存改动”。
一个常见细节:
M file:文件修改已经进入暂存区。M file:文件在工作区被修改,但还没有暂存。
这次会话里,.gitignore、README.md、visualize.py 就处于“已暂存待提交”的状态。
2.2 查看当前仓库已追踪的文件
git ls-files
git ls-files | wc -l
说明:
git ls-files:列出当前已经被 Git 追踪的文件。- 它不会显示未追踪文件,也不会显示被忽略文件。
git ls-files | wc -l:统计当前被追踪文件的总数。
这一组命令很适合回答“Git 现在到底在管哪些文件”这个问题。
2.3 验证 `.gitignore` 是否生效
git status --short --ignored
git check-ignore -v .codex trained_models/ outputs/ checkpoints/ visual/
说明:
git status --short --ignored:查看当前哪些路径已被忽略。git check-ignore -v <path>:验证某个路径是否命中忽略规则,并显示是.gitignore中哪一行生效。
这类命令特别适合在补全 .gitignore 后做确认,避免“规则写了但不知道是否生效”。
2.4 查看提交历史
git log --oneline --decorate -n 5
说明:
--oneline:每个提交压缩为一行。--decorate:显示分支、HEAD、tag 等引用信息。-n 5:只看最近 5 条提交。
它适合快速确认当前分支处于哪个提交上,以及最近的提交记录。
2.5 查看改动内容
git diff --stat
git diff -- .gitignore README.md visualize.py
git diff --cached --stat
git diff --cached -- .gitignore README.md visualize.py
说明:
git diff:比较“工作区”和“暂存区”,即尚未暂存的改动。git diff --cached:比较“暂存区”和“最近一次提交”,即已经暂存但还没提交的改动。--stat:只显示改动摘要,例如新增多少行、删除多少行。-- <file>:只查看指定文件。
这次会话里:
git diff --stat没有输出git diff --cached --stat有输出
这说明改动并不在工作区,而是在暂存区。
2.6 查看和处理 Git 身份配置
git config --show-origin --get user.name
git config --show-origin --get user.email
git config --local --get user.name
git config --local --get user.email
git config --global --get user.name
git config --global --get user.email
git config --local --unset user.name
git config --local --unset user.email
说明:
git config --show-origin --get:查看配置值,并显示它来自哪个配置文件。--local:读取或修改当前仓库的.git/config。--global:读取或修改当前用户的~/.gitconfig。--unset:删除某个配置项。
Git 配置优先级:
local > global > system
本次会话中的实际情况是:
- 仓库本地配置原来定义了
user.name和user.email - 全局配置里已经存在正确的用户名和邮箱
- 最终采取的方案是删除仓库本地配置,让该仓库继承全局默认配置
这是一个非常推荐的做法,因为它能避免某个仓库意外覆盖你的常用 Git 身份。
2.7 查看和配置远端仓库
git remote -v
git remote add origin https://github.com/ThornsW/RAE-GAN.git
说明:
git remote -v:查看当前仓库的远端配置,包括 fetch 与 push 地址。git remote add origin <url>:为当前仓库第一次添加远端。origin:只是远端名称的惯例,并不是强制固定名字。
本次会话开始时仓库没有配置远端,因此需要先添加 origin。
2.8 创建提交
git commit -m "完善忽略规则并改进可视化流程"
说明:
git commit -m:为当前暂存区创建一次提交,并附上提交说明。- 前提是改动已经进入暂存区。
本次会话里,该命令用于把 .gitignore、README.md、visualize.py 的修改保存为一个本地提交。
2.9 准备推送到 GitHub
git push -u origin main
说明:
git push:把本地提交推到远端仓库。-u:建立本地分支与远端分支的跟踪关系。origin main:表示将本地main推到远端origin的main。
第一次成功推送之后,后续一般只需要:
git push
git pull
即可。
2.10 为什么代理环境需要认证,而本地终端不需要
本次实际操作中出现了一个很有代表性的现象:
- 在用户自己的终端里,执行
git push -u origin main时不需要再次验证 - 在代理执行环境里,推送时触发了 GitHub 用户名和密码输入
原因通常不是 Git 命令错误,而是“执行环境不同”:
- 用户本机终端可能已经配置了凭据缓存、系统钥匙串、SSH key 或
ssh-agent - 代理环境不一定继承这些认证链
- 代理环境还可能受限于网络权限、文件系统权限和交互认证能力
这也是实际开发中非常典型的问题:同一条 Git 命令,在不同终端环境下表现可能不同。
3. 补充:新增追踪、删除追踪、停止追踪、清空追踪的常用命令
这一部分是博客里很值得单独展开的内容,因为很多 Git 初学者最容易在这里混淆。
3.1 新增追踪文件
#### 方式一:追踪单个文件
git add README.md
说明:
- 将指定文件加入暂存区。
- 如果该文件原本未被追踪,则会开始追踪它。
- 如果该文件已经被追踪,则表示把本次修改加入暂存区。
#### 方式二:追踪当前目录下所有变更
git add .
说明:
- 暂存当前目录及其子目录下的新增、修改文件。
- 常用于“我确认当前目录改动都要提交”的情况。
#### 方式三:追踪整个仓库中的所有变更
git add -A
说明:
- 暂存新增、修改、删除三类变化。
- 比
git add .更彻底,在跨目录场景里尤其稳定。
#### 方式四:只暂存已被追踪文件的改动
git add -u
说明:
- 只处理“已被 Git 追踪的文件”的修改和删除。
- 不会把新的未追踪文件加进来。
这个命令适合你只想提交已有文件的修改,而不想顺手把新文件带进去。
3.2 取消暂存,但保留修改内容
git restore --staged README.md
说明:
- 把文件从暂存区移出。
- 不会删除工作区中的实际改动。
这个命令经常用于“我不小心 git add 过头了,需要把某个文件拿出来”。
3.3 删除已追踪文件,同时删除本地文件
#### 删除单个文件
git rm file.txt
#### 删除目录
git rm -r logs/
说明:
git rm会同时做两件事:
1. 从 Git 索引中删除该文件
2. 从本地工作区中删除该文件
-r表示递归删除目录。
适用场景:
- 你确认该文件或目录应该从仓库中彻底移除
- 并且本地也不再保留它
3.4 停止追踪文件,但保留本地文件
#### 停止追踪单个文件
git rm --cached file.txt
#### 停止追踪目录
git rm -r --cached trained_models/
说明:
--cached表示只从 Git 索引里移除- 本地文件仍然保留
- 之后如果
.gitignore覆盖了它,这类文件就不会再被继续追踪
这正是处理训练产物、缓存目录、输出目录时最常用的方法。
一个非常重要的原则:
.gitignore只对“尚未被 Git 追踪的文件”生效。
如果某个目录早就被提交进仓库,仅仅修改 .gitignore 是不够的,必须先把它从索引里移除。
3.5 清空当前索引中的追踪关系,再按照 `.gitignore` 重新建立
git rm -r --cached .
git add .
git commit -m "根据 .gitignore 重新整理追踪文件"
说明:
git rm -r --cached .:把当前仓库所有文件从 Git 索引中移除,但保留本地文件。git add .:重新按当前目录状态和.gitignore规则建立索引。- 然后再提交一次,让仓库正式切换到新的追踪结构。
这个流程经常用于:
.gitignore修改较大- 历史上误提交了很多缓存、训练产物、输出目录
- 希望一次性清理索引状态
注意:
- 这不是删除本地文件,而是重建 Git 的索引视图。
- 执行前最好先用
git status确认当前工作区状态,避免误操作。
3.6 删除未追踪文件
#### 先预览
git clean -nd
#### 真正删除
git clean -fd
说明:
git clean用于删除未追踪文件。-n表示只预览,不真正执行。-f表示强制执行。-d表示连未追踪目录一起处理。
适用场景:
- 构建残留很多无用文件
- 想把工作区恢复到较干净的状态
它不会删除已经被 Git 追踪的文件,但仍然属于需要谨慎使用的命令。
4. 与远端仓库相关的补充命令
4.1 修改已有远端地址
git remote set-url origin git@github.com:ThornsW/RAE-GAN.git
说明:
- 当
origin已经存在时,不要再次git remote add origin ... - 应该使用
git remote set-url来修改已有远端的地址
这能避免 remote 名称重复或命令报错。
4.2 直接向某个 URL 推送
git push git@github.com:ThornsW/RAE-GAN.git main:main
说明:
- 把本地
main直接推送到指定远端 URL 的main - 这种方式不会修改本地
origin配置 - 适合一次性推送,不适合长期维护
4.3 查看远端详细信息
git remote show origin
说明:
- 比
git remote -v提供更多信息 - 可查看默认分支、拉取推送分支、跟踪关系等
4.4 查看分支与远端跟踪关系
git branch -vv
说明:
- 显示本地分支当前指向的提交
- 同时显示它跟踪的远端分支
- 还能看到领先或落后远端多少提交
4.5 检查 SSH 认证是否可用
ssh -T git@github.com
说明:
- 用于验证当前机器的 GitHub SSH key 是否已配置成功
- 如果成功,通常会看到 GitHub 的欢迎信息
5. 常见组合流程示例
5.1 新增一个文件并提交
git add README.md
git commit -m "更新 README"
git push
适用场景:
- 修改单个文件
- 想快速形成一次小而清晰的提交
5.2 把训练产物从 Git 中移除,但保留本地文件
echo "trained_models/" >> .gitignore
git rm -r --cached trained_models/
git add .gitignore
git commit -m "停止追踪训练产物目录"
适用场景:
- 目录已经被误提交到 Git
- 现在希望它只保留在本地,不再进入版本管理
5.3 大范围修改 `.gitignore` 后重新整理索引
git rm -r --cached .
git add .
git commit -m "根据新的 .gitignore 重建索引"
适用场景:
- 项目早期忽略规则不完善
- 现在要一次性整理仓库中的追踪文件
5.4 配置 GitHub 远端并首次推送
git remote add origin https://github.com/用户名/仓库名.git
git push -u origin main
如果你改用 SSH:
git remote set-url origin git@github.com:用户名/仓库名.git
git push -u origin main
6. 本次操作最值得记住的几个 Git 知识点
1. git status 是排查问题的第一入口。
无论是文件没提交、没推上去,还是 .gitignore 没生效,先看状态几乎总是对的。
2. .gitignore 并不会自动取消已经被追踪的文件。
如果某些文件早就被 Git 跟踪了,必须配合 git rm --cached 使用。
3. git diff 和 git diff --cached 看的是两个不同区域。
前者看工作区,后者看暂存区。
4. Git 身份配置存在优先级。
仓库本地配置会覆盖全局配置,因此排查用户名邮箱时一定要看配置来源。
5. git remote add 和 git remote set-url 不要混用。
一个是新增远端,一个是修改已有远端。
6. 同一条 git push 在不同终端环境里表现可能不同。
这通常与认证方式、凭据缓存、SSH 配置、代理环境权限有关,而不一定是仓库有问题。
7. 一条较完整的标准检查与推送流程
git status --short --branch
git ls-files
git diff --cached --stat
git config --show-origin --get user.name
git config --show-origin --get user.email
git remote -v
git commit -m "你的提交说明"
git push -u origin main
如果远端地址不对,则先改:
git remote set-url origin git@github.com:用户名/仓库名.git
如果 .gitignore 改动很大,还可以补一轮索引重建:
git rm -r --cached .
git add .
git commit -m "根据 .gitignore 重建索引"
8. 总结
这次实操真正有价值的地方,不只是“完成了一次 Git 提交和推送准备”,而是把以下几个容易混淆的知识点串了起来:
- Git 当前到底追踪了哪些文件
.gitignore为什么有时看起来“不生效”- 工作区、暂存区、提交历史分别怎么看
- 本地仓库配置和全局配置的区别
- 如何安全地把训练产物、缓存目录从版本管理中移除
- 为什么在不同终端环境里,
git push的认证行为会不同
如果把这些概念理顺,后续管理代码仓库、清理实验产物、迁移远端仓库、整理博客记录,都会顺畅很多。