Re-doing a reverted merge in Git

前端 未结 8 1993
一个人的身影
一个人的身影 2020-11-22 11:10

I have run into a bit of a problem here: I had a problem-specific branch 28s in Git, that I merged in the general develop branch. Turns out I had d

相关标签:
8条回答
  • 2020-11-22 11:41

    I would suggest you to follow below steps to revert a revert, say SHA1.

    git checkout develop #go to develop branch
    git pull             #get the latest from remote/develop branch
    git branch users/yourname/revertOfSHA1 #having HEAD referring to develop
    git checkout users/yourname/revertOfSHA1 #checkout the newly created branch
    git log --oneline --graph --decorate #find the SHA of the revert in the history, say SHA1
    git revert SHA1
    git push --set-upstream origin users/yourname/revertOfSHA1 #push the changes to remote
    

    Now create PR for the branch users/yourname/revertOfSHA1

    0 讨论(0)
  • 2020-11-22 11:42
    1. create new branch at commit prior to the original merge - call it it 'develop-base'
    2. perform interactive rebase of 'develop' on top of 'develop-base' (even though it's already on top). During interactive rebase, you'll have the opportunity to remove both the merge commit, and the commit that reversed the merge, i.e. remove both events from git history

    At this point you'll have a clean 'develop' branch to which you can merge your feature brach as you regularly do.

    0 讨论(0)
  • 2020-11-22 11:43

    To revert a revert in GIT:

    git revert <commit-hash-of-previous-revert>
    
    0 讨论(0)
  • 2020-11-22 11:43

    Instead of using git-revert you could have used this command in the devel branch to throw away (undo) the wrong merge commit (instead of just reverting it).

    git checkout devel
    git reset --hard COMMIT_BEFORE_WRONG_MERGE
    

    This will also adjust the contents of the working directory accordingly. Be careful:

    • Save your changes in the develop branch (since the wrong merge) because they too will be erased by the git-reset. All commits after the one you specify as the git reset argument will be gone!
    • Also, don't do this if your changes were already pulled from other repositories because the reset will rewrite history.

    I recommend to study the git-reset man-page carefully before trying this.

    Now, after the reset you can re-apply your changes in devel and then do

    git checkout devel
    git merge 28s
    

    This will be a real merge from 28s into devel like the initial one (which is now erased from git's history).

    0 讨论(0)
  • 2020-11-22 11:45

    Let's assume you have such history

    ---o---o---o---M---W---x-------x-------*
                  /                      
          ---A---B
    

    Where A, B failed commits and W - is revert of M

    So before I start fixing found problems I do cherry-pick of W commit to my branch

    git cherry-pick -x W
    

    Then I revert W commit on my branch

    git revert W 
    

    After I can continue fixing.

    The final history could look like:

    ---o---o---o---M---W---x-------x-------*
                  /                       /     
          ---A---B---W---W`----------C---D
    

    When I send a PR it will clearly shows that PR is undo revert and adds some new commits.

    0 讨论(0)
  • 2020-11-22 11:45

    To revert the revert without screwing up your workflow too much:

    • Create a local trash copy of develop
    • Revert the revert commit on the local copy of develop
    • Merge that copy into your feature branch, and push your feature branch to your git server.

    Your feature branch should now be able to be merged as normal when you're ready for it. The only downside here is that you'll a have a few extra merge/revert commits in your history.

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