blob: c0abe8254edb3bad671a6d9890c74c0606e7a7ff [file] [log] [blame]
Junio C Hamano2db3e752010-09-03 21:33:061<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
2 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
4<head>
5<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
6<meta name="generator" content="AsciiDoc 8.2.5" />
7<style type="text/css">
8/* Debug borders */
9p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
10/*
11 border: 1px solid red;
12*/
13}
14
15body {
16 margin: 1em 5% 1em 5%;
17}
18
19a {
20 color: blue;
21 text-decoration: underline;
22}
23a:visited {
24 color: fuchsia;
25}
26
27em {
28 font-style: italic;
29}
30
31strong {
32 font-weight: bold;
33}
34
35tt {
36 color: navy;
37}
38
39h1, h2, h3, h4, h5, h6 {
40 color: #527bbd;
41 font-family: sans-serif;
42 margin-top: 1.2em;
43 margin-bottom: 0.5em;
44 line-height: 1.3;
45}
46
47h1, h2, h3 {
48 border-bottom: 2px solid silver;
49}
50h2 {
51 padding-top: 0.5em;
52}
53h3 {
54 float: left;
55}
56h3 + * {
57 clear: left;
58}
59
60div.sectionbody {
61 font-family: serif;
62 margin-left: 0;
63}
64
65hr {
66 border: 1px solid silver;
67}
68
69p {
70 margin-top: 0.5em;
71 margin-bottom: 0.5em;
72}
73
74pre {
75 padding: 0;
76 margin: 0;
77}
78
79span#author {
80 color: #527bbd;
81 font-family: sans-serif;
82 font-weight: bold;
83 font-size: 1.1em;
84}
85span#email {
86}
87span#revision {
88 font-family: sans-serif;
89}
90
91div#footer {
92 font-family: sans-serif;
93 font-size: small;
94 border-top: 2px solid silver;
95 padding-top: 0.5em;
96 margin-top: 4.0em;
97}
98div#footer-text {
99 float: left;
100 padding-bottom: 0.5em;
101}
102div#footer-badges {
103 float: right;
104 padding-bottom: 0.5em;
105}
106
107div#preamble,
108div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
109div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
110div.admonitionblock {
111 margin-right: 10%;
112 margin-top: 1.5em;
113 margin-bottom: 1.5em;
114}
115div.admonitionblock {
116 margin-top: 2.5em;
117 margin-bottom: 2.5em;
118}
119
120div.content { /* Block element content. */
121 padding: 0;
122}
123
124/* Block element titles. */
125div.title, caption.title {
126 font-family: sans-serif;
127 font-weight: bold;
128 text-align: left;
129 margin-top: 1.0em;
130 margin-bottom: 0.5em;
131}
132div.title + * {
133 margin-top: 0;
134}
135
136td div.title:first-child {
137 margin-top: 0.0em;
138}
139div.content div.title:first-child {
140 margin-top: 0.0em;
141}
142div.content + div.title {
143 margin-top: 0.0em;
144}
145
146div.sidebarblock > div.content {
147 background: #ffffee;
148 border: 1px solid silver;
149 padding: 0.5em;
150}
151
152div.listingblock {
153 margin-right: 0%;
154}
155div.listingblock > div.content {
156 border: 1px solid silver;
157 background: #f4f4f4;
158 padding: 0.5em;
159}
160
161div.quoteblock > div.content {
162 padding-left: 2.0em;
163}
164
165div.attribution {
166 text-align: right;
167}
168div.verseblock + div.attribution {
169 text-align: left;
170}
171
172div.admonitionblock .icon {
173 vertical-align: top;
174 font-size: 1.1em;
175 font-weight: bold;
176 text-decoration: underline;
177 color: #527bbd;
178 padding-right: 0.5em;
179}
180div.admonitionblock td.content {
181 padding-left: 0.5em;
182 border-left: 2px solid silver;
183}
184
185div.exampleblock > div.content {
186 border-left: 2px solid silver;
187 padding: 0.5em;
188}
189
190div.verseblock div.content {
191 white-space: pre;
192}
193
194div.imageblock div.content { padding-left: 0; }
195div.imageblock img { border: 1px solid silver; }
196span.image img { border-style: none; }
197
198dl {
199 margin-top: 0.8em;
200 margin-bottom: 0.8em;
201}
202dt {
203 margin-top: 0.5em;
204 margin-bottom: 0;
205 font-style: italic;
206}
207dd > *:first-child {
208 margin-top: 0;
209}
210
211ul, ol {
212 list-style-position: outside;
213}
214div.olist2 ol {
215 list-style-type: lower-alpha;
216}
217
218div.tableblock > table {
219 border: 3px solid #527bbd;
220}
221thead {
222 font-family: sans-serif;
223 font-weight: bold;
224}
225tfoot {
226 font-weight: bold;
227}
228
229div.hlist {
230 margin-top: 0.8em;
231 margin-bottom: 0.8em;
232}
233div.hlist td {
234 padding-bottom: 5px;
235}
236td.hlist1 {
237 vertical-align: top;
238 font-style: italic;
239 padding-right: 0.8em;
240}
241td.hlist2 {
242 vertical-align: top;
243}
244
245@media print {
246 div#footer-badges { display: none; }
247}
248
249div#toctitle {
250 color: #527bbd;
251 font-family: sans-serif;
252 font-size: 1.1em;
253 font-weight: bold;
254 margin-top: 1.0em;
255 margin-bottom: 0.1em;
256}
257
258div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
259 margin-top: 0;
260 margin-bottom: 0;
261}
262div.toclevel2 {
263 margin-left: 2em;
264 font-size: 0.9em;
265}
266div.toclevel3 {
267 margin-left: 4em;
268 font-size: 0.9em;
269}
270div.toclevel4 {
271 margin-left: 6em;
272 font-size: 0.9em;
273}
274/* Workarounds for IE6's broken and incomplete CSS2. */
275
276div.sidebar-content {
277 background: #ffffee;
278 border: 1px solid silver;
279 padding: 0.5em;
280}
281div.sidebar-title, div.image-title {
282 font-family: sans-serif;
283 font-weight: bold;
284 margin-top: 0.0em;
285 margin-bottom: 0.5em;
286}
287
288div.listingblock div.content {
289 border: 1px solid silver;
290 background: #f4f4f4;
291 padding: 0.5em;
292}
293
294div.quoteblock-content {
295 padding-left: 2.0em;
296}
297
298div.exampleblock-content {
299 border-left: 2px solid silver;
300 padding-left: 0.5em;
301}
302
303/* IE6 sets dynamically generated links as visited. */
304div#toc a:visited { color: blue; }
305</style>
306<title>merge API</title>
307</head>
308<body>
309<div id="header">
310<h1>merge API</h1>
311</div>
312<div id="preamble">
313<div class="sectionbody">
314<div class="para"><p>The merge API helps a program to reconcile two competing sets of
315improvements to some files (e.g., unregistered changes from the work
316tree versus changes involved in switching to a new branch), reporting
317conflicts if found. The library called through this API is
318responsible for a few things.</p></div>
319<div class="ilist"><ul>
320<li>
321<p>
322determining which trees to merge (recursive ancestor consolidation);
323</p>
324</li>
325<li>
326<p>
327lining up corresponding files in the trees to be merged (rename
328 detection, subtree shifting), reporting edge cases like add/add
329 and rename/rename conflicts to the user;
330</p>
331</li>
332<li>
333<p>
334performing a three-way merge of corresponding files, taking
335 path-specific merge drivers (specified in <tt>.gitattributes</tt>)
336 into account.
337</p>
338</li>
339</ul></div>
340</div>
341</div>
342<h2 id="_low_level_single_file_merge">Low-level (single file) merge</h2>
343<div class="sectionbody">
344<div class="vlist"><dl>
345<dt>
346<tt>ll_merge</tt>
347</dt>
348<dd>
349<p>
350 Perform a three-way single-file merge in core. This is
351 a thin wrapper around <tt>xdl_merge</tt> that takes the path and
352 any merge backend specified in <tt>.gitattributes</tt> or
353 <tt>.git/info/attributes</tt> into account. Returns 0 for a
354 clean merge.
355</p>
356</dd>
357</dl></div>
358<div class="para"><p>The caller:</p></div>
359<div class="olist"><ol>
360<li>
361<p>
362allocates an mmbuffer_t variable for the result;
363</p>
364</li>
365<li>
366<p>
367allocates and fills variables with the file's original content
368 and two modified versions (using <tt>read_mmfile</tt>, for example);
369</p>
370</li>
371<li>
372<p>
373calls ll_merge();
374</p>
375</li>
376<li>
377<p>
378reads the output from result_buf.ptr and result_buf.size;
379</p>
380</li>
381<li>
382<p>
383releases buffers when finished (free(ancestor.ptr); free(ours.ptr);
384 free(theirs.ptr); free(result_buf.ptr);).
385</p>
386</li>
387</ol></div>
388<div class="para"><p>If the modifications do not merge cleanly, <tt>ll_merge</tt> will return a
389nonzero value and <tt>result_buf</tt> will generally include a description of
390the conflict bracketed by markers such as the traditional <tt>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</tt>
391and <tt>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</tt>.</p></div>
392<div class="para"><p>The <tt>ancestor_label</tt>, <tt>our_label</tt>, and <tt>their_label</tt> parameters are
393used to label the different sides of a conflict if the merge driver
394supports this.</p></div>
395<div class="para"><p>The <tt>flag</tt> parameter is a bitfield:</p></div>
396<div class="ilist"><ul>
397<li>
398<p>
399The <tt>LL_OPT_VIRTUAL_ANCESTOR</tt> bit indicates whether this is an
400 internal merge to consolidate ancestors for a recursive merge.
401</p>
402</li>
403<li>
404<p>
405The <tt>LL_OPT_FAVOR_MASK</tt> bits allow local conflicts to be automatically
406 resolved in favor of one side or the other (as in <em>git merge-file</em>
407 <tt>&#8212;ours</tt>/<tt>&#8212;theirs</tt>/<tt>&#8212;union</tt>).
408 They can be populated by <tt>create_ll_flag</tt>, whose argument can be
409 <tt>XDL_MERGE_FAVOR_OURS</tt>, <tt>XDL_MERGE_FAVOR_THEIRS</tt>, or
410 <tt>XDL_MERGE_FAVOR_UNION</tt>.
411</p>
412</li>
413</ul></div>
414</div>
415<h2 id="_everything_else">Everything else</h2>
416<div class="sectionbody">
417<div class="para"><p>Talk about &lt;merge-recursive.h&gt; and merge_file():</p></div>
418<div class="ilist"><ul>
419<li>
420<p>
421merge_trees() to merge with rename detection
422</p>
423</li>
424<li>
425<p>
426merge_recursive() for ancestor consolidation
427</p>
428</li>
429<li>
430<p>
431try_merge_command() for other strategies
432</p>
433</li>
434<li>
435<p>
436conflict format
437</p>
438</li>
439<li>
440<p>
441merge options
442</p>
443</li>
444</ul></div>
445<div class="para"><p>(Daniel, Miklos, Stephan, JC)</p></div>
446</div>
447<div id="footer">
448<div id="footer-text">
449Last updated 2010-09-03 21:30:46 UTC
450</div>
451</div>
452</body>
453</html>