| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 1 | git-rerere(1) | 
 | 2 | ============= | 
 | 3 |  | 
 | 4 | NAME | 
 | 5 | ---- | 
| Junio C Hamano | 7c73c66 | 2007-01-19 00:37:50 | [diff] [blame] | 6 | git-rerere - Reuse recorded resolution of conflicted merges | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 7 |  | 
 | 8 | SYNOPSIS | 
 | 9 | -------- | 
| Junio C Hamano | 15567bc | 2011-07-23 00:51:59 | [diff] [blame] | 10 | [verse] | 
| Junio C Hamano | c55452a | 2012-03-14 23:05:11 | [diff] [blame] | 11 | 'git rerere' ['clear'|'forget' <pathspec>|'diff'|'remaining'|'status'|'gc'] | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 12 |  | 
 | 13 | DESCRIPTION | 
 | 14 | ----------- | 
 | 15 |  | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 16 | In a workflow employing relatively long lived topic branches, | 
 | 17 | the developer sometimes needs to resolve the same conflicts over | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 18 | and over again until the topic branches are done (either merged | 
 | 19 | to the "release" branch, or sent out and accepted upstream). | 
 | 20 |  | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 21 | This command assists the developer in this process by recording | 
 | 22 | conflicted automerge results and corresponding hand resolve results | 
 | 23 | on the initial manual merge, and applying previously recorded | 
 | 24 | hand resolutions to their corresponding automerge results. | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 25 |  | 
| Junio C Hamano | 0e47b23 | 2008-01-15 08:31:10 | [diff] [blame] | 26 | [NOTE] | 
| Junio C Hamano | 543f8d6 | 2009-07-29 08:35:21 | [diff] [blame] | 27 | You need to set the configuration variable rerere.enabled in order to | 
| Junio C Hamano | 0e47b23 | 2008-01-15 08:31:10 | [diff] [blame] | 28 | enable this command. | 
 | 29 |  | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 30 |  | 
 | 31 | COMMANDS | 
 | 32 | -------- | 
 | 33 |  | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 34 | Normally, 'git rerere' is run without arguments or user-intervention. | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 35 | However, it has several commands that allow it to interact with | 
 | 36 | its working state. | 
 | 37 |  | 
 | 38 | 'clear':: | 
 | 39 |  | 
| Junio C Hamano | c55452a | 2012-03-14 23:05:11 | [diff] [blame] | 40 | Reset the metadata used by rerere if a merge resolution is to be | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 41 | aborted. Calling 'git am [--skip|--abort]' or 'git rebase [--skip|--abort]' | 
| Junio C Hamano | fce7c7e | 2008-07-02 03:06:38 | [diff] [blame] | 42 | will automatically invoke this command. | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 43 |  | 
| Junio C Hamano | 3e3aa81 | 2010-07-05 23:25:23 | [diff] [blame] | 44 | 'forget' <pathspec>:: | 
 | 45 |  | 
| Junio C Hamano | c55452a | 2012-03-14 23:05:11 | [diff] [blame] | 46 | Reset the conflict resolutions which rerere has recorded for the current | 
| Junio C Hamano | d2c978f | 2011-03-20 19:42:22 | [diff] [blame] | 47 | conflict in <pathspec>. | 
| Junio C Hamano | 3e3aa81 | 2010-07-05 23:25:23 | [diff] [blame] | 48 |  | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 49 | 'diff':: | 
 | 50 |  | 
| Junio C Hamano | c55452a | 2012-03-14 23:05:11 | [diff] [blame] | 51 | Display diffs for the current state of the resolution. It is | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 52 | useful for tracking what has changed while the user is resolving | 
 | 53 | conflicts. Additional arguments are passed directly to the system | 
| Junio C Hamano | ba4b928 | 2008-07-06 05:20:31 | [diff] [blame] | 54 | 'diff' command installed in PATH. | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 55 |  | 
 | 56 | 'status':: | 
 | 57 |  | 
| Junio C Hamano | c55452a | 2012-03-14 23:05:11 | [diff] [blame] | 58 | Print paths with conflicts whose merge resolution rerere will record. | 
 | 59 |  | 
 | 60 | 'remaining':: | 
 | 61 |  | 
 | 62 | Print paths with conflicts that have not been autoresolved by rerere. | 
 | 63 | This includes paths whose resolutions cannot be tracked by rerere, | 
 | 64 | such as conflicting submodules. | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 65 |  | 
 | 66 | 'gc':: | 
 | 67 |  | 
| Junio C Hamano | c55452a | 2012-03-14 23:05:11 | [diff] [blame] | 68 | Prune records of conflicted merges that | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 69 | occurred a long time ago. By default, unresolved conflicts older | 
 | 70 | than 15 days and resolved conflicts older than 60 | 
 | 71 | days are pruned. These defaults are controlled via the | 
| Junio C Hamano | 7464064 | 2006-12-27 10:59:55 | [diff] [blame] | 72 | `gc.rerereunresolved` and `gc.rerereresolved` configuration | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 73 | variables respectively. | 
| Junio C Hamano | e7935c4 | 2006-12-13 21:32:17 | [diff] [blame] | 74 |  | 
 | 75 |  | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 76 | DISCUSSION | 
 | 77 | ---------- | 
 | 78 |  | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 79 | When your topic branch modifies an overlapping area that your | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 80 | master branch (or upstream) touched since your topic branch | 
 | 81 | forked from it, you may want to test it with the latest master, | 
 | 82 | even before your topic branch is ready to be pushed upstream: | 
 | 83 |  | 
 | 84 | ------------ | 
 | 85 |  o---*---o topic | 
 | 86 |  / | 
 | 87 |  o---o---o---*---o---o master | 
 | 88 | ------------ | 
 | 89 |  | 
 | 90 | For such a test, you need to merge master and topic somehow. | 
 | 91 | One way to do it is to pull master into the topic branch: | 
 | 92 |  | 
 | 93 | ------------ | 
 | 94 | $ git checkout topic | 
| Junio C Hamano | edd2b0a | 2007-01-15 06:12:45 | [diff] [blame] | 95 | $ git merge master | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 96 |  | 
 | 97 |  o---*---o---+ topic | 
 | 98 |  / / | 
 | 99 |  o---o---o---*---o---o master | 
 | 100 | ------------ | 
 | 101 |  | 
 | 102 | The commits marked with `*` touch the same area in the same | 
 | 103 | file; you need to resolve the conflicts when creating the commit | 
| Junio C Hamano | b76a686 | 2012-05-02 22:02:46 | [diff] [blame] | 104 | marked with `+`. Then you can test the result to make sure your | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 105 | work-in-progress still works with what is in the latest master. | 
 | 106 |  | 
 | 107 | After this test merge, there are two ways to continue your work | 
 | 108 | on the topic. The easiest is to build on top of the test merge | 
| Junio C Hamano | b76a686 | 2012-05-02 22:02:46 | [diff] [blame] | 109 | commit `+`, and when your work in the topic branch is finally | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 110 | ready, pull the topic branch into master, and/or ask the | 
 | 111 | upstream to pull from you. By that time, however, the master or | 
| Junio C Hamano | b76a686 | 2012-05-02 22:02:46 | [diff] [blame] | 112 | the upstream might have been advanced since the test merge `+`, | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 113 | in which case the final commit graph would look like this: | 
 | 114 |  | 
 | 115 | ------------ | 
 | 116 | $ git checkout topic | 
| Junio C Hamano | edd2b0a | 2007-01-15 06:12:45 | [diff] [blame] | 117 | $ git merge master | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 118 | $ ... work on both topic and master branches | 
 | 119 | $ git checkout master | 
| Junio C Hamano | edd2b0a | 2007-01-15 06:12:45 | [diff] [blame] | 120 | $ git merge topic | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 121 |  | 
 | 122 |  o---*---o---+---o---o topic | 
 | 123 |  / / \ | 
 | 124 |  o---o---o---*---o---o---o---o---+ master | 
 | 125 | ------------ | 
 | 126 |  | 
 | 127 | When your topic branch is long-lived, however, your topic branch | 
 | 128 | would end up having many such "Merge from master" commits on it, | 
 | 129 | which would unnecessarily clutter the development history. | 
 | 130 | Readers of the Linux kernel mailing list may remember that Linus | 
 | 131 | complained about such too frequent test merges when a subsystem | 
 | 132 | maintainer asked to pull from a branch full of "useless merges". | 
 | 133 |  | 
 | 134 | As an alternative, to keep the topic branch clean of test | 
 | 135 | merges, you could blow away the test merge, and keep building on | 
 | 136 | top of the tip before the test merge: | 
 | 137 |  | 
 | 138 | ------------ | 
 | 139 | $ git checkout topic | 
| Junio C Hamano | edd2b0a | 2007-01-15 06:12:45 | [diff] [blame] | 140 | $ git merge master | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 141 | $ git reset --hard HEAD^ ;# rewind the test merge | 
 | 142 | $ ... work on both topic and master branches | 
 | 143 | $ git checkout master | 
| Junio C Hamano | edd2b0a | 2007-01-15 06:12:45 | [diff] [blame] | 144 | $ git merge topic | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 145 |  | 
 | 146 |  o---*---o-------o---o topic | 
 | 147 |  / \ | 
 | 148 |  o---o---o---*---o---o---o---o---+ master | 
 | 149 | ------------ | 
 | 150 |  | 
 | 151 | This would leave only one merge commit when your topic branch is | 
 | 152 | finally ready and merged into the master branch. This merge | 
 | 153 | would require you to resolve the conflict, introduced by the | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 154 | commits marked with `*`. However, this conflict is often the | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 155 | same conflict you resolved when you created the test merge you | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 156 | blew away. 'git rerere' helps you resolve this final | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 157 | conflicted merge using the information from your earlier hand | 
 | 158 | resolve. | 
 | 159 |  | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 160 | Running the 'git rerere' command immediately after a conflicted | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 161 | automerge records the conflicted working tree files, with the | 
 | 162 | usual conflict markers `<<<<<<<`, `=======`, and `>>>>>>>` in | 
 | 163 | them. Later, after you are done resolving the conflicts, | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 164 | running 'git rerere' again will record the resolved state of these | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 165 | files. Suppose you did this when you created the test merge of | 
 | 166 | master into the topic branch. | 
 | 167 |  | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 168 | Next time, after seeing the same conflicted automerge, | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 169 | running 'git rerere' will perform a three-way merge between the | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 170 | earlier conflicted automerge, the earlier manual resolution, and | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 171 | the current conflicted automerge. | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 172 | If this three-way merge resolves cleanly, the result is written | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 173 | out to your working tree file, so you do not have to manually | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 174 | resolve it. Note that 'git rerere' leaves the index file alone, | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 175 | so you still need to do the final sanity checks with `git diff` | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 176 | (or `git diff -c`) and 'git add' when you are satisfied. | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 177 |  | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 178 | As a convenience measure, 'git merge' automatically invokes | 
 | 179 | 'git rerere' upon exiting with a failed automerge and 'git rerere' | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 180 | records the hand resolve when it is a new conflict, or reuses the earlier hand | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 181 | resolve when it is not. 'git commit' also invokes 'git rerere' | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 182 | when committing a merge result. What this means is that you do | 
 | 183 | not have to do anything special yourself (besides enabling | 
 | 184 | the rerere.enabled config variable). | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 185 |  | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 186 | In our example, when you do the test merge, the manual | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 187 | resolution is recorded, and it will be reused when you do the | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 188 | actual merge later with the updated master and topic branch, as long | 
 | 189 | as the recorded resolution is still applicable. | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 190 |  | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 191 | The information 'git rerere' records is also used when running | 
 | 192 | 'git rebase'. After blowing away the test merge and continuing | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 193 | development on the topic branch: | 
 | 194 |  | 
 | 195 | ------------ | 
 | 196 |  o---*---o-------o---o topic | 
 | 197 |  / | 
 | 198 |  o---o---o---*---o---o---o---o master | 
 | 199 |  | 
 | 200 | $ git rebase master topic | 
 | 201 |  | 
 | 202 |  o---*---o-------o---o topic | 
 | 203 |  / | 
 | 204 |  o---o---o---*---o---o---o---o master | 
 | 205 | ------------ | 
 | 206 |  | 
| Junio C Hamano | 25e7ba6 | 2009-06-14 01:03:22 | [diff] [blame] | 207 | you could run `git rebase master topic`, to bring yourself | 
 | 208 | up-to-date before your topic is ready to be sent upstream. | 
 | 209 | This would result in falling back to a three-way merge, and it | 
 | 210 | would conflict the same way as the test merge you resolved earlier. | 
| Junio C Hamano | 1aa40d2 | 2010-01-21 17:46:43 | [diff] [blame] | 211 | 'git rerere' will be run by 'git rebase' to help you resolve this | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 212 | conflict. | 
 | 213 |  | 
| Junio C Hamano | 40f2f8d | 2006-02-07 08:04:39 | [diff] [blame] | 214 | GIT | 
 | 215 | --- | 
| Junio C Hamano | f7c042d | 2008-06-06 22:50:53 | [diff] [blame] | 216 | Part of the linkgit:git[1] suite |