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