23

I'm always asking myself a set of questions about branches i've created that i've yet to determine how to accomplish:

  1. What files did i change in branch?
  2. What are the actually changes (diff) i made to the branch?
  3. What is the log of commits that i made to the branch?

Now i think if figured out how to get the hashes of all the commits that were committed to the branch but not merged into master using git cherry master <branchname>. With this i could go hash by hash and figure out everything but if you have a lot of commits this could be time consuming. Notice i'm not wanting to compare to current state of master. I think the key is knowing the hash of master that you created your branch off of but i'm not exactly sure how to determine this.

coding4fun
  • 8,038
  • 13
  • 58
  • 85

3 Answers3

34

To find where your current checkout diverged from the master branch,

base=`git merge-base master HEAD`
echo $base

to find out what files have been changed since then,

git diff --name-only $base HEAD

to show the accumulated difference

git diff $base HEAD

When you want to describe an entire series of commits you can use the syntax in the answer Gabriele Petronella linked above, master..HEAD is shorthand for HEAD ^master which means "all commits reachable from HEAD, but not including commits reachable from master". Missing endpoints default to HEAD, so you can say git log --oneline master..

jthill
  • 55,082
  • 5
  • 77
  • 137
  • Thanks so much. Relatively new to git so i wasn't aware of the "merge-base" command. This answers my question perfectly. – coding4fun Apr 11 '13 at 18:02
  • 1
    Thanks! If you are using an external diff tool like [Beyond Compare](http://stackoverflow.com/q/2069490/266535), change the last line to `git difftool $base HEAD --dir`. It's useful when doing a code review of someone else's branch. – styfle Jun 16 '16 at 18:58
16

Assuming you branched from master,

1. What files have changed since branching?

git diff master...<branchname> --name-only

2. What is the full diff since branching?

git diff master...<branchname>

3. What is the commit log since branching?

git log master..<branchname>

You do not need to specify <branchname> if you have it checked out (e.g., git diff master...).

Note: git diff requires triple dot ... and git log requires double dot .. to get the behavior that you are asking for.


For explanations on dot syntax, see:

Community
  • 1
  • 1
anishpatel
  • 1,472
  • 1
  • 16
  • 23
2

For the list of files changed and the actual diff, it makes more sense if you know 2 commits between which you wanna compare.

If you want to see the diff between START_SHA1 and END_SHA1, you could do:

git diff START_SHA1 END_SHA1

If you want just the list of files, you could do:

git diff --name-only START_SHA1 END_SHA1

If you also want to know what type of change went into the file (like A, M, D, C, R, U), you could do:

git diff --name-status START_SHA1 END_SHA1
Tuxdude
  • 47,485
  • 15
  • 109
  • 110