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