| merge API | 
 | ========= | 
 |  | 
 | The merge API helps a program to reconcile two competing sets of | 
 | improvements to some files (e.g., unregistered changes from the work | 
 | tree versus changes involved in switching to a new branch), reporting | 
 | conflicts if found.  The library called through this API is | 
 | responsible for a few things. | 
 |  | 
 |  * determining which trees to merge (recursive ancestor consolidation); | 
 |  | 
 |  * lining up corresponding files in the trees to be merged (rename | 
 |    detection, subtree shifting), reporting edge cases like add/add | 
 |    and rename/rename conflicts to the user; | 
 |  | 
 |  * performing a three-way merge of corresponding files, taking | 
 |    path-specific merge drivers (specified in `.gitattributes`) | 
 |    into account. | 
 |  | 
 | Data structures | 
 | --------------- | 
 |  | 
 | * `mmbuffer_t`, `mmfile_t` | 
 |  | 
 | These store data usable for use by the xdiff backend, for writing and | 
 | for reading, respectively.  See `xdiff/xdiff.h` for the definitions | 
 | and `diff.c` for examples. | 
 |  | 
 | * `struct ll_merge_options` | 
 |  | 
 | This describes the set of options the calling program wants to affect | 
 | the operation of a low-level (single file) merge.  Some options: | 
 |  | 
 | `virtual_ancestor`:: | 
 | 	Behave as though this were part of a merge between common | 
 | 	ancestors in a recursive merge. | 
 | 	If a helper program is specified by the | 
 | 	`[merge "<driver>"] recursive` configuration, it will | 
 | 	be used (see linkgit:gitattributes[5]). | 
 |  | 
 | `variant`:: | 
 | 	Resolve local conflicts automatically in favor | 
 | 	of one side or the other (as in 'git merge-file' | 
 | 	`--ours`/`--theirs`/`--union`).  Can be `0`, | 
 | 	`XDL_MERGE_FAVOR_OURS`, `XDL_MERGE_FAVOR_THEIRS`, or | 
 | 	`XDL_MERGE_FAVOR_UNION`. | 
 |  | 
 | `renormalize`:: | 
 | 	Resmudge and clean the "base", "theirs" and "ours" files | 
 | 	before merging.  Use this when the merge is likely to have | 
 | 	overlapped with a change in smudge/clean or end-of-line | 
 | 	normalization rules. | 
 |  | 
 | Low-level (single file) merge | 
 | ----------------------------- | 
 |  | 
 | `ll_merge`:: | 
 |  | 
 | 	Perform a three-way single-file merge in core.  This is | 
 | 	a thin wrapper around `xdl_merge` that takes the path and | 
 | 	any merge backend specified in `.gitattributes` or | 
 | 	`.git/info/attributes` into account.  Returns 0 for a | 
 | 	clean merge. | 
 |  | 
 | Calling sequence: | 
 |  | 
 | * Prepare a `struct ll_merge_options` to record options. | 
 |   If you have no special requests, skip this and pass `NULL` | 
 |   as the `opts` parameter to use the default options. | 
 |  | 
 | * Allocate an mmbuffer_t variable for the result. | 
 |  | 
 | * Allocate and fill variables with the file's original content | 
 |   and two modified versions (using `read_mmfile`, for example). | 
 |  | 
 | * Call `ll_merge()`. | 
 |  | 
 | * Read the merged content from `result_buf.ptr` and `result_buf.size`. | 
 |  | 
 | * Release buffers when finished.  A simple | 
 |   `free(ancestor.ptr); free(ours.ptr); free(theirs.ptr); | 
 |   free(result_buf.ptr);` will do. | 
 |  | 
 | If the modifications do not merge cleanly, `ll_merge` will return a | 
 | nonzero value and `result_buf` will generally include a description of | 
 | the conflict bracketed by markers such as the traditional `<<<<<<<` | 
 | and `>>>>>>>`. | 
 |  | 
 | The `ancestor_label`, `our_label`, and `their_label` parameters are | 
 | used to label the different sides of a conflict if the merge driver | 
 | supports this. | 
 |  | 
 | Everything else | 
 | --------------- | 
 |  | 
 | Talk about <merge-recursive.h> and merge_file(): | 
 |  | 
 |  - merge_trees() to merge with rename detection | 
 |  - merge_recursive() for ancestor consolidation | 
 |  - try_merge_command() for other strategies | 
 |  - conflict format | 
 |  - merge options | 
 |  | 
 | (Daniel, Miklos, Stephan, JC) |