Движение будет обнаружено, если вы сделаете прямое сравнение до и после ревизии, но не при просмотре обычного 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
, чтобы объединить добавление файлов обратно в ревизию, которая их удалила.Однако это может иметь нежелательные побочные эффекты , если изменения с плохой историей уже были загружены другими.