tags:

views:

574

answers:

2

After I have moved a file in git (using git mv), looking at the log for that file only shows the commits including and after the move.

Is there any way to view the commits applied to the file under its old name? In the example, below, I'd like to see commits b04033bdc44f1 and 8ca40d563ce5d in git log after I've done the move.

 $ 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

Is this not possible? Or perhaps is git log the wrong command for this?

+10  A: 

'git-log -M' will give the commit history with rename information, as mentioned in GitFaq "Why does git not "track" renames ?"

The diff machinery in Git has support for automatically detecting renames, this is turned on by the '-M' switch to the git-diff-* family of commands.
The rename detection machinery is used by git-log and git-whatchanged.
Git also supports a limited form of merging across renames. The two tools for assigning blame, git-blame and git-annotate both use the automatic rename detection code to track renames.

As a very special case, 'git log' version 1.5.3 and later has '--follow' option that allows you to follow renames when given a single path.


in your example:

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


Note: all of this is possible because you did not drastically modified content of foo before renaming to bar. If the content was entirely different, the --follow option would not been able to get the all history.

VonC
Awesome, thanks for the great answer!
Ben Brinckerhoff
+5  A: 

Short answer: use

$ git log -M --follow bar

or

$ git log -M -- foo bar

specifying both old and new name.

By the way, as git uses heuristic similarity based rename detection, toy examples might not work like you want, while real life examples (or examples with more unchanged contents) would work as expected.

Note that in git path as an argument to git-log is not path filter, but path limiter (and can for example be a directory).

Jakub Narębski
Good points. +1. Could you detail the "heuristic similarity based rename detection" part related to "toy" examples as opposed to real life examples ?
VonC
Take a look example output for testing that rename detection in git test suite, e.g. http://repo.or.cz/w/git.git?a=blob;f=t/t4001-diff-rename.sh
Jakub Narębski