git remove merge commit from history

后端 未结 4 1714
再見小時候
再見小時候 2020-11-29 15:55

My Git history looks like that :

\"Git

I would like to squash the purple commits into a singl

相关标签:
4条回答
  • 2020-11-29 16:24

    There are two ways to tackle this based on what you want:

    Solution 1: Remove purple commits, preserving history (incase you want to roll back)

    git revert -m 1 <SHA of merge>
    

    -m 1 specifies which parent line to choose

    Purple commits will still be there in history but since you have reverted, you will not see code from those commits.


    Solution 2: Completely remove purple commits (disruptive change if repo is shared)

    git rebase -i <SHA before branching out>
    

    and delete (remove lines) corresponding to purple commits.

    This would be less tricky if commits were not made after merge. Additional commits increase the chance of conflicts during revert/rebase.

    0 讨论(0)
  • 2020-11-29 16:33

    To Just Remove a Merge Commit

    If all you want to do is to remove a merge commit (2) so that it is like it never happened, the command is simply as follows

    git rebase --onto <sha of 1> <sha of 2> <blue branch>

    And now the purple branch isn't in the commit log of blue at all and you have two separate branches again. You can then squash the purple independently and do whatever other manipulations you want without the merge commit in the way.

    0 讨论(0)
  • 2020-11-29 16:37

    Starting with the repo in the original state

    To remove the merge commit and squash the branch into a single commit in the mainline

    Use these commands (replacing 5 and 1 with the SHAs of the corresponding commits):

    git checkout 5
    git reset --soft 1
    git commit --amend -m '1 2 3 4 5'
    git rebase HEAD master
    

    To retain a merge commit but squash the branch commits into one:

    Use these commands (replacing 5, 1 and C with the SHAs of the corresponding commits):

    git checkout -b tempbranch 5
    git reset --soft 1
    git commit --amend -m '1 2 3 4 5'
    git checkout C
    git merge --no-ff tempbranch
    git rebase HEAD master
    

    To remove the merge commit and replace it with individual commits from the branch

    Just do (replacing 5 with the SHA of the corresponding commit):

    git rebase 5 master
    

    And finally, to remove the branch entirely

    Use this command (replacing C and D with the SHAs of the corresponding commits):

    git rebase --onto C D~ master
    
    0 讨论(0)
  • 2020-11-29 16:39

    Do git rebase -i <sha before the branches diverged> this will allow you to remove the merge commit and the log will be one single line as you wanted. You can also delete any commits that you do not want any more. The reason that your rebase wasn't working was that you weren't going back far enough.

    WARNING: You are rewriting history doing this. Doing this with changes that have been pushed to a remote repo will cause issues. I recommend only doing this with commits that are local.

    0 讨论(0)
提交回复
热议问题