据我所知,Git并不真正需要跟踪文件重命名/移动/复制操作,那么真正的目的是什么呢 git mv?手册页没有特别的描述性……

它过时了吗?它是一个内部命令,而不是供普通用户使用的吗?


当前回答

也许git mv在这些答案发布后发生了变化,所以我会简单更新一下。在我看来,git mv不能准确地描述为:

 # not accurate: #
 mv oldname newname
 git add newname
 git rm oldname

我经常使用git mv有两个原因,在之前的回答中没有描述:

移动大型目录结构,其中我混合了跟踪和未跟踪文件的内容。被跟踪和未跟踪的文件都将移动,并保持其跟踪/未跟踪状态 移动较大的文件和目录,我一直认为git mv将减少存储库DB历史大小。这是因为移动/重命名文件是索引/引用增量。我还没有证实这个假设,但它似乎是合乎逻辑的。

其他回答

git mv oldname newname

是:

mv oldname newname
git add newname
git rm oldname

也就是说,它会自动更新旧路径和新路径的索引。

在一个特殊的情况下,git mv仍然非常有用:当您想在不区分大小写的文件系统上更改文件名的大小写时。默认情况下,APFS (mac)和NTFS (windows)都是不区分大小写的(但保留大小写)。

格雷格。金德尔在对CB Bailey的回答的评论中提到了这一点。

假设你在mac上工作,git管理着一个文件Mytest.txt。您需要将文件名更改为MyTest.txt。

你可以试试:

$ mv Mytest.txt MyTest.txt
overwrite MyTest.txt? (y/n [n]) y
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

哦亲爱的。Git不承认文件有任何更改。

你可以通过重命名文件来解决这个问题:

$ mv Mytest.txt temp.txt
$ git rm Mytest.txt
rm 'Mytest.txt'
$ mv temp.txt MyTest.txt
$ git add MyTest.txt 
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    Mytest.txt -> MyTest.txt

华友世纪!

或者你可以使用git mv来节省你所有的麻烦:

$ git mv Mytest.txt MyTest.txt
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    Mytest.txt -> MyTest.txt

来自官方的GitFaq:

Git有一个重命名命令Git mv,但这只是为了方便。的影响 是难以区分的删除文件和添加另一个不同的 名称和内容相同

也许git mv在这些答案发布后发生了变化,所以我会简单更新一下。在我看来,git mv不能准确地描述为:

 # not accurate: #
 mv oldname newname
 git add newname
 git rm oldname

我经常使用git mv有两个原因,在之前的回答中没有描述:

移动大型目录结构,其中我混合了跟踪和未跟踪文件的内容。被跟踪和未跟踪的文件都将移动,并保持其跟踪/未跟踪状态 移动较大的文件和目录,我一直认为git mv将减少存储库DB历史大小。这是因为移动/重命名文件是索引/引用增量。我还没有证实这个假设,但它似乎是合乎逻辑的。

git mv还有一个上面没有提到的用途。

自从发现git add -p (git add的补丁模式;参见http://git-scm.com/docs/git-add),我喜欢在将更改添加到索引时使用它来查看更改。因此,我的工作流程变成了(1)处理代码,(2)检查并添加到索引中,(3)提交。

git mv是如何适应的?如果直接移动文件,那么使用git rm和git add,所有的更改都会被添加到索引中,而使用git diff查看更改就不那么容易了(在提交之前)。然而,使用git mv会将新路径添加到索引中,但不会对文件进行更改,因此允许git diff和git add -p照常工作。