В git вы можете просмотреть старые коммиты, применяемые к файлу после его перемещения?
После того, как я переместил файл в git (используя git mv
), просмотр журнала для этого файла показывает только коммиты, включая и после перемещения.
Есть ли способ просмотреть коммиты, применяемые к файлу под его старым именем? В приведенном ниже примере я хотел бы видеть коммиты b04033bdc44f1 и 8ca40d563ce5d в git log
после того, как я сделал ход.
$ git init
Initialized empty Git repository in /Users/ben/code/git_mv_example/.git/
$ touch foo
$ git add foo
$ git commit -m "Initial commit"
Created initial commit 8ca40d5: Initial commit
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
[master*]$ echo "abcdefg" > foo
[master*]$ git commit -a -m "edited foo"
Created commit b04033b: edited foo
1 files changed, 1 insertions(+), 0 deletions(-)
$ git log foo
commit b04033bdc44f1eb3477270b4b7ca727377d8c03a
Author: Ben Brinckerhoff <[email protected]>
Date: Tue Jun 2 13:26:53 2009 -0600
edited foo
commit 8ca40d563ce5d07d965bfb75a01b9c23378fd321
Author: Ben Brinckerhoff <[email protected]>
Date: Tue Jun 2 13:26:15 2009 -0600
Initial commit
$ git mv foo bar
[master+]$ git commit -a -m "renamed foo to bar"
Created commit 2bccdf6: renamed foo to bar
1 files changed, 0 insertions(+), 0 deletions(-)
rename foo => bar (100%)
$ git log bar
commit 2bccdf6fc65b9da5b279d9f1117e436549dd3a7b
Author: Ben Brinckerhoff <[email protected]>
Date: Tue Jun 2 13:27:14 2009 -0600
renamed foo to bar
$ git log foo
fatal: ambiguous argument 'foo': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions
Разве это невозможно? Или может быть git log
неправильная команда для этого?
Ответы
Ответ 1
'git-log -M
' предоставит историю фиксации с информацией переименования, как упоминалось в GitFaq "Почему git not" track "переименовывает?"
Механизм diff
в git поддерживает автоматическое обнаружение переименований, он включается переключателем '-M
в семейство команд git-diff-*
.
Механизм обнаружения переименования используется git-log
и git-whatchanged
.
Git также поддерживает ограниченную форму слияния переименований. Два инструмента для назначения вины, git-blame
и git-annotate
оба используют код автоматического переименования для отслеживания переименований.
В качестве особого случая 'git log
' версия 1.5.3 и более поздняя имеет опцию '--follow
' что позволяет вам переименовывать, когда задан единственный путь.
в вашем примере:
F:\prog\git\test\rename>git log --follow bar
commit 81f52b91eb2fc7ad18051c93f3e4d583f27c15ca
Author: VonC <>
Date: Tue Jun 2 21:54:43 2009 +0200
renamed foo to bar
commit 71aff26ace6ab249ab2042d1e5d20377486ce478
Author: VonC <>
Date: Tue Jun 2 21:54:19 2009 +0200
edited foo
commit c893199da767eddac6a547b940557435ade4d18c
Author: VonC <>
Date: Tue Jun 2 21:53:51 2009 +0200
initial commit
Примечание: все это возможно, потому что вы не изменили содержимое foo
до переименования в bar. Если содержимое было совершенно иным, параметр --follow
не смог бы получить всю историю.
Ответ 2
Короткий ответ: используйте
$ git log -M --follow bar
или
$ git log -M -- foo bar
с указанием как старого, так и нового имени.
Кстати, поскольку git использует определение переименования на основе эвристического сходства, примеры игрушек могут работать не так, как вам хочется, в то время как примеры реальной жизни (или примеры с более неизменным содержимым) будут работать, как ожидалось.
Обратите внимание, что в пути git в качестве аргумента для git -log нет фильтра путей, но ограничителя пути (и может быть, например, быть каталогом).