奇怪的“git mv”行为
上个月,我开始为GitHub存储库做贡献,方法是分叉相应的repo,创建一个功能分支,然后提交一个pull请求。在重复这一过程几天的过程中,我在使用预装的Linux命令奇怪的“git mv”行为,git,github,git-mv,Git,Github,Git Mv,上个月,我开始为GitHub存储库做贡献,方法是分叉相应的repo,创建一个功能分支,然后提交一个pull请求。在重复这一过程几天的过程中,我在使用预装的Linux命令mv以及Git命令Git mv重命名文件时遇到了一个奇怪的问题 实际问题是,根据您何时使用git mv移动/重命名文件,何时使用git添加它,以及何时编辑重命名的文件,您会得到: On branch master Changes to be committed: (use "git reset HEAD <file>
mv
以及Git命令Git mv
重命名文件时遇到了一个奇怪的问题
实际问题是,根据您何时使用git mv
移动/重命名文件,何时使用git添加它,以及何时编辑重命名的文件,您会得到:
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: somethingelse -> something
出于某种原因,这主要影响“新文件”,而不是存储库中已经存在的文件。如果您使用git克隆来克隆我的分叉https://github.com/christianheinrichs/Spoon-Knife.git
例如,然后应用链接测试脚本的工作流程,您将看到,在大多数情况下,您可以将README.md文件重命名为README,例如,编辑它,它仍将被视为重命名,而不是新文件/已删除拆分
虽然我可以在克隆的勺子-刀叉回购协议上复制新的文件/删除行为,但我不确定我是如何做到的,相信我,当我说我试图弄清楚的时候
我不明白到底发生了什么
请参阅:git
没有保留一个标志,表明“此newname
文件最初名为oldname
文件”:
当显示文件的状态时,git
通过比较文件的内容并查看它们的相似程度,尝试猜测它是重命名
还是删除+添加
因此:如果您从一个文件git mv
开始,然后编辑该文件,这取决于该文件被修改的程度,git可能会或可能不会看到它都是从一个mv
开始的
另请参见此问题的答案:git
不保留一个标志,表明“此newname
文件最初称为oldname
文件”:
当显示文件的状态时,git
通过比较文件的内容并查看它们的相似程度,尝试猜测它是重命名
还是删除+添加
因此:如果您从一个文件git mv
开始,然后编辑该文件,这取决于该文件被修改的程度,git可能会或可能不会看到它都是从一个mv
开始的
另请参见此问题的答案:另请注意,当您运行git diff
时,可以启用或禁用重命名检测,并设置“相似性阈值”数字。当git status
为您运行git diff
时,对于这种情况,它会将相似性阈值设置为50%:重命名检测始终处于启用状态,并且阈值是固定的。@torek我假设您谈论的是git diff-M[],--find rename[=]
?这是一个我不知道的很好的特性,可能在我的第二个问题中部分解释了这个问题。@LeGEC谢谢你的回答。然而,在我接受它之前,你能在我所附的第二个问题中解释Git的行为吗<代码>还有,如果你在第一行添加了一些东西,为什么Git没有检测到重命名,但是如果你改为创建两行新行并用新代码填充第三行,Git会检测到重命名?
@legec Nevermind,我移动了第二个问题并接受了你的答案。@ChristianHeinrichs:是的,我指的是-M
选项。事实上,它确实解释了整个过程。还要注意,当您运行git diff
时,您可以启用或禁用重命名检测,并设置“相似性阈值”数字。当git status
为您运行git diff
时,对于这种情况,它会将相似性阈值设置为50%:重命名检测始终处于启用状态,并且阈值是固定的。@torek我假设您谈论的是git diff-M[],--find rename[=]
?这是一个我不知道的很好的特性,可能在我的第二个问题中部分解释了这个问题。@LeGEC谢谢你的回答。然而,在我接受它之前,你能在我所附的第二个问题中解释Git的行为吗<代码>还有,如果你在第一行添加了一些东西,为什么Git没有检测到重命名,但是如果你改为创建两行新行并用新代码填充第三行,Git会检测到重命名?@legec Nevermind,我移动了第二个问题并接受了你的答案。@ChristianHeinrichs:是的,我指的是-M
选项。事实上,它确实解释了整件事。
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: something
deleted: somethingelse
git mv oldname newname
# is exactly equivalent to :
mv oldname newname
git rm oldname
git add newname