Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的“git mv”行为_Git_Github_Git Mv - Fatal编程技术网

奇怪的“git mv”行为

奇怪的“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>

上个月,我开始为GitHub存储库做贡献,方法是分叉相应的repo,创建一个功能分支,然后提交一个pull请求。在重复这一过程几天的过程中,我在使用预装的Linux命令
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