TheRealFakeNews
TheRealFakeNews

Reputation: 8183

Permanently continue work from previous commit

I checked out a previous commit, using git checkout , I made changes, and committed them. However, when I do git status, it says HEAD detached from . How can I make commit that I've checked out the commit I want to keep going forward?

Upvotes: 4

Views: 2044

Answers (3)

hspandher
hspandher

Reputation: 16763

Just reset to that commit.

git reset --hard <commit_id>

Upvotes: 2

phd
phd

Reputation: 95018

Let's look at the situation step by step. Initially you were at the head of a branch, let's say it was master:

--A--B--C
        ^ master
       HEAD

I checked out a previous commit, using git checkout

git checkout HEAD~

Now you're here:

--A--B--C
     ^  ^ master
   HEAD

This situation is called "detached HEAD" because HEAD (the current pointer) is not at the head of any branch.

I made changes, and committed them.

Now you're here:

       --D < HEAD
      /
--A--B--C
        ^ master

What do you want to do now? Do you want to drop the commit C at the head of master and move master to where your HEAD is (to D)? Or do you want to move the commit D to master (preserving C)?

The first task can be solved with the following commands:

git branch tmp-master # create a new branch

       tmp-master
         v
       --D < HEAD
      /
--A--B--C
        ^ master

git checkout master

       tmp-master
         v
       --D
      /
--A--B--C < HEAD
        ^ master

git reset --hard tmp-master # move the branch
git branch -D tmp-master # remove the temporary branch

       master
         v HEAD
       --D
      /
--A--B--C

Or, to streamline the new master branch:

--A--B--D
      \
       C

The commit C becomes a dangling commit and sooner or later will be removed by garbage collector.

But if you want to do the second task (preserve both C and D) the steps are a bit different:

git branch tmp-master # create a new branch

       tmp-master
         v
       --D < HEAD
      /
--A--B--C
        ^ master

git checkout master

       tmp-master
         v
       --D
      /
--A--B--C < HEAD
        ^ master

git cherry-pick tmp-master
git branch -D tmp-master # remove the temporary branch

--A--B--C--D' < HEAD
           ^ master

Upvotes: 6

Nikolaos Georgiou
Nikolaos Georgiou

Reputation: 2874

Push it to the remote with -f so that it erases history.

If your branch is called b1:

git push -f origin b1

Then delete the local branch and checkout the remote branch again. You're all set.

Upvotes: -3

Related Questions