Skip to contentSkip to conversation

Challenges for an octopus merge

DISCUSSION Markus Elfring 2 participants 7 messages Jun 15, 2016

lore
Share & tools
lore
#0 lore raw

Hello,

I have got an update history like the following in a local repository with ten patches in separate topic branches on my openSUSE 11.3 system.

master -> tag: v3.0 -> compilation_maintenance

              /->  errno => C1
             /->   braces => C2
            /->    string => C3
           /->     binary_search => C4
 -> route1 --->    temporary_files => C5
           \->     make_functions_static => C6
            \->    const-correctness => C7
             \->   signal_handling => C8
              \->  enum => C9
               \-> double_declaration_deletion => C10

elfring@Sonne:~/Projekte/BtYacc/lokal2> git --version && git checkout -b test3
git version 1.7.3.4
Switched to a new branch 'test3'
elfring@Sonne:~/Projekte/BtYacc/lokal2> git merge --no-ff --stat --verbose --log -m 'Combination of six topics' errno braces string binary_search temporary_files make_functions_static Fast-forwarding to: errno
Trying simple merge with braces
Trying simple merge with string
Trying simple merge with binary_search
Trying simple merge with temporary_files
Simple merge did not work, trying automatic merge.
Auto-merging defs.h
Trying simple merge with make_functions_static
Simple merge did not work, trying automatic merge.
Auto-merging defs.h
ERROR: content conflict in defs.h
Auto-merging main.c
Auto-merging mkpar.c
fatal: merge program failed
Automatic merge failed; fix conflicts and then commit the result.

The merge description (suggested commit message) was fine in the display of the tool "Git GUI 0.13.0" (Tcl/Tk version 8.5.8). I delete the conflict section in the header file "defs.h" completely.

elfring@Sonne:~/Projekte/BtYacc/lokal2> git merge --no-ff --stat --verbose --log -m 'Combination of four topics' const-correctness double_declaration_deletion enum signal_handling Trying simple merge with const-correctness
Simple merge did not work, trying automatic merge.
Auto-merging defs.h
Auto-merging output.c
Auto-merging reader.c
Trying simple merge with double_declaration_deletion
Simple merge did not work, trying automatic merge.
Auto-merging mkpar.c
ERROR: content conflict in mkpar.c
fatal: merge program failed
Automated merge did not work.
Should not be doing an Octopus.
Merge with strategy octopus failed.

The merge description was missing (no commit message) in this case. Is this omission acceptable?

I have also got the impression that the corresponding source files did not contain enough conflict markers. Is my use case relevant for further considerations of details with this merging process?

Regards,
Markus

#1 lore raw
Quoted 7 lines · Markus Elfring

...
Automated merge did not work.
Should not be doing an Octopus.
Merge with strategy octopus failed.

The merge description was missing (no commit message) in this case.

The second-to-last line of the output needs to be rephrased.

Octopus is not for recording conflicting merges and when it punts you shouldn't be attempting to resolve and record it as an octopus merge.

#2 lore raw
Quoted 1 line

The second-to-last line of the output needs to be rephrased.

Which wording adjustment have you got in mind?

Quoted 2 lines

Octopus is not for recording conflicting merges and when it punts you shouldn't be attempting to resolve and record it as an octopus merge.

Would it make sense to specify that the merging process may switch to the strategy "resolve" on demand?

Regards,
Markus

#3 lore raw
Quoted 3 lines · Markus Elfring
Quoted 1 line

The second-to-last line of the output needs to be rephrased.

Which wording adjustment have you got in mind?

Something along the two lines below to rephase the second-to-last line of the output I quoted from your original message.

Quoted 5 lines
Quoted 2 lines

Octopus is not for recording conflicting merges and when it punts you shouldn't be attempting to resolve and record it as an octopus merge.

Would it make sense to specify that the merging process may switch to the strategy "resolve" on demand?

Depends on what you mean by "on demand", but if you mean "git merge A B C" automagically turns into "git merge A; git merge B; git merge C" then I don't think that makes much sense. The user needs to decide what to do next; the user may choose to do "git merge A C ; git merge B" instead, but *after* inspecting the situation.

#4 lore raw
Quoted 2 lines

The user needs to decide what to do next; the user may choose to do "git merge A C ; git merge B" instead, but *after* inspecting the situation.

I have inspected my situation a bit more. I hope that the merging process can be improved so that it can cope with my update suggestions here.

Would anybody (besides me) like to look into the affected patches and source files if the tool "Git" can provide a better service?

Does it make sense to add these files to your test-suite?

Regards,
Markus

#5 lore raw
In reply to Junio C Hamano
Quoted 2 lines

The user needs to decide what to do next; the user may choose to do "git merge A C ; git merge B" instead, but *after* inspecting the situation.

I find a few of the applied conflict markers strange after my inspection.

1. They suggest to choose one of the involved changes. But how do you think about the situation if I found that the right resolution is to delete the conflict section completely?

Why was the merging process not able to come to the same conclusion
automatically?

2. My tenth patch would like to delete six consecutive lines in a source file in a way similar to the following example.

-drop 1 ...;
-drop 2 ...;
-drop 3 ...;
-drop 4 ...;
-
-
void make_parser()

elfring@Sonne:~/Projekte/BtYacc/lokal2> git merge --stat --verbose -m 'Deletion of duplicated function declarations' double_declaration_deletion

Auto-merging
mkpar.c

CONFLICT (content): Merge conflict in mkpar.c

Automatic merge failed; fix conflicts and then commit the result.

But the Git GUI displays this conflict like the following.

<<<<<<< HEAD
+drop 1 ...;
+drop 2 ...;
+drop 3 ...;
+drop 4 ...;
+
+static void find_final_state(void)
=======
+ void make_parser()
+ {
...
+ }
+
+ void find_final_state()

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

double_declaration_deletion

I find three details suspicious here.
- Why are these lines marked for addition again?
- Why is the function "find_final_state" referenced? (Does this indicate an off-by-one error in the first block?)
- Why are those parts like make_parser() not omitted that were moved to different places in this source file by a previous patch?

I would appreciate your advices.

Regards,
Markus