Git - 会检测到文件移动吗?

时间:2011-01-17 09:44:05

标签: git

我在分支(A)上进行了一些修改。

然后我决定根据我现有的工作副本和提交的状态创建一个全新的分支(B)并推送到那个。

在我之前的重构期间,有许多文件被移动,因此现在不包含在直接在文件系统中移动的版本控制中。在提交和推送到新分支(B)之前,我没有将这些文件添加到git中。

如果我现在添加这些文件并提交并推送,Git能否检测到文件移动操作?

4 个答案:

答案 0 :(得分:5)

如果它们是作为两个单独的提交完成的,则不会,因为文件将在一个修订中删除,并在新修订中创建新文件。如果要保留重命名,则应该git commit --amend将附加内容附加到上一次提交中。

答案 1 :(得分:3)

如果您在修订前后进行直接比较,则会检测到此移动,但如果您查看常规git log则不会:

[bd@satoko testgit] echo hello world > foo
[bd@satoko testgit] git init
gitInitialized empty Git repository in /home/bd/testgit/.git/
[bd@satoko testgit] git add foo
[bd@satoko testgit] git commit -m 'test'
[master (root-commit) 772dbe5] test
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 foo
[bd@satoko testgit] mv foo bar
[bd@satoko testgit] echo baz > quux
[bd@satoko testgit] git add quux
[bd@satoko testgit] git commit -a -m 'rm; add'
[master 59dd10b] rm; add
 2 files changed, 1 insertions(+), 1 deletions(-)
 delete mode 100644 foo
 create mode 100644 quux
[bd@satoko testgit] git add bar
[bd@satoko testgit] git commit -m 'add'
[master 823f70f] add
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 bar

[bd@satoko testgit] git log --stat -m
commit 823f70fe50828204686a6a42a5e98dc9b258903b
Author: Bryan Donlan <bdonlan@fushizen.net>
Date:   Mon Jan 17 05:06:16 2011 -0500

    add

 bar |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

commit 59dd10bfb72bb9005edecb1b7609978d82d21652
Author: Bryan Donlan <bdonlan@fushizen.net>
Date:   Mon Jan 17 05:05:58 2011 -0500

    rm; add

 foo  |    1 -
 quux |    1 +
 2 files changed, 1 insertions(+), 1 deletions(-)

commit 772dbe5357253b533f8f2b9c64836dc09a51def4
Author: Bryan Donlan <bdonlan@fushizen.net>
Date:   Mon Jan 17 05:04:35 2011 -0500

    test

 foo |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
### As you can see, a log doesn't show the move, but...
[bd@satoko testgit] git diff --stat  823f..772d -M
 bar => foo |    0
 quux       |    1 -
 2 files changed, 0 insertions(+), 1 deletions(-)
### A direct comparison does

这种行为是因为git实际上并不保存移动/重命名信息 - 它通过比较添加/删除文件的内容来重建它。通过直接比较,它只查看前/后状态,因此确切地添加/删除文件无关紧要。但是,使用git log时,它会比较成对修订,因此它只能看到“已删除”或“已添加”,而不是两者。

如果这是一个问题,您可能需要考虑使用git rebase --interactive将文件的添加合并回删除它们的修订版。但是,如果其他人已经下载了包含错误历史记录的修订版,则可以unwanted side effects

答案 2 :(得分:0)

但是git按内容处理对象,而不是路径。这意味着当您移动对象(文件)或删除/添加对象时,它没有任何区别。它只会在git repo数据库中存储一次。

答案 3 :(得分:0)

鉴于Git不存储任何重命名信息,而是运行某种重命名检测机制,你应该没问题。另请参阅Handling renames: svn vs. git vs. mercurial