Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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合并_Git_Github - Fatal编程技术网

移动文件的Git合并

移动文件的Git合并,git,github,Git,Github,我分叉了一个repo并更改了文件a。现在上游repo中的文件a已移动到子目录。我正试图将上游回购合并到我的分支中 Git认为文件A在其原始位置被删除,在新的子目录中创建了一个新的文件(这也可能是因为他们将文件向上游移动的方式) 我想在新的位置对这个文件进行修改,尽量减少可能的影响、提交的w.r.t历史记录等等。有人能帮我解决这个问题吗?你需要使用git mv而不仅仅是mv来移动文件 由于git拍摄内容的快照,因此它不关心文件名(作为元数据存储在idx文件中) 如果您只是移动文件,git将不会“理

我分叉了一个repo并更改了文件a。现在上游repo中的文件a已移动到子目录。我正试图将上游回购合并到我的分支中

Git认为文件A在其原始位置被删除,在新的子目录中创建了一个新的文件(这也可能是因为他们将文件向上游移动的方式)


我想在新的位置对这个文件进行修改,尽量减少可能的影响、提交的w.r.t历史记录等等。有人能帮我解决这个问题吗?

你需要使用
git mv
而不仅仅是
mv
来移动文件

由于
git
拍摄内容的快照,因此它不关心文件名(作为元数据存储在idx文件中)

如果您只是移动文件,git将不会“理解”您想要移动它,并将其视为一个新文件

您需要还原更改,然后使用:

git mv <old path> <new path>
git mv

现在,在git状态下,您将看到文件的移动,而不是删除一个文件和创建一个新文件。

git总是通过比较有问题的两棵树(或一棵树和索引,对于不包括
git merge
本身的情况)来检测“事后”重命名。(Linus Torvalds认为这是一项功能;例如,请参见。)

在任何情况下,
git merge
都将在启用合并检测的情况下运行git的内部差异,并且默认的相似性索引为50%,除非您另行配置。1类似地,
git diff
也有一些可配置的默认值。如果您在合并基础和上游之间手动运行
git diff--find renames-M50%
,您可能就没事了(但请参见关于配置的脚注1)

如果Git没有检测到重命名,您可能需要调整重命名检测阈值和/或增加Git应该考虑的文件数量。第一个是

-X
选项中的
重命名阈值(
重命名阈值
最早出现在git 1.7.4中)。有关详细信息,请参阅


您可以将代码>合并.RealMimule< /C> >以重命名检测的方式考虑文件的数量。如果未设置,则当前默认值为1000个文件(但默认值已随时间而更改)。此外,如果未设置该值,则“合并”将使用
diff.renameLimit
,因此您可以仅设置其中的第二个值,并使“差异”和“合并”同时使用这两个值

文件重命名检测的工作方式有点复杂,但足够简单,可以通过示例来描述。假设git将commit
12345
与commit
67890
进行比较,并且在
12345
中有路径名为
A
B/C
D
的文件;但是在
67890
中有路径名
B/gronk
B/C
D
。这意味着路径
A
已消失,但新路径
B/gronk
已出现。然后Git将记住这些路径(直到重命名限制值),并将
12345:A
的内容与
67890:B/gronk
的内容进行比较。如果文件“足够相似”,git将声明
12345:A
已重命名为
67890:B/gronk


我不确定git是如何决定一个文件是50%,还是75%,或者其他类似/不同的东西。我已经看到相似性索引是基于“块”而不是行的(即使通常的diff输出是面向行的),但是。

这是不正确的,或者至少是不完整的:git在比较两棵树时,或者在比较一棵树和索引时,根据其内部diff代码提供的标志,发现“事后”重命名。
git status
命令始终设置“检查重命名”,但
git diff
git show
使用
-M
-查找重命名
-不重命名
,以及您的配置设置(
diff.renames
diff.renamelimit
)来控制重命名检测机制。如果您已经重命名了一个文件,然后
git rm--cached
旧路径和
git add
新路径,您将获得与使用
git mv
相同的效果。我没有手动移动该文件。我正试图将上游回购协议与我的合并。在上游回购中移动。合并时是否存在冲突?通常Git足够聪明,能够发现文件被移动了。如果您只运行
git merge origin/master
(或者您的上游分支被称为什么)会发生什么?