Skip to content

Commit 7260e87

Browse files
newrengitster
authored andcommitted
git-merge-tree.txt: add a section on potentional usage mistakes
Signed-off-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 7976721 commit 7260e87

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

Documentation/git-merge-tree.txt

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,59 @@ with linkgit:git-merge[1]:
156156
* any messages that would have been printed to stdout (the
157157
<<IM,Informational messages>>)
158158

159+
MISTAKES TO AVOID
160+
-----------------
161+
162+
Do NOT look through the resulting toplevel tree to try to find which
163+
files conflict; parse the <<CFI,Conflicted file info>> section instead.
164+
Not only would parsing an entire tree be horrendously slow in large
165+
repositories, there are numerous types of conflicts not representable by
166+
conflict markers (modify/delete, mode conflict, binary file changed on
167+
both sides, file/directory conflicts, various rename conflict
168+
permutations, etc.)
169+
170+
Do NOT interpret an empty <<CFI,Conflicted file info>> list as a clean
171+
merge; check the exit status. A merge can have conflicts without having
172+
individual files conflict (there are a few types of directory rename
173+
conflicts that fall into this category, and others might also be added
174+
in the future).
175+
176+
Do NOT attempt to guess or make the user guess the conflict types from
177+
the <<CFI,Conflicted file info>> list. The information there is
178+
insufficient to do so. For example: Rename/rename(1to2) conflicts (both
179+
sides renamed the same file differently) will result in three different
180+
file having higher order stages (but each only has one higher order
181+
stage), with no way (short of the <<IM,Informational messages>> section)
182+
to determine which three files are related. File/directory conflicts
183+
also result in a file with exactly one higher order stage.
184+
Possibly-involved-in-directory-rename conflicts (when
185+
"merge.directoryRenames" is unset or set to "conflicts") also result in
186+
a file with exactly one higher order stage. In all cases, the
187+
<<IM,Informational messages>> section has the necessary info, though it
188+
is not designed to be machine parseable.
189+
190+
Do NOT assume that each paths from <<CFI,Conflicted file info>>, and
191+
the logical conflicts in the <<IM,Informational messages>> have a
192+
one-to-one mapping, nor that there is a one-to-many mapping, nor a
193+
many-to-one mapping. Many-to-many mappings exist, meaning that each
194+
path can have many logical conflict types in a single merge, and each
195+
logical conflict type can affect many paths.
196+
197+
Do NOT assume all filenames listed in the <<IM,Informational messages>>
198+
section had conflicts. Messages can be included for files that have no
199+
conflicts, such as "Auto-merging <file>".
200+
201+
AVOID taking the OIDS from the <<CFI,Conflicted file info>> and
202+
re-merging them to present the conflicts to the user. This will lose
203+
information. Instead, look up the version of the file found within the
204+
<<OIDTLT,OID of toplevel tree>> and show that instead. In particular,
205+
the latter will have conflict markers annotated with the original
206+
branch/commit being merged and, if renames were involved, the original
207+
filename. While you could include the original branch/commit in the
208+
conflict marker annotations when re-merging, the original filename is
209+
not available from the <<CFI,Conflicted file info>> and thus you would
210+
be losing information that might help the user resolve the conflict.
211+
159212
[[DEPMERGE]]
160213
DEPRECATED DESCRIPTION
161214
----------------------

0 commit comments

Comments
 (0)