4

I'm looking in the commit history using gitk and git log and I'm trying to see how a specific commit arrived in a certain branch. I can see the commits in the history, so I know they are there.

What I want to understand is how they got merged (they were supposed to remain on their own branch). This is a very large project and there are hundreds of commits between the commit in question and the current state of the branch, so I cannot clearly decipher through the limited DAG in gitk, and the commit gets masked in other branches and merges and commit messages.

To do this, I have been trying:

gitk {sha1hashIDstring}..branch_name
gitk {sha1hashIDstring}..branch_name --ancestry-path
git log {sha1hashIDstring}..branch_name --reverse
git log {sha1hashIDstring}..branch_name --merges --reverse
git log {sha1hashIDstring}..branch_name --ancestry-path --reverse
git log {sha1hashIDstring}..branch_name --ancestry-path --merges --reverse

And I'm not understanding the results. I ONLY want to see items that include the specific commit in question, such that I see clearly how it got into the branch in question. How do I do so?

Example

What I'm looking for, in gitk preferrably but git log would suffice:

Message       Author         Date         #commit that merged branch z into current branch
Message       Author         Date         #commit that merged branch y into branch z
Message       Author         Date         #commit that merged branch x into branch y
Message       Author         Date         #commit that merged {sha1hashIDstring} commit/branch a into branch x
Message       Orig_Author    Date         #{sha1hashIDstring} original commit, on branch a

More Information

I'm not seeing any answers yet, so I'll start a bounty if none come in, but perhaps I'm not explaining the question right (I'm open to suggestions to improve and clarify).

The driver for this is that I can see the commit itself, and I'm being told it should not be on a certain branch. Here's what I'm seeing:

Message       Orig_Author    Date         #{sha1hashIDstring} commit
Message       Orig_Author    Date         #Merged into branch test_dec14 (includes original commit)
...
Message       Author         Date         # unrelated commits
Message       Author         Date         # more unrelated commits
# Stuff happened here ??? everything I do gives me hundreds of things here 
# Not all of them related to the {sha1hashIDstring} commit
# No idea how to see only the ones that are
...
Message       Author         Date         # final commit on test_jan15 branch

I'm being told commits in test_dec14 should not have made it to test_jan15 unless they were released, and as such the {sha1hashIDstring} commit SHOULD NOT BE in test_jan15, yet it is. I want to know why, how it got there, and who put it there.

Ehryk
  • 1,781
  • 2
  • 24
  • 46
  • I presume you are using "--merges" and not "--merge" ? `git log sha..branch --ancestry-path --merges` – Andrew C Jan 27 '15 at 22:51
  • Yes, edited - thank you. – Ehryk Jan 27 '15 at 22:53
  • What's the problem with the output then? Do you just need --pretty="%s %an %ad" ? – Andrew C Jan 27 '15 at 23:20
  • The output list hundreds of commits between the branch HEAD and the commit, most of which have nothing to do with merging the specific commit into the branch. – Ehryk Jan 27 '15 at 23:23
  • `--ancestry-path --merges` provides reasonable output in my own repositories. No clue as to why it wouldn't in yours. – Andrew C Jan 27 '15 at 23:36
  • As I mentioned, this is a huge project. It has ~30 active full time developers, and the DAG breaks in gitk because it cannot show them all. I only want to see commits that were involved in putting that specific commit into the chosen branch. – Ehryk Jan 27 '15 at 23:45
  • There are literally hundreds on feature branches merged onto our test branch every month. – Ehryk Jan 27 '15 at 23:49
  • @AndrewC do my edits make it more clear what I'm asking and why the output is a problem? – Ehryk Jan 28 '15 at 19:05
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/69768/discussion-between-andrew-c-and-ehryk). – Andrew C Jan 28 '15 at 20:39
  • Does [`merges-introducing`](http://stackoverflow.com/a/27435086/1290731) do it for you? – jthill Jan 30 '15 at 00:46

5 Answers5

2

For the latter part of your question, "how it got in the current branch?", take a look at git-when-merged.

It's a Python script that will, per its readme:

Find when a commit was merged into one or more branches. Find the merge commit that brought COMMIT into the specified BRANCH(es). Specifically, look for the oldest commit on the first-parent history of BRANCH that contains the COMMIT as an ancestor.

This sounds like what you're looking for in the case of determining when the {sha1hashIDstring} commit was merged into test_jan15 branch.

Jason Jones
  • 871
  • 5
  • 5
1

This is a classic case of git bisect. bisect help you trace bugs. In your case you simply looking for a commitId (which is misplaced into the wrong branch).

Bisect is a very simple yet powerful tool.

http://git-scm.com/docs/git-bisect http://hashrocket.com/blog/posts/finding-failure-git-bisect

Hope it will help you out.

CodeWizard
  • 92,491
  • 19
  • 110
  • 133
  • I thought the same at first, but this not going to help him. Sounds like he already knows the commit in question, now he is trying track down how it got merged, and who did it. – eddiemoya Feb 03 '15 at 17:48
1

Have you tried the "--decorate" option to git log?

I have this alias in my .gitconfig:

[alias]

        k = log --graph --oneline --abbrev-commit  --decorate

It shows a similar graph as the one shown by gitk, with the branch names "decorated" besides the most recent commit in the branch.


OR

--

Try tig as well. It is more informative than gitk (as per my usage ;)). Refer to http://gitready.com/advanced/2009/07/31/tig-the-ncurses-front-end-to-git.html once. I think either solution will give you required results.

love
  • 2,823
  • 2
  • 14
  • 32
1

I googled something and got something for you. credit goes to #vonC

git when-merged [OPTIONS] COMMIT [BRANCH...]

Find when a commit was merged into one or more branches. Find the merge commit that brought COMMIT into the specified BRANCH(es).

Specificially, look for the oldest commit on the first-parent history of BRANCH that contains the COMMIT as an ancestor.

git-what-branch

Discover what branch a commit is on, or how it got to a named branch This is a Perl script from Seth Robertson that seems very interesting:

SYNOPSIS

git-what-branch [--allref] [--all] [--topo-order | --date-order ]
[--quiet] [--reference-branch=branchname] [--reference=reference]
<commit-hash/tag>...
OVERVIEW

Tells us (by default) the earliest causal path of commits and merges to cause the requested commit got onto a named branch. If a commit was made directly on a named branch, that obviously is the earliest path.

By earliest causal path, we mean the path which merged into a named branch the earliest, by commit time (unless --topo-order is specified).

PERFORMANCE

If many branches (e.g. hundreds) contain the commit, the system may take a long time (for a particular commit in the linux tree, it took 8 second to explore a branch, but there were over 200 candidate branches) to track down the path to each commit. Selection of a particular --reference-branch --reference tag to examine will be hundreds of times faster (if you have hundreds of candidate branches).

**EXAMPLES**
 # git-what-branch --all 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4
 1f9c381fa3e0b9b9042e310c69df87eaf9b46ea4 first merged onto master using the following minimal temporal path:
   v2.6.12-rc3-450-g1f9c381 merged up at v2.6.12-rc3-590-gbfd4bda (Thu May  5 08:59:37 2005)
   v2.6.12-rc3-590-gbfd4bda merged up at v2.6.12-rc3-461-g84e48b6 (Tue May  3 18:27:24 2005)
   v2.6.12-rc3-461-g84e48b6 is on master
   v2.6.12-rc3-461-g84e48b6 is on v2.6.12-n
   [...]
love
  • 2,823
  • 2
  • 14
  • 32
0

I know this isn't tagged with "github" - but if the project is on there the visual style of Blame or History (buttons in file header when viewing a specific file) can make it a lot easier to trace when things happened.

Not sure if that actually solves this (very) specific issue - but it might help others with similar issues who find this question...

Rycochet
  • 2,690
  • 1
  • 19
  • 35