【发布时间】:2026-02-04 07:35:01
【问题描述】:
我读到renaming files in Git 时,您应该提交任何更改,执行重命名,然后暂存重命名的文件。 Git 会从内容中识别文件,而不是将其视为新的未跟踪文件,并保留更改历史记录。
但是,今晚就这样做,我最终恢复到git mv。
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
我将Finder 中的样式表从iphone.css 重命名为mobile.css:
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: css/iphone.css
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# css/mobile.css
所以 Git 现在认为我删除了一个 CSS 文件,并添加了一个新文件。这不是我想要的。让我们撤消重命名,让 Git 完成工作。
> $ git reset HEAD .
Unstaged changes after reset:
M css/iphone.css
M index.html
我又回到了我开始的地方:
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
让我们改用git mv:
> $ git mv css/iphone.css css/mobile.css
> $ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: css/iphone.css -> css/mobile.css
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: index.html
#
看起来我们很好。那么为什么我第一次使用 Finder 时 Git 没有识别出重命名呢?
【问题讨论】:
-
Git 跟踪内容,而不是文件,因此无论您如何使索引进入正确的状态(
add+rm或mv),它都会产生相同的结果。然后 Git 使用它的重命名/复制检测来让你知道它是一个重命名。您引用的消息来源也不准确。您是否在同一个提交中修改+重命名并不重要。当您对修改和重命名进行比较时,重命名检测会将其视为重命名+修改,或者如果修改是完全重写,它将显示为添加和删除 - 仍然无关紧要您如何执行它。 -
如果这是真的,为什么我使用 Finder 重命名时它没有检测到它?
-
git mv old new自动更新索引。当您在 Git 之外重命名时,您必须执行git add new和git rm old来暂存对索引的更改。完成此操作后,git status将按预期工作。 -
我刚刚将一堆文件移到了
public_html目录中,这些文件在 git 中进行了跟踪。在执行了git add .和git commit之后,它仍然在git status中显示了一堆“已删除”的文件。我执行了git commit -a并提交了删除,但现在我没有关于public_html中的文件的历史记录。这个工作流程没有我想的那么顺利。