【问题标题】:Git: renamed file manually, Git confusedGit:手动重命名文件,Git困惑
【发布时间】:2011-06-10 04:02:28
【问题描述】:

我正在使用 Git 并手动重命名了我已添加到存储库中的文件。现在,我添加了我重命名到存储库的“新”文件,但 Git 抱怨“旧”文件已被删除。那么如何让 Git 忘记旧文件呢?更好的是,我如何告诉 Git“新”文件确实是“新”文件,以便我可以保持更改历史记录完好无损?

【问题讨论】:

  • git mv old new 本质上只是git rm --cached old; mv old new; git add new,还有一些额外的智能。 Git 通过查找相似内容来识别重命名,因此无论您是否使用git mv,它都会检测到它们。也就是说,没有办法告诉这两个文件对应。
  • 奇怪的是将近 8 年过去了,git 仍然无法检测到重命名

标签: git version-control


【解决方案1】:

首先,取消手动移动文件的分阶段添加:

$ git reset path/to/newfile
$ mv path/to/newfile path/to/oldfile

然后,使用 Git 移动文件:

$ git mv path/to/oldfile path/to/newfile

当然,如果您已经提交了手动移动,您可能希望重置为移动之前的版本,然后从那里简单地git mv

【讨论】:

  • 最后一条命令出错:致命:不受版本控制
  • 只需要做:在最后一个命令之前添加旧文件。谢谢琥珀!
  • 只是注意到我最初看到fatal: bad source, source=oldfile destination=newfile,然后意识到这个答案中的说明已经通过将已经重命名的文件重命名回原始文件来解决这个问题:)
【解决方案2】:

试试这个:

mv new old
git rm new
git mv old new

【讨论】:

  • 这不起作用。 Git 仍然没有将文件标记为重命名。
  • 您仍然需要使用git add new暂存文件
【解决方案3】:

没有问题。只需git rm old 甚至git add -A,它就会意识到这是一个重命名。 Git 将看到删除加上与重命名内容相同的添加。

您不需要撤消、取消暂存、使用git mv 等。git mv old new 只是mv old new; git rm old; git add new 的简写。

【讨论】:

  • 如果旧文件已经消失,您必须使用git rm --cached old,因为工作树中没有要删除的文件。
  • 如果你移动文件并更改几行,然后git add -A? Git 是否足够聪明,可以知道 similar 文件与旧文件相同吗?
  • 另外,如果因为文件名的改变导致文件的正文发生了一些变化,比如不同的#include语句,git还是能理解的!
  • 当我尝试时,git 似乎不理解重命名的更改文件 - 其他答案虽然有效。
【解决方案4】:

如果出现此错误,可能意味着您尝试移动的文件最初未被 git 跟踪,或者您尝试将文件移动到的目录不是 git 跟踪的目录。

【讨论】:

  • 正如 OP 所提到的,他移动了他之前已经在版本控制下的文件。您所描述的是尝试git mv 文件时的情况,该文件尚未受版本控制(因此之前未使用git add 添加的文件)。如今,git 错误消息将非常明确地表明该文件尚未检入 vc。
【解决方案5】:

这必须是自动化的。在我提交之前我从不记得 git,而且我不想这样做。

#!/usr/bin/env python3

# This `git rm` wrapper respects the `--cached` option (like `git rm`).

import sys
import subprocess

if "--cached" in sys.argv:
    dest = sys.argv[-1]
    rest = sys.argv[1:-1]
    subprocess.check_call(["git", "add", dest])
    subprocess.check_call(["git", "rm"] + rest)
else:
    subprocess.check_call(["git", "mv"] + sys.argv[1:])

我不想“记住 git mv”,因为git mvgit diff 后面添加了隐藏状态,即隐式添加到下一次提交中,即使你显式 提交一些完全不相关的东西。我知道,这就是所谓的“分阶段”状态,但我不喜欢它。我喜欢毫无意外地做出承诺。

【讨论】:

    猜你喜欢
    • 2011-04-24
    • 2011-12-07
    • 2016-04-15
    • 2015-08-15
    • 2011-02-11
    • 1970-01-01
    • 2015-10-28
    • 2017-10-08
    相关资源
    最近更新 更多