git mv 是什么
git mv 用于移动或重命名文件目录,并同步更新索引,效果等价于一串「移动文件 + 从索引移除旧路径 + 把新路径加入索引」。要注意 Git 并不在提交里保存「重命名」这个动作本身,展示历史时它是按内容相似度推断出来的,因此改动越少越容易被识别为改名。它是所有 Git 客户端的标准子命令,跨平台一致。
基本信息
| 语法 | git mv <源> <目标> |
|---|---|
| 批量 | git mv a b c 目录/ 把多个源移入目录 |
| 等价做法 | 系统 mv 之后 git add -A |
| 追踪改名 | git log --follow <文件> |
| 平台 | 任意 Git 客户端 |
典型使用场景
- 重命名模块文件或调整目录结构,让索引一次性跟上
- 修正文件命名规范(如统一大小写风格)
- 把多个文件批量移入新建目录
- 移动文件同时保留其在历史中的可追溯性
- 清理散落文件时顺带归位,避免误提交不完整变更
常用示例
常用示例
git mv a.txt b.txt # 重命名单个文件
git mv src lib # 移动整个目录
git mv a.py b.py c.py pkg/ # 多个文件移入目录
git log --follow docs/README.md # 追改名之前的历史
# macOS/Windows 上大小写重命名要分两步
git mv README.md README.md.tmp && git mv README.md.tmp readme.md差异与相似度相关选项
| 选项 | 作用 |
|---|---|
| git diff -M | 在差异里启用改名检测 |
| git log --follow | 跨改名追踪单个文件历史 |
| -C | 更激进地检测复制来源 |
重命名靠相似度推断而非显式标记:一次移动大量文件时尽量单独成一个提交,避免与其他改动混在一起导致识别失败。
改名与改内容分开两次提交,历史更清晰也更容易被工具识别;若必须同时做,改动幅度越大越可能被记为删除加新增,--follow 也就追不到更早的记录。
操作前后要做的事
- 移动前用 git status 确认工作区干净,避免把无关改动带进同一次提交
- 移动后 git status 应显示为 renamed,而不是一对删除与未跟踪
- 确认改名合并后,远端旧路径的引用(CI 配置、文档链接)一并更新
- 跨大小写改名在 Windows/macOS 上走两步中间名,Linux 上可直接改