让Git确认先前移动的文件

Mic*_*ael 66 git

我在没有考虑的情况下手动移动了一堆文件,并且找不到让git认识到文件只是被移动而不是实际上不同的文件的方法.有没有办法做到这一点,除了删除旧的和添加新的(从而丢失历史),或使用git-mv重做所有更改?

Hug*_*ugo 68

要让git删除已经删除或移动的文件,只需输入即可

git add -u
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下这是做什么的吗? (10认同)
  • +1:谢谢,这正是缺少的.当`git status`没有移动或重命名时,`git add -u`修复了它. (8认同)
  • @OlivierBlanvillain:'git add -u'对git正在跟踪的所有文件进行分级,并且在工作目录中也进行了更改.请注意,如果您将文件移动到Git未跟踪的目录,则'add -u'将不会检测到移动.如果您稍后将目标目录添加到Git并重新执行'add -u',Git将会正确地选择移动. (5认同)

Jor*_*eña 22

我认为它已经这样做了.现在,我可能是错的,但我读过git根据文件系统中的位置或基于delta /差异来跟踪文件的内容.在堆栈中我认为它显示它好像文件被删除然后重新添加,但我想我已经尝试了一次它仍然保持历史,由于上述git跟踪事物的方式.

如果有人确认我是否正确,仍然会有所帮助.对不起,如果我误解了你的问题.

  • 这是对的.移动文件(分别在旧文件和新文件上使用"git rm"和"git add")和使用"git mv"之间应该没有区别.迈克尔:如果问题是你没有在"git log FILE"中看到移动前的历史记录,请尝试使用"git log --follow FILE". (18认同)
  • 不适合我.Git将文件视为已删除并添加了一个新文件.不知道我做错了什么.可能是一个bitbucket问题,因为看起来Git在我提交时检测到文件被重命名. (7认同)
  • 这一切都取决于文件移动后的差异,这是愚蠢的.如果将dummy.class重命名为clean_refactor.clas,则最有可能*通过至少重命名类名来更改文件的内容.这些更改可以使git没有意识到dummy.class和clean_refactor.class属于同一个历史记录:( (2认同)
  • @JorgeIsraelPeña只是重命名文件不会有问题.但是通常在重构期间重命名文件,并且与重构相关的代码中的更改会混淆git. (2认同)

CB *_*ley 11

git不会跟踪单个文件的历史记录,也不会特别处理移动和副本,也就是说没有特殊的元数据表明发生了移动或复制.相反,每个git commit都是工作树的完整快照.

除了列出哪些文件已更改的选项之外,如果您想要查看git log可以提供的移动-M,例如

git log --summary -M
Run Code Online (Sandbox Code Playgroud)

git 将查看提交历史记录中的相邻树,并推断每个提交移动的文件是否存在.

要查找副本以及重命名,您可以使用该-C选项,您可以提供两次以使git看起来更难以查找可能的复制源,但会牺牲一些性能.

git log --summary -M -C -C
Run Code Online (Sandbox Code Playgroud)

请注意,因为Git不会存储文件历史记录(仅提交历史),即使你没有git rmgit mv文件,你就不会丢失任何历史.对路径的所有更改仍将被记录并在a中可见git log.

  • 您还可以在`.git/config`(存储库配置)或`〜/ .gitconfig`(用户配置)中将`diff.renames`配置变量设置为`true`.有关详细信息,请参阅git-config联机帮助页. (2认同)

Jak*_*ski 5

为了更好地理解为什么Git确实重命名检测而不是(更常见的)显式重命名跟踪,以及git log 路径限制如何工作,你可以阅读由Git的维护者Junio C Hamano 阅读Linus的终极内容跟踪工具博客文章(以及其中的参考文献).