diff options
authorJonathan Nieder <>2010-08-05 11:16:51 (GMT)
committerJunio C Hamano <>2010-08-06 16:20:01 (GMT)
commit24d113ec11d9948cedee4ba4687d0775e36b65f9 (patch)
parent1bc0ab7cd13af796b4ba1a5fc3ede9e92078aee4 (diff)
Documentation/technical: document ll_merge
Cc: Junio C Hamano <> Cc: Avery Pennarun <> Cc: Bert Wesarg <> Signed-off-by: Jonathan Nieder <> Signed-off-by: Junio C Hamano <>
1 files changed, 70 insertions, 0 deletions
diff --git a/Documentation/technical/api-merge.txt b/Documentation/technical/api-merge.txt
new file mode 100644
index 0000000..01a89d6
--- /dev/null
+++ b/Documentation/technical/api-merge.txt
@@ -0,0 +1,70 @@
+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.
+Low-level (single file) 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.
+The caller:
+1. allocates an mmbuffer_t variable for the result;
+2. allocates and fills variables with the file's original content
+ and two modified versions (using `read_mmfile`, for example);
+3. calls ll_merge();
+4. reads the output from result_buf.ptr and result_buf.size;
+5. releases buffers when finished (free(ancestor.ptr); free(ours.ptr);
+ free(theirs.ptr); free(result_buf.ptr);).
+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.
+The `flag` parameter is a bitfield:
+ - The least significant bit indicates whether this is an internal
+ merge to consolidate ancestors for a recursive merge.
+ - The next two bits allow local conflicts to be automatically
+ resolved in favor of one side or the other (as in 'git merge-file'
+ `--ours`/`--theirs`/`--union` for 01, 10, and 11, respectively).
+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)