Git无法识别重命名和修改的包文件

Sot*_*lis 13 java git

我有一个名为的java文件package/old/myfile.java.我通过git提交了这个文件.然后我重命名我的包,new所以我的文件在package/new/myfile.java.

我现在想要将此文件重命名(和内容更改)提交给git.

我什么时候git status得到

# Changes not staged for commit:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       deleted:    package/old/myfile.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       package/new/myfile.java
Run Code Online (Sandbox Code Playgroud)

我试过add新的和rm旧的,反之亦然,我一直在努力

$ git status
# On branch develop
# Changes to be committed: 
#        delete:    package/old/myfile.java
#        new file:  package/new/myfile.java
Run Code Online (Sandbox Code Playgroud)

我不能这样做,mv old new因为旧文件不存在,所以我得到bad source错误.

还有什么我可以尝试的吗?

我已经在SO上尝试了一些针对类似问题的多个答案,但它们没有奏效.

asm*_*asm 18

相关部门混帐书解释了这一点.

与许多其他VCS系统不同,Git没有明确跟踪文件移动.如果您在Git中重命名文件,Git中不会存储任何元数据,告诉您重命名该文件.但是,Git非常聪明地确定了事后的结果 - 稍后我们会处理检测文件移动的问题.

这意味着如果您移动文件然后进行重大更改,git将不会知道这是一个移动.它会看到一个文件被删除并且创建了一个新文件,因为新文件看起来不像旧文件.为了解决这个问题,人们经常git mv提交文件,提交移动,然后进行更改.在你的情况下,你可以做到

git reset # Move changes from index to working copy
git checkout package/old/myfile.java # Undo delete
git mv package/old/myfile.java package/new/myfile.java # Move file
Run Code Online (Sandbox Code Playgroud)


Nev*_*nel 6

将文件移回,然后提交,并将实际移动放入单独的提交中.Git不会记录移动(或重命名),但可以根据内容识别它们.如果内容发生变化,则无法正确检测到移动.因此,通常的做法是将移动和更改分成两个提交.