【补充学习】Git 操作流程与命令整理

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:文件在工作区被修改,但还没有暂存。

这次会话里,.gitignoreREADME.mdvisualize.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.nameuser.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:为当前暂存区创建一次提交,并附上提交说明。
  • 前提是改动已经进入暂存区。

本次会话里,该命令用于把 .gitignoreREADME.mdvisualize.py 的修改保存为一个本地提交。

2.9 准备推送到 GitHub

git push -u origin main

说明:

  • git push:把本地提交推到远端仓库。
  • -u:建立本地分支与远端分支的跟踪关系。
  • origin main:表示将本地 main 推到远端 originmain

第一次成功推送之后,后续一般只需要:

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 diffgit diff --cached 看的是两个不同区域。

前者看工作区,后者看暂存区。

4. Git 身份配置存在优先级。

仓库本地配置会覆盖全局配置,因此排查用户名邮箱时一定要看配置来源。

5. git remote addgit 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 的认证行为会不同

如果把这些概念理顺,后续管理代码仓库、清理实验产物、迁移远端仓库、整理博客记录,都会顺畅很多。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇