
如何向 Git 仓库提交空目录
Git 不跟踪空目录,惯例做法是在目录里放一个 .gitkeep 空文件再提交;如果目录内容应被忽略,配合 .gitignore 写 logs/ 与 !logs/.gitkeep 两条规则,保留目录结构同时忽略产物。
聚焦概念、架构、排障、价格与选型,一篇解决一个明确问题。

Git 不跟踪空目录,惯例做法是在目录里放一个 .gitkeep 空文件再提交;如果目录内容应被忽略,配合 .gitignore 写 logs/ 与 !logs/.gitkeep 两条规则,保留目录结构同时忽略产物。

拆分历史提交用交互式 rebase:git rebase -i <目标提交>^,把该条目标记为 edit;暂停后 git reset HEAD^ 打散该提交,分多次 git add -p + git commit,最后 git rebase --continue 完成。

改最近一次提交的作者:git commit --amend --author="名字 <邮箱>"。改历史中间的提交:git rebase -i <提交>^ 标记 edit,再 amend --author。批量改用 git filter-repo --email-callback。改完需强推。

最近一次提交用 git commit --amend -m "新信息";已推送且无人拉取时可强推:git push --force-with-lease。历史中间的提交信息用 git rebase -i 标记 reword 修改。共享分支不要改写已推送历史。

检出远程分支:git fetch 后 git checkout <分支名>——本地不存在时会自动基于 origin/<分支名> 创建同名本地分支并跟踪。老写法 git checkout -b <名> origin/<名>;只看代码不建分支用 git checkout origin/<名>。

cherry-pick 多个提交:连续的用范围 git cherry-pick A^..B(含 A)或 A..B(不含 A);不连续的逐个列出 git cherry-pick A B C。冲突时解决后 git cherry-pick --continue。

克隆到指定目录:git clone <仓库地址> <目录名>;克隆到当前目录(已存在的空目录)用 git clone <地址> .(注意句点)。目标目录必须不存在或为空。

git clone 默认已拉取所有分支的数据,只是只为默认分支建了本地分支。检出任意远程分支用 git checkout <分支名>。完整镜像用 git clone --mirror(裸仓库,含全部引用),迁移仓库时用它。

大小写不敏感系统(Windows/macOS 默认)上,直接把 name.txt 改成 Name.txt Git 检测不到。用 git mv name.txt Name.txt 强制登记;不行就两步走:先 git mv 到临时名提交,再 git mv 回目标名提交。

先 git fetch 刷新远程引用,再 git diff main origin/main 看文件差异、git log main..origin/main 看远程多出的提交、git log origin/main..main 看本地多出的提交。git status 也会提示领先/落后数。

比较两个分支:git diff 分支A 分支B 看代码差异;git log 分支A..分支B 看 B 独有的提交;git diff A...B(三点)看 B 自分岔点起引入的改动。合并前评审用三点更准确。

本机私有忽略两种方式:未跟踪文件写入 .git/info/exclude(语法同 .gitignore,不进版本库);已跟踪文件的本地改动用 git update-index --skip-worktree <文件>。个人 IDE 配置也可放全局 ~/.gitignore_global。