“git mv”和“mv”命令在运行时有什么区别?(涉及IT技术)

15

使用类似以下命令时,源代码控制系统的结果实际上有何不同:

git mv <src> <dest>  # see: https://git-scm.com/docs/git-mv

与“低级”命令相比

mv <src> <dest>

从版本/源代码控制系统的角度来看,结果是否有任何差别?或者从任何事物/任何人的角度来看是否有差别?

对于其他像git rm这样的git命令也是一样。我只是想知道在运行git函数与bash函数或其他函数之间有什么区别。


为什么要使用 svnmercurialperforce 标签? - Lucero
因为这个概念可能也适用于其他编程工具,而不仅仅是 Git :) - Alexander Mills
理想情况下,我们不应该仅仅受Git/Github的支配 :) - Alexander Mills
3个回答

11
git mv会将移动操作暂存,所以你只需要在之后执行git commit命令即可。如果你手动移动文件,需要在提交之前手动暂存移动操作。
除此之外,没有区别只有Leon's answer提到的微小差别。git mv文档中写道:

移动或重命名文件、目录或符号链接。

...

成功完成后索引会被更新,但是改动仍需被提交。


阶段 = git add x? - Alexander Mills
1
是的,git add将更改暂存。 - 1615903
那很酷,你知道它是否会产生其他的差异吗? - Alexander Mills
实际上,这里有一个小差别。 - Leon

7

补充一点信息,与其他答案不同的是(这仅适用于 giv mv):

如果文件 <dest> 存在(无论是否被追踪),那么

mv <src> <dest>

会默默地覆盖它,而

git mv <src> <dest>

拒绝覆盖此文件,并显示以下错误信息:
fatal: destination exists, source=<src>, destination=<dest>

2
如果thisthat都是文件夹,那么mv this that将会使得that/this的目录结构产生变化,但是如果that是一个文件,则会出现错误提示,告诉你mv无法覆盖它。这个答案仅适用于两个文件的情况。 - Jonatan Öström

5

由于您标记了不同的SCM产品而不仅仅是git,因此我会以更一般的方式回答这个问题。

每个源代码控制系统都跟踪文件的不同信息。例如,在Mercurial中,移动操作也被跟踪,因此除了重命名文件的删除和添加之外,它还存储有关重命名的信息,以及该文件在重命名之前的名称。

此外,当删除文件时,通常需要将其从SCM中删除(有时也称为“遗忘”)。

因此,一般来说,SCM文件操作命令会更新文件系统以及SCM跟踪此更改所需的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接