views:

82

answers:

2

I'm trying to learn how to use Git effectively and I'm wondering how I should (good practice/bad practice?) solve the following case:

Say I have the following chain of commits in master:

  • Initial commit
  • Commit 1
  • Commit 2
  • Commit 3

Then I realize that what's done in the last two commits is completely wrong and I need to start from Commit 1 again. Questions:

  • How should I do that?
  • Can I move Commit 2 and 3 to a separate branch to keep for future reference (say they weren't that bad after all) and continue working from Commit 1 on master?
+3  A: 
git branch tmp            # mark the current commit with a tmp branch
git reset --hard Commit1  # revert to Commit1

The SO answer "What's the difference between 'git reset' and 'git checkout' in git?" is quite instructive for that kind of operation

alt text

A git reset --hard HEAD~2 would do the same thing (without needing to get back the SHA1 for Commit1 first).

Since Commit2 and Commit3 are still reference by a Git ref (here a branch), you can still revert to them anytime you want (git checkout tmp).

VonC
Thanks! Just an observation: In gitk the tmp branch doesn't show. Shouldn't it do so, as Commit1 is common for both branches?
Paul
@Paul: did you try a " `gitk --all` "?
VonC
Haha, clever :)
Paul
A: 

Hi there,

a couple of answers to your first question here.

If you want to keep your actual changes you can always keep diffs or play with branches.

Josmas