Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.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 - Fatal编程技术网

强制Git显示删除+;移动到删除路径作为删除+;重命名而不是编辑+;删除

强制Git显示删除+;移动到删除路径作为删除+;重命名而不是编辑+;删除,git,Git,这可能与通常的问题相反:我希望Git比实际更积极地进行重命名检测 $ git init demo Initialized empty Git repository in …/demo/.git/ $ cd demo $ echo '#include b' > a $ (for x in {00..99}; do echo $x; done) > b $ git add a b $ git commit -m initial [master (root-commit) …] initi

这可能与通常的问题相反:我希望Git比实际更积极地进行重命名检测

$ git init demo
Initialized empty Git repository in …/demo/.git/
$ cd demo
$ echo '#include b' > a
$ (for x in {00..99}; do echo $x; done) > b
$ git add a b
$ git commit -m initial
[master (root-commit) …] initial
 2 files changed, 101 insertions(+)
 create mode 100644 a
 create mode 100644 b
$ git rm a
rm 'a'
$ git mv b a
$ git commit -m inlined
[master …] inlined
 2 files changed, 100 insertions(+), 101 deletions(-)
 delete mode 100644 b
$ git show -p
commit … (HEAD -> master)
Author: …
Date:   …

    inlined

diff --git a a
index …..… 100644
--- a
+++ a
@@ -1 +1,100 @@
-#include b
+00
+01
+02
+03
+04
+05
…
+95
+96
+97
+98
+99
diff --git b b
deleted file mode 100644
index …..0000000
--- b
+++ /dev/null
@@ -1,100 +0,0 @@
-00
-01
-02
-03
-04
-05
…
-95
-96
-97
-98
-99
是否有某种方式可以将此更改显示为我所期望的内容—删除
a
,并将
b
移动到
a
—但作为原子提交,因为中间状态无效

我特别关心GitHub如何将其呈现给代码审查

更一般地说,我可能会在移动后稍微编辑大文件(其行的一小部分),我希望diff只在移动顶部显示这些编辑,就像Git在没有被重命名为以前存在的文件路径时自动做的那样。实际上,真正的编辑会在噪音中丢失。

不幸的是,否:Git(和GitHub)的重命名检测基于左侧提交中的文件名在右侧提交中根本找不到,而右侧提交中的某些文件在左侧提交中根本找不到

也就是说,如果我们有:

left        right
-----       -----
fileA       fileA
fileB
            fileC
fileD       fileD
然后,唯一的重命名候选项是和。文件被视为“同一文件”(成对,或“标识”为verb1),因为它们具有相同的路径名,并且类似地,文件已按名称标识,只剩下B和C未配对

当您手动运行
git diff
(或
git show
或任何内部调用
git diff
的操作)时,您可以添加
-B
选项,该选项允许您在文件完全不同的情况下“中断”预先声明的基于路径名的配对。2因此,在命令行上,您可能可以实现您想要的功能。但是GitHub不提供
-B
选项


也就是说,Git在这一点上关注的是形而上学的同一性问题。看见某个文件的版本X是否与该文件的版本Y“相同”?我们怎么知道

2
-B
选项包含两个数字,这两个数字最终都表示为相似性指数百分比。如果两个文件内容的相似性索引低于阈值,则首先尝试将基于初始名称的配对分为单独的“删除旧左侧文件”和“添加新右侧文件”。然后,如果启用了
-M
(可能通过
diff.rename
,它现在是默认值true而不是默认值false),它们将成为重命名检测的候选对象。如果重命名检测没有删除一个或两个对,它们将重新加入,除非相似性指数低于第二个通常更宽松的阈值


-B
数值参数是用不相似性而不是相似性来表示的,但是文件F的版本X与文件F的版本Y的相似性只是100减去相似性。

解释得很好,谢谢。实际上,
-B
是一个技巧,它通过手动差异来实现这一点。