Home > Mobile >  Branching from a feature branch and reconciling commits after main squash merge
Branching from a feature branch and reconciling commits after main squash merge

Time:06-28

I have the following situation: I've worked on a feature branch (called work1) to which I have an outstanding PR. While I wait for the PR to be approved, I want to start working on a new feature branch (called work2). The problem is that my company's merge strategy is to squash-merge into main, and I don't know how to use git to handle the new squashed merge when I try to merge work2 into main.

This is pretty much what I have:

  1. Create the repo and a file:
$ mkdir git_test && cd git_test && git init .
$ echo "test!" > test.txt && git add test.txt && git commit -m "added test"
[master (root-commit) 217c4bb] added test
 1 file changed, 1 insertion( )
 create mode 100644 test.txt
  1. Create the first feature branch with a couple of commits:
$ git checkout -b work1
Switched to a new branch 'work1'
$ echo "1. Added this!" >> test.txt && git add test.txt && git commit -m "Wrote '1. Added this'"
[work1 067ee68] Wrote '1. Added this'
 1 file changed, 1 insertion( )
$ echo "2. Added more" >> test.txt && git add test.txt && git commit -m "Wrote '2. Added more'"
[work1 458d4ea] Wrote '2. Added more'
 1 file changed, 1 insertion( )
$ git log
commit 458d4eaf8e0311d88597c54b407e73546b09cf94 (HEAD -> work1)
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:28:10 2022 -0400

    Wrote '2. Added more'

commit 067ee68b65000f290952e0bb12ee5dda0e54b61b
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:27:47 2022 -0400

    Wrote '1. Added this'

commit 217c4bb80ec6435589d0f5d0cc823a0801ea58b4 (master)
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:27:15 2022 -0400

    added test
  1. Create the second feature branch work2 which depends on code from work1:
$ git checkout -b work2
Switched to a new branch 'work2'
$ echo "3. Added even more" >> test.txt && git add test.txt && git commit -m "Wrote '3. Added even more' in branch work2"
[work2 7bbee44] Wrote '3. Added even more' in branch work2
 1 file changed, 1 insertion( )
$ echo "4. last commit that will finally fix the CI" >> test.txt && git add test.txt && git commit -m "'4. last commit that will finally fix the CI' in branch work2"
[work2 5cf7047] 4. last commit that will finally fix the CI' in branch work2
 1 file changed, 1 insertion( )

Now, say that the PR for work1 has been approved and it has been squashed-merged into master

$ git checkout master 
Switched to branch 'master'
$ git merge --squash work1 
Updating 217c4bb..458d4ea
Fast-forward
Squash commit -- not updating HEAD
 test.txt | 2   
 1 file changed, 2 insertions( )
$ git commit
[master d3279c0] Squashed commit of the following:
 1 file changed, 2 insertions( )
$ git log
commit d3279c0a83d57242d23869035f423acf4582dd1b (HEAD -> master)
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:33:19 2022 -0400

    Squashed commit of the following:
    
    commit 458d4eaf8e0311d88597c54b407e73546b09cf94
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:28:10 2022 -0400
    
        Wrote '2. Added more'
    
    commit 067ee68b65000f290952e0bb12ee5dda0e54b61b
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:27:47 2022 -0400
    
        Wrote '1. Added this'

commit 217c4bb80ec6435589d0f5d0cc823a0801ea58b4
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:27:15 2022 -0400

    added test

Great, now my commits from work1 are all in master. Let's see if I can merge work2:

$ git merge --no-commit --no-ff work2 
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

Of course I can't, because I squash-merged work1.

I've tried rebasing work2 from master, but that doesn't work either:

$ git rebase master work2
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
error: could not apply 067ee68... Wrote '1. Added this'
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 067ee68... Wrote '1. Added this'

The problem is again the squashed merge. I've tried a convoluted solution using git cherry-pick based on this answer:

$ git checkout work2
$ git checkout -b tmp_branch
Switched to a new branch 'tmp_branch'
$ git reset --hard HEAD~2
HEAD is now at 458d4ea Wrote '2. Added more'
$ git merge --squash HEAD@{1}
Updating 458d4ea..5cf7047
Fast-forward
Squash commit -- not updating HEAD
 test.txt | 2   
 1 file changed, 2 insertions( )
$ cat test.txt 
test!
1. Added this!
2. Added more
3. Added even more
4. last commit that will finally fix the CI
$ git commit
[tmp_branch f8eac44] Squashed commit of the following:
 1 file changed, 2 insertions( )
$ git log
commit f8eac44184cd317296d94c4307c076941926b3a8 (HEAD -> tmp_branch)
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:49:44 2022 -0400

    Squashed commit of the following:
    
    commit 5cf7047ca2f041b35d06d81423937e16ddd3cdb9
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:44:05 2022 -0400
    
        4. 'last commit that will finally fix the CI' in branch work2
    
    commit 7bbee444fb592cb77515f2ed2532ada48aaae1f3
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:29:11 2022 -0400
    
        Wrote '3. Added even more' in branch work2

commit 458d4eaf8e0311d88597c54b407e73546b09cf94 (work1)
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:28:10 2022 -0400

    Wrote '2. Added more'

commit 067ee68b65000f290952e0bb12ee5dda0e54b61b
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:27:47 2022 -0400

    Wrote '1. Added this'

commit 217c4bb80ec6435589d0f5d0cc823a0801ea58b4
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:27:15 2022 -0400

    added test
$ git checkout master
$ git checkout -b work2_merge
Switched to a new branch 'work2_merge'
$ git cherry-pick -x f8eac44184cd317296d94c4307c076941926b3a8
[work2_merge 105c732] Squashed commit of the following:
 Date: Fri Jun 24 16:49:44 2022 -0400
 1 file changed, 2 insertions( )
$ git log
commit 105c73247e38015fb4225c5b8f08aeac09d676f1 (HEAD -> work2_merge)
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:49:44 2022 -0400

    Squashed commit of the following:
    
    commit 5cf7047ca2f041b35d06d81423937e16ddd3cdb9
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:44:05 2022 -0400
    
        4. 'last commit that will finally fix the CI' in branch work2
    
    commit 7bbee444fb592cb77515f2ed2532ada48aaae1f3
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:29:11 2022 -0400
    
        Wrote '3. Added even more' in branch work2
    
    (cherry picked from commit f8eac44184cd317296d94c4307c076941926b3a8)

commit d3279c0a83d57242d23869035f423acf4582dd1b (master)
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:33:19 2022 -0400

    Squashed commit of the following:
    
    commit 458d4eaf8e0311d88597c54b407e73546b09cf94
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:28:10 2022 -0400
    
        Wrote '2. Added more'
    
    commit 067ee68b65000f290952e0bb12ee5dda0e54b61b
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:27:47 2022 -0400
    
        Wrote '1. Added this'

OK, so now I have the two squashed merges in a breach.

$ git checkout master
$ git merge --squash work2_merge
Updating d3279c0..062b2a7
Fast-forward
Squash commit -- not updating HEAD
 test.txt | 2   
 1 file changed, 2 insertions( )
$ git commit
[master dc31dde] Squashed commit of the following:
 1 file changed, 2 insertions( )
$ git log
commit dc31dde347d0ea757037b294ca718a552beaa55d
Author: Homer <[email protected]>
Date:   Fri Jun 24 17:18:56 2022 -0400

    Squashed commit of the following:
    
    commit 062b2a792bcd408581f359771a3cbb3c3cad5d93
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 17:13:33 2022 -0400
    
        Squashed commit of the following:
    
        commit 8b7aa42031670640350fbf8313cf83f63bd8db89
        Author: Homer <[email protected]>
        Date:   Fri Jun 24 16:44:05 2022 -0400
    
            '4. last commit that will finally fix the CI' in branch work2
    
        commit 7bbee444fb592cb77515f2ed2532ada48aaae1f3
        Author: Homer <[email protected]>
        Date:   Fri Jun 24 16:29:11 2022 -0400
    
            Wrote '3. Added even more' in branch work2
    
        (cherry picked from commit e34f0397c99de5a59a0f09f5da43305efbd3feb6)

commit d3279c0a83d57242d23869035f423acf4582dd1b
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:33:19 2022 -0400

    Squashed commit of the following:
    
    commit 458d4eaf8e0311d88597c54b407e73546b09cf94
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:28:10 2022 -0400
    
        Wrote '2. Added more'
    
    commit 067ee68b65000f290952e0bb12ee5dda0e54b61b
    Author: Homer <[email protected]>
    Date:   Fri Jun 24 16:27:47 2022 -0400
    
        Wrote '1. Added this'

commit 217c4bb80ec6435589d0f5d0cc823a0801ea58b4
Author: Homer <[email protected]>
Date:   Fri Jun 24 16:27:15 2022 -0400

    added test

Which is ugly as hell because of those "squash" commits. Any suggestions on how to reconcile these squashed merges? Thanks a bunch.

CodePudding user response:

What you can do after git merge --squash work1 is:

  • Do not remove branch yet (to make things faster)
  • git checkout work2 (as @TTT rightly noticed, this step is not needed)
  • git rebase --onto master work1 work2

This way you will not have to resolve any conflict and managing work2 branch will be easier. If you did remove your branch, then you need to get the last commit hash from work1 branch (for example you will find it in the commit message of the squashed commits).

One note, the merge conflict doesn't suggest that you cannot merge. You will be fine with merging after resolving conflicts. But the history wouldn't be looking great.

  • Related