Search code examples
githubcommitheadrevert

Git: revert on older commit


I did some changes on my git repo and did some commits. Here is what I want to do, say my git history looks as HEAD --> c1 --> c2 --> c3 --> c4. Questions 1) Now if I revert c1, does it revert all c2, c3, c4 as well ? My understanding it reverts only c1 and leave c2, c3, c4 as is. 2) Now I want to revert all c1, c2, c3 and c4 and move back to HEAD. What is the best way to do this.


Solution

  • Revert will create a commit that will undo the changes of the revision you want to revert.

    So if you do:

    git revert c1
    

    You will end with:

    revertC1 -> (previous HEAD) -> c1 -> c2 -> c3 -> c4 ...

    And It will only revert that commit changes.

    So, for your scenario where you want to remove four commits previos to the HEAD:

    HEAD -> c1 -> c2 -> c3 -> c4

    which is the same as:

    HEAD -> HEAD~1 -> HEAD~2 -> HEAD~3 -> HEAD~4

    If you want to remove the four commits before the current one. you can do

    git revert HEAD~5..HEAD~1
    

    You will be prompted to create the commit messages for each revert, and perhaps to solve conflicts.

    In case you HAVE NOT PUSHED your changes, what I would do to keep the history log clean would be:

    Undo the current commit and keep the code changes

    git reset --soft HEAD~1
    

    Store the code changes

    git stash
    

    Undo the last four commits and erase code changes

    git reset --hard HEAD~4
    

    Make sure I delete any created files and directories

    git clean -di
    

    Re apply the changes from the top commit which is the one I wanted to keep

    git stash pop
    

    *Fix conflicts in case there will be When there are no conflicts. Commit my changes

    git commit -am "My new changes"
    

    If ready to push, push.

    git push
    

    This, only if you HAVEN'T PUSHED your changes.