Git is a DAG of snapshots, with each node on the graph representing a commit. Each commit can have 'n' parent commits.
Given any two commits, is there a single, concise way to discern the "order" of these two in the DAG. git rev-list
seems to be the most promising, but I can't seem to find the right incantation.
Ideally, I'd have something like the following
$ git related hash1 hash2
hash1 is ancestor of hash2
OR
hash2 is ancestor of hash1
OR
hash1 unrelated to hash2
OR
hash1 is equal to hash2
Use
git merge-base --is-ancestor <commit1> <commit2>
There is more than one way to find the answer to this. The simplest is to use
From the documentation for
git merge-base
:Other options
git log with triple dot
...
notationAnother option is to use
git log
and use triple dot notation...
to tell Git to output the set union of the child commits, minus the set intersection. Basically, it tells you how a set of commits have diverged from each other:The above command will show you commits that are reachable from
commit1
orcommit2
, but not both, i.e. C1 UNION C2 - C1 INTERSECTION C2, in terms of set operations.If neither commit is a parent of the other, you'll see the child commits of both, but if one is an ancestor of the other, you'll only see the output for the descendant commit, since the ancestor is contained in the path of the descendant, and is thus excluded from the output.
You can read more about
git log
and triple dot notation from the following resources:git branch --contains option
git-rev-list(1) seems like it could be used to answer this. Another way is to simply attach temporary branch labels to the commits you want to test, and then use the
--contains
option forgit branch
:The output will be all branches that contain the commit somewhere in their commit tree, so by using a temporary branch on the other commit, you can see if the commit you're testing is an ancestor.
From the documentation: