Skip to content

Git - 移动操作

Git 提供了 git mv 命令,用于在你的仓库中移动或重命名文件和目录。使用 git mv 很重要,因为它会告诉 Git 文件已被移动或重命名,而不是简单地删除旧文件并添加一个不相关的新文件。这有助于 Git 在重命名后也能跟踪文件的历史。

使用 git mv old_name new_name 等同于运行以下三个命令:

  1. mv old_name new_name (标准的系统移动/重命名命令)
  2. git rm old_name (将旧文件名的删除操作添加到暂存区 (staging area))
  3. git add new_name (将新文件名的添加操作添加到暂存区)

git mv 命令一步完成所有这些操作,并正确记录重命名。

假设 Tom 决定将源文件 string_utils.c 移动到一个新建的 src/ 目录中。当前项目结构可能如下:

[tom@dev-machine project]$ pwd
/home/tom/project
[tom@dev-machine project]$ ls
README.md string_utils.c Makefile

Tom 首先创建 src 目录,然后使用 git mv:

[tom@dev-machine project]$ mkdir src
[tom@dev-machine project]$ git mv string_utils.c src/string_utils.c
[tom@dev-machine project]$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: string_utils.c -> src/string_utils.c

git status 输出显示 string_utils.c 已被重命名(移动)。该变更已在暂存区。

如果 Tom 想将 README.md 重命名为 README.txt:

[tom@dev-machine project]$ git mv README.md README.txt
[tom@dev-machine project]$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: README.md -> README.txt

要将这些变更永久记录到仓库的历史中,Tom 需要提交 (commit) 它们:

[tom@dev-machine project]$ git commit -m "Organized source files into src/ directory and renamed README"
[main 7d9ea97] Organized source files into src/ directory and renamed README
2 files changed, 0 insertions(+), 0 deletions(-)
rename string_utils.c => src/string_utils.c (100%)
rename README.md => README.txt (100%)

提交后,Tom 可以将这些变更推送到远程仓库 (remote repository),这样其他开发者(如 Jerry)在 pull (拉取) 时就会看到新的结构:

[tom@dev-machine project]$ git push origin main

当 Jerry 拉取这些变更时,他的本地仓库 (local repository) 将反映新的文件位置和名称。

[jerry@dev-machine project]$ git pull origin main
remote: Enumerating objects: ..., done.
...
From github.com:your-repo/project
e86f062..7d9ea97 main -> origin/main
Updating e86f062..7d9ea97
Fast-forward
string_utils.c | 0
README.md => README.txt | 0
{string_utils.c => src/string_utils.c} | 0
3 files changed, 0 insertions(+), 0 deletions(-)
rename string_utils.c => src/string_utils.c (100%)
rename README.md => README.txt (100%)
create mode 100644 src/string_utils.c
delete mode 100644 string_utils.c
[jerry@dev-machine project]$ ls
README.txt src/ Makefile
[jerry@dev-machine project]$ ls src/
string_utils.c