学习前提
先区分工作区、暂存区与HEAD。
使用Git 2.35+与Bash兼容终端(Windows可用Git Bash)。每章完整代码都会创建独立临时目录;仅在练习仓库运行。git config仅修改该仓库,示例身份不是你的真实提交身份。临时目录不会自动删除,可在完成后自行清理。
本课完成后你能做什么
追踪文件演变,并区分忽略文件与已经跟踪的文件。
先理解机制
git log --oneline显示简短历史,--graph --all帮助观察分支关系。git show可检查单次提交与指定版本中的文件;文件改名后的历史可用git log --follow -- 文件路径继续追踪。
.gitignore描述不应自动加入的未跟踪路径。它不会撤销已经提交的文件,也不会抹去历史中的秘密。如果凭据已泄露,应先撤销或轮换凭据,再按团队流程处理历史。
git check-ignore -v解释哪条规则匹配某路径,适合定位“为什么add不到文件”。本例忽略build目录;源码仍被跟踪,后续提交只更新学习笔记。
可运行示例
lab=$(mktemp -d)
cd "$lab"
git init -b main .
git config user.name "Honeysuck Learner"
git config user.email 'learner'@'example.invalid'
git config commit.gpgsign false
git config core.autocrlf false
printf 'Start learning\n' > notes.txt
git add notes.txt
git commit -m "Start learning notes"
printf 'build/\n*.tmp\n' > .gitignore
mkdir build
printf 'generated\n' > build/output.txt
git add .gitignore
git commit -m "Ignore generated files"
printf 'Review history\n' >> notes.txt
git add notes.txt
git commit -m "Add review step"
git log --oneline -- notes.txt
git diff HEAD~1 HEAD -- notes.txt
git check-ignore -v build/output.txt
git ls-files
推演与验证
日志中notes.txt有两次相关提交;差异新增Review history。check-ignore显示build/规则,ls-files仅列.gitignore和notes.txt。
常见错误与边界
不要忽略整个项目根目录来隐藏噪声。git rm --cached可停止跟踪而保留工作文件,但需要提交这项变更,其他协作者也会收到版本变化。
动手练习
新增draft.tmp,确认它被哪条规则忽略。
参考解法与理由
git check-ignore -v draft.tmp应指向*.tmp;git status --short默认不会列出它,git status --ignored可看到忽略项。