How do I move master back several commits in git?

42,409

Solution 1

In order to do it locally, you can do the following commands to go to master and move it to the old commit.

git checkout master
git reset --hard <old_commit_id>

If you then want to push it to the remote, you need to use the -f option.

git push -f origin master

Solution 2

Before pointing master to a previous commit, I recommend backing up your current master:

$ git checkout -b master_backup

Then you can safely point master some number of commits back, e.g. 3:

$ git reset --hard master~3

After moving master, see your tree of commits:

$ git log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all

Now, I would recommend keeping the backup until you're absolutely sure it's unnecessary (for instance, once your new approach is fully implemented), but when you're sure, you can clean up by deleting master_backup:

$ git branch -D master_backup

Solution 3

You can always do a git reset <commit>. Perhaps the easiest way to do this is use a graphical frontend, i.e. gitk.

You should perhaps first do a git branch branch-for-failed-experiment so the work on the experiment isn't lost forever.

Be careful, if you published the branch (i.e., if others could have work based on your to-be-deleted commits), they will be left stranded. Make sure they sync up with you.

Solution 4

Note that at any given time you can change where a branch points to by using git update-ref refs/heads/branch id , but before you do this, you must give a name to the tip of the tree, otherwise your work will unaccessible. So these two commands may do the job

 git update-ref refs/heads/newfeature HEAD
 git update-ref refs/heads/master XXYYY

But make sure that you do not have any uncommited changes otherwise all hell will break loose

Share:
42,409
Hoytman
Author by

Hoytman

I am a web developer based out of Chattanooga Tn. I am the webmaster for several companies in the area. I am currently using Codeigniter and my platform/framework of choice, but I have also used Drupal in the past. I am constantly impressed by the variety of object oriented PHP that is used out there and would like to learn and contribute more to the community. I am still learning more than I am teaching, but I have been able to accomplish a lot with the aid and expertise of the Stack Overflow community. I am currently getting back into Drupal with a furry, so expect a lot of Drupal questions.

Updated on May 04, 2021

Comments

  • Hoytman
    Hoytman about 3 years

    I have a git repository which holds a Drupal site. I spent the last day trying to build a feature using several different modules. I have given up on my current approach and have decided to try a different combination of modules. However, my repository has several commits on the master branch that contain this feature development process (I understand that I did not branch in an effective manner.) I want to get rid of the last three or four commits and set master to that point in my history (I don't want to merge my current work with anything, I just want it to go away.) How do I do this?

  • Hoytman
    Hoytman about 10 years
    I don't think I want anyone ever to know how bad I messed that one up :P
  • Hoytman
    Hoytman about 10 years
    It sounds like what I really want to do is make a new commit in which all the mistakes are removes (which would look identical to a commit made 3 or 4 commits ago.) How would I do that?
  • vonbrand
    vonbrand about 10 years
    You can revert the commits. Or you could do something like git diff <old>..<current>, stash the result away in a file, and then git apply -R this to undo all changes, then git commit -a the result. But I'd prefer to create a clean history (even if it is completely fake).
  • Hoytman
    Hoytman about 10 years
    Could I ask for a good place to find a list of options that git uses and their meaning? I don't know what --hard or -f does.
  • Hoytman
    Hoytman about 10 years
    Actually, I just found this documentation link : kernel.org/pub/software/scm/git/docs/git.html
  • merlin2011
    merlin2011 about 6 years
    @Mr JF, That is true. One must unprotect to rewrite history. There's no other way.