1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
Description
^^^^^^^^^^^
When specifying `--tool=vimdiff` in `git mergetool` Git will open Vim with a 4
windows layout distributed in the following way:
....
------------------------------------------
| | | |
| LOCAL | BASE | REMOTE |
| | | |
------------------------------------------
| |
| MERGED |
| |
------------------------------------------
....
`LOCAL`, `BASE` and `REMOTE` are read-only buffers showing the contents of the
conflicting file in specific commits ("commit you are merging into", "common
ancestor commit" and "commit you are merging from" respectively)
`MERGED` is a writable buffer where you have to resolve the conflicts (using the
other read-only buffers as a reference). Once you are done, save and exit Vim as
usual (`:wq`) or, if you want to abort, exit using `:cq`.
Layout configuration
^^^^^^^^^^^^^^^^^^^^
You can change the windows layout used by Vim by setting configuration variable
`mergetool.vimdiff.layout` which accepts a string where the following separators
have special meaning:
- `+` is used to "open a new tab"
- `,` is used to "open a new vertical split"
- `/` is used to "open a new horizontal split"
- `@` is used to indicate the file containing the final version after
solving the conflicts. If not present, `MERGED` will be used by default.
The precedence of the operators is as follows (you can use parentheses to change
it):
`@` > `+` > `/` > `,`
Let's see some examples to understand how it works:
* `layout = "(LOCAL,BASE,REMOTE)/MERGED"`
+
--
This is exactly the same as the default layout we have already seen.
Note that `/` has precedence over `,` and thus the parenthesis are not
needed in this case. The next layout definition is equivalent:
layout = "LOCAL,BASE,REMOTE / MERGED"
--
* `layout = "LOCAL,MERGED,REMOTE"`
+
--
If, for some reason, we are not interested in the `BASE` buffer.
....
------------------------------------------
| | | |
| | | |
| LOCAL | MERGED | REMOTE |
| | | |
| | | |
------------------------------------------
....
--
* `layout = "MERGED"`
+
--
Only the `MERGED` buffer will be shown. Note, however, that all the other
ones are still loaded in vim, and you can access them with the "buffers"
command.
....
------------------------------------------
| |
| |
| MERGED |
| |
| |
------------------------------------------
....
--
* `layout = "@LOCAL,REMOTE"`
+
--
When `MERGED` is not present in the layout, you must "mark" one of the
buffers with an arobase (`@`). That will become the buffer you need to edit and
save after resolving the conflicts.
....
------------------------------------------
| | |
| | |
| | |
| LOCAL | REMOTE |
| | |
| | |
| | |
------------------------------------------
....
--
* `layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE"`
+
--
Three tabs will open: the first one is a copy of the default layout, while
the other two only show the differences between (`BASE` and `LOCAL`) and
(`BASE` and `REMOTE`) respectively.
....
------------------------------------------
| <TAB #1> | TAB #2 | TAB #3 | |
------------------------------------------
| | | |
| LOCAL | BASE | REMOTE |
| | | |
------------------------------------------
| |
| MERGED |
| |
------------------------------------------
....
....
------------------------------------------
| TAB #1 | <TAB #2> | TAB #3 | |
------------------------------------------
| | |
| | |
| | |
| BASE | LOCAL |
| | |
| | |
| | |
------------------------------------------
....
....
------------------------------------------
| TAB #1 | TAB #2 | <TAB #3> | |
------------------------------------------
| | |
| | |
| | |
| BASE | REMOTE |
| | |
| | |
| | |
------------------------------------------
....
--
* `layout = "LOCAL,BASE,REMOTE / MERGED + BASE,LOCAL + BASE,REMOTE + (LOCAL/BASE/REMOTE),MERGED"`
+
--
Same as the previous example, but adds a fourth tab with the same
information as the first tab, with a different layout.
....
---------------------------------------------
| TAB #1 | TAB #2 | TAB #3 | <TAB #4> |
---------------------------------------------
| LOCAL | |
|---------------------| |
| BASE | MERGED |
|---------------------| |
| REMOTE | |
---------------------------------------------
....
Note how in the third tab definition we need to use parentheses to make `,`
have precedence over `/`.
--
Variants
^^^^^^^^
Instead of `--tool=vimdiff`, you can also use one of these other variants:
* `--tool=gvimdiff`, to open gVim instead of Vim.
* `--tool=nvimdiff`, to open Neovim instead of Vim.
When using these variants, in order to specify a custom layout you will have to
set configuration variables `mergetool.gvimdiff.layout` and
`mergetool.nvimdiff.layout` instead of `mergetool.vimdiff.layout` (though the
latter will be used as fallback if the variant-specific one is not set).
In addition, for backwards compatibility with previous Git versions, you can
also append `1`, `2` or `3` to either `vimdiff` or any of the variants (ex:
`vimdiff3`, `nvimdiff1`, etc...) to use a predefined layout.
In other words, using `--tool=[g|n]vimdiff<x>` is the same as using
`--tool=[g|n]vimdiff` and setting configuration variable
`mergetool.[g|n]vimdiff.layout` to...
* `<x>=1`: `"@LOCAL, REMOTE"`
* `<x>=2`: `"LOCAL, MERGED, REMOTE"`
* `<x>=3`: `"MERGED"`
Example: using `--tool=gvimdiff2` will open `gvim` with three columns (`LOCAL`,
`MERGED` and `REMOTE`).
|