Junio C Hamano | 1a4e841 | 2005-12-27 08:17:23 | [diff] [blame] | 1 | git-merge-base(1) |
| 2 | ================= |
| 3 | |
| 4 | NAME |
| 5 | ---- |
Junio C Hamano | 7c73c66 | 2007-01-19 00:37:50 | [diff] [blame] | 6 | git-merge-base - Find as good common ancestors as possible for a merge |
Junio C Hamano | 1a4e841 | 2005-12-27 08:17:23 | [diff] [blame] | 7 | |
| 8 | |
| 9 | SYNOPSIS |
| 10 | -------- |
Junio C Hamano | 2db3e75 | 2010-09-03 21:33:06 | [diff] [blame] | 11 | [verse] |
Junio C Hamano | b77f819 | 2011-05-05 01:30:38 | [diff] [blame] | 12 | 'git merge-base' [-a|--all] <commit> <commit>... |
| 13 | 'git merge-base' [-a|--all] --octopus <commit>... |
Junio C Hamano | 2db3e75 | 2010-09-03 21:33:06 | [diff] [blame] | 14 | 'git merge-base' --independent <commit>... |
Junio C Hamano | 1a4e841 | 2005-12-27 08:17:23 | [diff] [blame] | 15 | |
| 16 | DESCRIPTION |
| 17 | ----------- |
Junio C Hamano | 6959c6c | 2006-05-17 10:34:11 | [diff] [blame] | 18 | |
Junio C Hamano | fd9274d | 2009-08-05 21:21:39 | [diff] [blame] | 19 | 'git merge-base' finds best common ancestor(s) between two commits to use |
Junio C Hamano | 3f2f6e5 | 2008-08-21 10:34:22 | [diff] [blame] | 20 | in a three-way merge. One common ancestor is 'better' than another common |
| 21 | ancestor if the latter is an ancestor of the former. A common ancestor |
Junio C Hamano | ec87f52 | 2008-12-10 08:35:25 | [diff] [blame] | 22 | that does not have any better common ancestor is a 'best common |
Junio C Hamano | 3f2f6e5 | 2008-08-21 10:34:22 | [diff] [blame] | 23 | ancestor', i.e. a 'merge base'. Note that there can be more than one |
Junio C Hamano | ec87f52 | 2008-12-10 08:35:25 | [diff] [blame] | 24 | merge base for a pair of commits. |
Junio C Hamano | 6959c6c | 2006-05-17 10:34:11 | [diff] [blame] | 25 | |
Junio C Hamano | b77f819 | 2011-05-05 01:30:38 | [diff] [blame] | 26 | OPERATION MODE |
| 27 | -------------- |
| 28 | |
| 29 | As the most common special case, specifying only two commits on the |
| 30 | command line means computing the merge base between the given two commits. |
| 31 | |
| 32 | More generally, among the two commits to compute the merge base from, |
| 33 | one is specified by the first commit argument on the command line; |
| 34 | the other commit is a (possibly hypothetical) commit that is a merge |
| 35 | across all the remaining commits on the command line. |
Junio C Hamano | 1a4e841 | 2005-12-27 08:17:23 | [diff] [blame] | 36 | |
Junio C Hamano | fd9274d | 2009-08-05 21:21:39 | [diff] [blame] | 37 | As a consequence, the 'merge base' is not necessarily contained in each of the |
| 38 | commit arguments if more than two commits are specified. This is different |
| 39 | from linkgit:git-show-branch[1] when used with the `--merge-base` option. |
| 40 | |
Junio C Hamano | 2db3e75 | 2010-09-03 21:33:06 | [diff] [blame] | 41 | --octopus:: |
| 42 | Compute the best common ancestors of all supplied commits, |
| 43 | in preparation for an n-way merge. This mimics the behavior |
| 44 | of 'git show-branch --merge-base'. |
| 45 | |
| 46 | --independent:: |
| 47 | Instead of printing merge bases, print a minimal subset of |
| 48 | the supplied commits with the same ancestors. In other words, |
| 49 | among the commits given, list those which cannot be reached |
| 50 | from any other. This mimics the behavior of 'git show-branch |
| 51 | --independent'. |
| 52 | |
Junio C Hamano | b77f819 | 2011-05-05 01:30:38 | [diff] [blame] | 53 | OPTIONS |
| 54 | ------- |
| 55 | -a:: |
| 56 | --all:: |
| 57 | Output all merge bases for the commits, instead of just one. |
| 58 | |
Junio C Hamano | 3f2f6e5 | 2008-08-21 10:34:22 | [diff] [blame] | 59 | DISCUSSION |
| 60 | ---------- |
| 61 | |
| 62 | Given two commits 'A' and 'B', `git merge-base A B` will output a commit |
| 63 | which is reachable from both 'A' and 'B' through the parent relationship. |
| 64 | |
| 65 | For example, with this topology: |
| 66 | |
| 67 | o---o---o---B |
| 68 | / |
| 69 | ---o---1---o---o---o---A |
| 70 | |
| 71 | the merge base between 'A' and 'B' is '1'. |
| 72 | |
| 73 | Given three commits 'A', 'B' and 'C', `git merge-base A B C` will compute the |
Junio C Hamano | ec87f52 | 2008-12-10 08:35:25 | [diff] [blame] | 74 | merge base between 'A' and a hypothetical commit 'M', which is a merge |
Junio C Hamano | 3f2f6e5 | 2008-08-21 10:34:22 | [diff] [blame] | 75 | between 'B' and 'C'. For example, with this topology: |
| 76 | |
| 77 | o---o---o---o---C |
| 78 | / |
| 79 | / o---o---o---B |
| 80 | / / |
| 81 | ---2---1---o---o---o---A |
| 82 | |
| 83 | the result of `git merge-base A B C` is '1'. This is because the |
| 84 | equivalent topology with a merge commit 'M' between 'B' and 'C' is: |
| 85 | |
| 86 | |
| 87 | o---o---o---o---o |
| 88 | / \ |
| 89 | / o---o---o---o---M |
| 90 | / / |
| 91 | ---2---1---o---o---o---A |
| 92 | |
| 93 | and the result of `git merge-base A M` is '1'. Commit '2' is also a |
| 94 | common ancestor between 'A' and 'M', but '1' is a better common ancestor, |
| 95 | because '2' is an ancestor of '1'. Hence, '2' is not a merge base. |
| 96 | |
Junio C Hamano | b77f819 | 2011-05-05 01:30:38 | [diff] [blame] | 97 | The result of `git merge-base --octopus A B C` is '2', because '2' is |
| 98 | the best common ancestor of all commits. |
| 99 | |
Junio C Hamano | 3f2f6e5 | 2008-08-21 10:34:22 | [diff] [blame] | 100 | When the history involves criss-cross merges, there can be more than one |
Junio C Hamano | ec87f52 | 2008-12-10 08:35:25 | [diff] [blame] | 101 | 'best' common ancestor for two commits. For example, with this topology: |
Junio C Hamano | 3f2f6e5 | 2008-08-21 10:34:22 | [diff] [blame] | 102 | |
| 103 | ---1---o---A |
| 104 | \ / |
| 105 | X |
| 106 | / \ |
| 107 | ---2---o---o---B |
| 108 | |
Junio C Hamano | ec87f52 | 2008-12-10 08:35:25 | [diff] [blame] | 109 | both '1' and '2' are merge-bases of A and B. Neither one is better than |
| 110 | the other (both are 'best' merge bases). When the `--all` option is not given, |
Junio C Hamano | 3f2f6e5 | 2008-08-21 10:34:22 | [diff] [blame] | 111 | it is unspecified which best one is output. |
Junio C Hamano | 1a4e841 | 2005-12-27 08:17:23 | [diff] [blame] | 112 | |
Junio C Hamano | 2db3e75 | 2010-09-03 21:33:06 | [diff] [blame] | 113 | See also |
| 114 | -------- |
| 115 | linkgit:git-rev-list[1], |
| 116 | linkgit:git-show-branch[1], |
| 117 | linkgit:git-merge[1] |
| 118 | |
Junio C Hamano | 1a4e841 | 2005-12-27 08:17:23 | [diff] [blame] | 119 | GIT |
| 120 | --- |
Junio C Hamano | f7c042d | 2008-06-06 22:50:53 | [diff] [blame] | 121 | Part of the linkgit:git[1] suite |