1 <!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">
5 <meta http-equiv=
"Content-Type" content=
"text/html; charset=UTF-8" />
6 <meta name=
"generator" content=
"AsciiDoc 8.5.2" />
7 <title>merge API
</title>
8 <style type=
"text/css">
10 p
, li
, dt
, dd
, div
, pre
, h1
, h2
, h3
, h4
, h5
, h6
{
12 border: 1px solid red;
17 margin: 1em 5% 1em 5%;
22 text-decoration: underline
;
42 h1
, h2
, h3
, h4
, h5
, h6
{
44 font-family: sans-serif
;
51 border-bottom: 2px solid silver
;
69 border: 1px solid silver
;
88 font-family: sans-serif
;
94 span#revnumber
, span#revdate
, span#revremark
{
95 font-family: sans-serif
;
99 font-family: sans-serif
;
101 border-top: 2px solid silver
;
107 padding-bottom: 0.5em;
111 padding-bottom: 0.5em;
116 margin-bottom: 1.5em;
118 div
.tableblock
, div
.imageblock
, div
.exampleblock
, div
.verseblock
,
119 div
.quoteblock
, div
.literalblock
, div
.listingblock
, div
.sidebarblock
,
120 div
.admonitionblock
{
122 margin-bottom: 1.5em;
124 div
.admonitionblock
{
126 margin-bottom: 2.0em;
131 div
.content
{ /* Block element content. */
135 /* Block element titles. */
136 div
.title
, caption
.title
{
138 font-family: sans-serif
;
142 margin-bottom: 0.5em;
148 td div
.title:first-child
{
151 div
.content div
.title:first-child
{
154 div
.content
+ div
.title
{
158 div
.sidebarblock
> div
.content
{
160 border: 1px solid silver
;
164 div
.listingblock
> div
.content
{
165 border: 1px solid silver
;
170 div
.quoteblock
, div
.verseblock
{
174 border-left: 5px solid
#dddddd;
178 div
.quoteblock
> div
.attribution
{
183 div
.verseblock
> div
.content
{
186 div
.verseblock
> div
.attribution
{
190 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
191 div
.verseblock
+ div
.attribution
{
195 div
.admonitionblock
.icon
{
199 text-decoration: underline
;
201 padding-right: 0.5em;
203 div
.admonitionblock td
.content
{
205 border-left: 3px solid
#dddddd;
208 div
.exampleblock
> div
.content
{
209 border-left: 3px solid
#dddddd;
213 div
.imageblock div
.content
{ padding-left: 0; }
214 span
.image img
{ border-style: none
; }
215 a
.image:visited
{ color: white
; }
219 margin-bottom: 0.8em;
232 list-style-position: outside
;
235 list-style-type: decimal
;
238 list-style-type: lower-alpha
;
241 list-style-type: upper-alpha
;
244 list-style-type: lower-roman
;
247 list-style-type: upper-roman
;
250 div
.compact ul
, div
.compact ol
,
251 div
.compact p
, div
.compact p
,
252 div
.compact div
, div
.compact div
{
254 margin-bottom: 0.1em;
257 div
.tableblock
> table
{
258 border: 3px solid
#527bbd;
260 thead
, p
.table
.header
{
261 font-family: sans-serif
;
273 /* Because the table frame attribute is overriden by CSS in most browsers. */
274 div
.tableblock
> table
[frame
="void"] {
277 div
.tableblock
> table
[frame
="hsides"] {
278 border-left-style: none
;
279 border-right-style: none
;
281 div
.tableblock
> table
[frame
="vsides"] {
282 border-top-style: none
;
283 border-bottom-style: none
;
289 margin-bottom: 0.8em;
292 padding-bottom: 15px;
294 dt
.hdlist1
.strong
, td
.hdlist1
.strong
{
300 padding-right: 0.8em;
306 div
.hdlist
.compact tr
{
315 .footnote, .footnoteref {
319 span
.footnote
, span
.footnoteref
{
320 vertical-align: super
;
324 margin: 20px 0 20px 0;
328 #footnotes div
.footnote
{
334 border-top: 1px solid silver
;
344 div#footer-badges
{ display: none
; }
348 margin-bottom: 2.5em;
353 font-family: sans-serif
;
357 margin-bottom: 0.1em;
360 div
.toclevel1
, div
.toclevel2
, div
.toclevel3
, div
.toclevel4
{
376 /* Workarounds for IE6's broken and incomplete CSS2. */
378 div
.sidebar-content
{
380 border: 1px solid silver
;
383 div
.sidebar-title
, div
.image-title
{
385 font-family: sans-serif
;
388 margin-bottom: 0.5em;
391 div
.listingblock div
.content
{
392 border: 1px solid silver
;
397 div
.quoteblock-attribution
{
402 div
.verseblock-content
{
405 div
.verseblock-attribution
{
410 div
.exampleblock-content
{
411 border-left: 3px solid
#dddddd;
415 /* IE6 sets dynamically generated links as visited. */
416 div#toc
a:visited
{ color: blue
; }
418 <script type=
"text/javascript">
420 window
.onload = function(){asciidoc
.footnotes();}
421 var asciidoc
= { // Namespace.
423 /////////////////////////////////////////////////////////////////////
424 // Table Of Contents generator
425 /////////////////////////////////////////////////////////////////////
427 /* Author: Mihai Bazon, September 2002
428 * http://students.infoiasi.ro/~mishoo
430 * Table Of Content generator
433 * Feel free to use this script under the terms of the GNU General Public
434 * License, as long as you do not remove or alter this notice.
437 /* modified by Troy D. Hanson, September 2006. License: GPL */
438 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
441 toc: function (toclevels
) {
443 function getText(el
) {
445 for (var i
= el
.firstChild
; i
!= null; i
= i
.nextSibling
) {
446 if (i
.nodeType
== 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
448 else if (i
.firstChild
!= null)
454 function TocEntry(el
, text
, toclevel
) {
457 this.toclevel
= toclevel
;
460 function tocEntries(el
, toclevels
) {
461 var result
= new Array
;
462 var re
= new RegExp('[hH]([2-'+(toclevels
+1)+'])');
463 // Function that scans the DOM tree for header elements (the DOM2
464 // nodeIterator API would be a better technique but not supported by all
466 var iterate = function (el
) {
467 for (var i
= el
.firstChild
; i
!= null; i
= i
.nextSibling
) {
468 if (i
.nodeType
== 1 /* Node.ELEMENT_NODE */) {
469 var mo
= re
.exec(i
.tagName
);
470 if (mo
&& (i
.getAttribute("class") || i
.getAttribute("className")) != "float") {
471 result
[result
.length
] = new TocEntry(i
, getText(i
), mo
[1]-1);
481 var toc
= document
.getElementById("toc");
482 var entries
= tocEntries(document
.getElementById("content"), toclevels
);
483 for (var i
= 0; i
< entries
.length
; ++i
) {
484 var entry
= entries
[i
];
485 if (entry
.element
.id
== "")
486 entry
.element
.id
= "_toc_" + i
;
487 var a
= document
.createElement("a");
488 a
.href
= "#" + entry
.element
.id
;
489 a
.appendChild(document
.createTextNode(entry
.text
));
490 var div
= document
.createElement("div");
492 div
.className
= "toclevel" + entry
.toclevel
;
493 toc
.appendChild(div
);
495 if (entries
.length
== 0)
496 toc
.parentNode
.removeChild(toc
);
500 /////////////////////////////////////////////////////////////////////
501 // Footnotes generator
502 /////////////////////////////////////////////////////////////////////
504 /* Based on footnote generation code from:
505 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
508 footnotes: function () {
509 var cont
= document
.getElementById("content");
510 var noteholder
= document
.getElementById("footnotes");
511 var spans
= cont
.getElementsByTagName("span");
514 for (i
=0; i
<spans
.length
; i
++) {
515 if (spans
[i
].className
== "footnote") {
517 // Use [\s\S] in place of . so multi-line matches work.
518 // Because JavaScript has no s (dotall) regex flag.
519 note
= spans
[i
].innerHTML
.match(/\s*\[([\s\S]*)]\s*/)[1];
520 noteholder
.innerHTML
+=
521 "<div class='footnote' id='_footnote_" + n
+ "'>" +
522 "<a href='#_footnoteref_" + n
+ "' title='Return to text'>" +
523 n
+ "</a>. " + note
+ "</div>";
525 "[<a id='_footnoteref_" + n
+ "' href='#_footnote_" + n
+
526 "' title='View footnote' class='footnote'>" + n
+ "</a>]";
527 var id
=spans
[i
].getAttribute("id");
528 if (id
!= null) refs
["#"+id
] = n
;
532 noteholder
.parentNode
.removeChild(noteholder
);
534 // Process footnoterefs.
535 for (i
=0; i
<spans
.length
; i
++) {
536 if (spans
[i
].className
== "footnoteref") {
537 var href
= spans
[i
].getElementsByTagName("a")[0].getAttribute("href");
538 href
= href
.match(/#.*/)[0]; // Because IE return full URL.
541 "[<a href='#_footnote_" + n
+
542 "' title='View footnote' class='footnote'>" + n
+ "</a>]";
558 <div class=
"sectionbody">
559 <div class=
"paragraph"><p>The merge API helps a program to reconcile two competing sets of
560 improvements to some files (e.g., unregistered changes from the work
561 tree versus changes involved in switching to a new branch), reporting
562 conflicts if found. The library called through this API is
563 responsible for a few things.
</p></div>
564 <div class=
"ulist"><ul>
567 determining which trees to merge (recursive ancestor consolidation);
572 lining up corresponding files in the trees to be merged (rename
573 detection, subtree shifting), reporting edge cases like add/add
574 and rename/rename conflicts to the user;
579 performing a three-way merge of corresponding files, taking
580 path-specific merge drivers (specified in
<tt>.gitattributes
</tt>)
587 <h2 id=
"_data_structures">Data structures
</h2>
588 <div class=
"sectionbody">
589 <div class=
"ulist"><ul>
592 <tt>mmbuffer_t
</tt>,
<tt>mmfile_t
</tt>
596 <div class=
"paragraph"><p>These store data usable for use by the xdiff backend, for writing and
597 for reading, respectively. See
<tt>xdiff/xdiff.h
</tt> for the definitions
598 and
<tt>diff.c
</tt> for examples.
</p></div>
599 <div class=
"ulist"><ul>
602 <tt>struct ll_merge_options
</tt>
606 <div class=
"paragraph"><p>This describes the set of options the calling program wants to affect
607 the operation of a low-level (single file) merge. Some options:
</p></div>
608 <div class=
"dlist"><dl>
610 <tt>virtual_ancestor
</tt>
614 Behave as though this were part of a merge between common
615 ancestors in a recursive merge.
616 If a helper program is specified by the
617 <tt>[merge
"<driver>"] recursive
</tt> configuration, it will
618 be used (see
<a href=
"gitattributes.html">gitattributes(
5)
</a>).
626 Resolve local conflicts automatically in favor
627 of one side or the other (as in
<em>git merge-file
</em>
628 <tt>--ours
</tt>/
<tt>--theirs
</tt>/
<tt>--union
</tt>). Can be
<tt>0</tt>,
629 <tt>XDL_MERGE_FAVOR_OURS
</tt>,
<tt>XDL_MERGE_FAVOR_THEIRS
</tt>, or
630 <tt>XDL_MERGE_FAVOR_UNION
</tt>.
638 Resmudge and clean the
"base",
"theirs" and
"ours" files
639 before merging. Use this when the merge is likely to have
640 overlapped with a change in smudge/clean or end-of-line
646 <h2 id=
"_low_level_single_file_merge">Low-level (single file) merge
</h2>
647 <div class=
"sectionbody">
648 <div class=
"dlist"><dl>
654 Perform a three-way single-file merge in core. This is
655 a thin wrapper around
<tt>xdl_merge
</tt> that takes the path and
656 any merge backend specified in
<tt>.gitattributes
</tt> or
657 <tt>.git/info/attributes
</tt> into account. Returns
0 for a
662 <div class=
"paragraph"><p>Calling sequence:
</p></div>
663 <div class=
"ulist"><ul>
666 Prepare a
<tt>struct ll_merge_options
</tt> to record options.
667 If you have no special requests, skip this and pass
<tt>NULL
</tt>
668 as the
<tt>opts
</tt> parameter to use the default options.
673 Allocate an mmbuffer_t variable for the result.
678 Allocate and fill variables with the file
’s original content
679 and two modified versions (using
<tt>read_mmfile
</tt>, for example).
684 Call
<tt>ll_merge()
</tt>.
689 Read the merged content from
<tt>result_buf.ptr
</tt> and
<tt>result_buf.size
</tt>.
694 Release buffers when finished. A simple
695 <tt>free(ancestor.ptr); free(ours.ptr); free(theirs.ptr);
696 free(result_buf.ptr);
</tt> will do.
700 <div class=
"paragraph"><p>If the modifications do not merge cleanly,
<tt>ll_merge
</tt> will return a
701 nonzero value and
<tt>result_buf
</tt> will generally include a description of
702 the conflict bracketed by markers such as the traditional
<tt><<<<<<<</tt>
703 and
<tt>>>>>>>></tt>.
</p></div>
704 <div class=
"paragraph"><p>The
<tt>ancestor_label
</tt>,
<tt>our_label
</tt>, and
<tt>their_label
</tt> parameters are
705 used to label the different sides of a conflict if the merge driver
706 supports this.
</p></div>
708 <h2 id=
"_everything_else">Everything else
</h2>
709 <div class=
"sectionbody">
710 <div class=
"paragraph"><p>Talk about
<merge-recursive.h
> and merge_file():
</p></div>
711 <div class=
"ulist"><ul>
714 merge_trees() to merge with rename detection
719 merge_recursive() for ancestor consolidation
724 try_merge_command() for other strategies
738 <div class=
"paragraph"><p>(Daniel, Miklos, Stephan, JC)
</p></div>
741 <div id=
"footnotes"><hr /></div>
743 <div id=
"footer-text">
744 Last updated
2011-
09-
21 23:
01:
14 PDT