Reverting to a specific commit without losing history

前端 未结 3 1445
孤城傲影
孤城傲影 2021-02-19 07:57

I know this type of a question has a lot duplicates, but I wanted to open a new one because I didn\'t found in all of the other questions the explaination of the best way to do

相关标签:
3条回答
  • 2021-02-19 08:21

    Don't revert your changes, just go back to a previous commit and then checkout a new branch from there.

    git checkout development
    git checkout c14809fa
    git checkout -b newBranch
    

    This way you can visit the 'development' branch to see old changes and history and you can make further changes in 'newBranch'

    You can rename the branches if you want the other way around using -

    git branch -m <oldname> <newname>
    
    0 讨论(0)
  • 2021-02-19 08:28

    The easiest thing to do, like you say, would be to simply create a new branch where HEAD is and then revert development to the commit you want to resume work from:

    git checkout development   # Make HEAD point to the 'development' branch
    git branch beforeRevert    # Create a new branch reference pointing to HEAD
    git reset --hard c14809fa  # Move HEAD, the index and your working copy to c14809fa
    

    Here's a graphical representation of what will happen:

        Step 1               Step 2                  Step 3
    
                develop    develop, beforeRevert   develop   beforeRevert
               /                    /             /         /
    A-B-C-D-E-F          A-B-C-D-E-F             A-B-C-D-E-F
              ^                    ^             ^
             HEAD                 HEAD          HEAD
    

    The important thing here is that HEAD is always pointing to the development branch, so that's the branch that gets moved when you run git reset --hard c14809fa. The new beforeRevert branch will still point to where HEAD was before the revert.

    0 讨论(0)
  • 2021-02-19 08:37

    If you're sure that neither soft reset nor creating multiple branches work for your use case, you could do

    git diff HEAD commit_hash_to_go_to | git apply
    

    This will create a diff of changes between the latest commit on your branch and the commit with the desired state and automatically apply it. That will simply change the files, it's your job to add them to staging and commit the result. Might be useful if you want to try out different solutions and keep the history of your changes WITHIN the same branch or avoid multiplying local branches.

    If you encounter "cannot apply binary patch to without full index line" error, add --binary flag:

    git diff HEAD commit_hash_to_go_to --binary | git apply
    

    Before doing this ensure that you've got no uncommitted changes - otherwise the patch won't be applied (it's atomic so either all changes go through or none, so you won't end up in an inconsistent state)

    NOTE: this simply changes the files and marks them as modified. It does NOT alter commit history or create new commits

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