Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merging a branch that has merge commits #186

Open
OliverJAsh opened this issue May 26, 2021 · 1 comment
Open

Merging a branch that has merge commits #186

OliverJAsh opened this issue May 26, 2021 · 1 comment

Comments

@OliverJAsh
Copy link

OliverJAsh commented May 26, 2021

Sorry if this has already been asked, I tried to search for existing issues but couldn't find anything!

  • master branch only contains merge commits.
  • When I work on a feature I branch off of the latest master.
  • At some point later on I want to merge master into my feature branch.

In this example I want to merge master into feature-3:

* 502ea6a (feature-3) Amend b
| *   9d988ea (master) Merge branch 'feature-2'
| |\
|/ /
| * 7e5dce8 Amend a
| * 638c8ca New file
|/
*   8cdd583 Merge branch 'feature'
|\
| * a2dc21b Feature
|/
* 91bf661 Init

When I do so using git-imerge merge master, if there's a conflict I see something like this:

Attempting automerge of 1-1...failure.
Attempting automerge of 1-1...failure.
Switched to branch 'imerge/master'
Auto-merging test
CONFLICT (content): Merge conflict in test
Recorded preimage for 'test'
Automatic merge failed; fix conflicts and then commit the result.

Original first commit:
commit 502ea6ac3ff9ac782a04f9af7a5a366923e1e9ae (HEAD -> imerge/master, refs/imerge/master/manual/1-0, feature-3)
Author: Oliver Joseph Ash <[email protected]>
Date:   Wed May 26 10:53:43 2021 +0100

    Amend b

Original second commit:
commit 9d988eaec4e576406156a96b68a8bddeed699c52 (refs/imerge/master/manual/0-1, master)
Merge: 8cdd583 7e5dce8
Author: Oliver Joseph Ash <[email protected]>
Date:   Wed May 26 10:53:17 2021 +0100

    Merge branch 'feature-2'

There was a conflict merging commit 1-1, shown above.
Please resolve the conflict, commit the result, then type

    git-imerge continue

It's difficult to deal with this conflict because the merge commit on master contains many different changes.

Is there a way I can use git-imerge so that it allows me to deal with conflicts between the original commits rather than between merge commits? In my example above the underlying merge conflict arises between 7e5dce8 Amend a and 502ea6a Amend b—I would like git-imerge to tell me this.

@mhagger
Copy link
Owner

mhagger commented Jun 11, 2021

In this particular case, you could try

git imerge 7e5dce8

which would merge the individual commits 638c8ca and 7e5dce8 into feature-3. Assuming that 9d988ea is not an evil merge, the resulting tree would be the same as merging 9d988ea into feature-3 directly. You'd probably then want to merge 9d988ea into that merge commit to get the right history graph, or fiddle around to make the history only include a single merge.

This could be automated for a history that looks like your master history: each branch diverges from master then is merged back to master (possibly with conflicts), one at a time, without the branches overlapping in time, like this:

o-------o-----------o-------o          ← master
 \       \         / \     /
  \       o---o---o   o---o
   \
    o-------o-------o-------o          ← branch

This is not very difficult, because the commits on master can be put into a linear order.

But as soon as the history gets more complicated, it's hard to generalize. For example, what would one do in the following case?:

  A---B
 /     \
o---X---C         ← master
 \ / \
  o   o---o       ← branch

It's not hard to imerge commits A and B into branch, but when you get to C things aren't so clear, because C already contains the changes from commit X, which are already in branch. (Technically, the problem is that the merge of C into branch has two "merge bases", B and X.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants