# What does git reset do?

5 messages from 2010-02-02 to 2010-02-02. Participants: Ron Garret, Octavio Alvarez, Jakub Narebski.
Thread: https://gitlist.dev/t/22479

## Ron Garret, 2010-02-02 07:47

Subject: What does git reset do?
Message-ID: <ron1-A2A2DE.23475601022010@news.gmane.org>
URL: https://gitlist.dev/e/ron1-A2A2DE.23475601022010%40news.gmane.org

```
The docs say that git-reset:

"Sets the current head to the specified commit..."

So I tried this:


[ron@mickey:~/devel/gittest]$ git branch
* br1
  master
[ron@mickey:~/devel/gittest]$ git reset --soft master


...expecting HEAD to now point to master.  But it doesn't:


[ron@mickey:~/devel/gittest]$ git branch
* br1
  master
[ron@mickey:~/devel/gittest]$ more .git/HEAD 
ref: refs/heads/br1


So... what does git reset do?

Thanks,
rg

```

## Octavio Alvarez, 2010-02-02 08:01

Subject: Re: What does git reset do?
Message-ID: <op.u7hpv8nd4oyyg1@localhost.localdomain>
URL: https://gitlist.dev/e/op.u7hpv8nd4oyyg1%40localhost.localdomain
In-Reply-To: <ron1-A2A2DE.23475601022010@news.gmane.org>

```
On Mon, 01 Feb 2010 23:47:56 -0800, Ron Garret <ron1@flownet.com> wrote:

> The docs say that git-reset:
>
> "Sets the current head to the specified commit..."

... without modifying your working copy if --soft, and modifying your  
working copy if --hard.

... and without switching branches (you want git checkout for that).

> So I tried this:
>
> [ron@mickey:~/devel/gittest]$ git branch
> * br1
>   master
> [ron@mickey:~/devel/gittest]$ git reset --soft master
>
>
> ...expecting HEAD to now point to master.  But it doesn't:

It actually does. HEAD (and br1) now point to [the commit pointed to by]  
master. Your working copy was left intact (because of --soft). Compare  
with "git checkout".

gitk --all is your friend to better understand this.

Your branch is still br1. It means, if you commit, br1 will advance, (not  
master). But, given your git reset, instead of committing over [the commit  
pointed to by previous] br1, you will commit over [the commit pointed to  
by] master.

Be careful though, you might lose commits with git reset.

> [ron@mickey:~/devel/gittest]$ git branch
> * br1
>   master
> [ron@mickey:~/devel/gittest]$ more .git/HEAD
> ref: refs/heads/br1
>
>
> So... what does git reset do?

Sets the current head (and branch, if not detached) to the specified  
commit...

-- 
--
Octavio.

```

## Ron Garret, 2010-02-02 08:24

Subject: Re: What does git reset do?
Message-ID: <ron1-2B8474.00242602022010@news.gmane.org>
URL: https://gitlist.dev/e/ron1-2B8474.00242602022010%40news.gmane.org
In-Reply-To: <op.u7hpv8nd4oyyg1@localhost.localdomain>

```
In article <op.u7hpv8nd4oyyg1@localhost.localdomain>,
 "Octavio Alvarez" <alvarezp@alvarezp.ods.org> wrote:

> > So... what does git reset do?
> 
> Sets the current head (and branch, if not detached) to the specified  
> commit...

Ah.  It's the "and branch" part that I was missing.  Thanks!

Hm... maybe "detached head" is not as inappropriate a term as I first 
thought.  When you checkout a branch, HEAD really is "attached" to the 
branch insofar as the branch head gets "dragged along" on commits and 
resets.  (Have I got that right?)

rg

```

## Octavio Alvarez, 2010-02-02 08:37

Subject: Re: What does git reset do?
Message-ID: <op.u7hrj8vb4oyyg1@localhost.localdomain>
URL: https://gitlist.dev/e/op.u7hrj8vb4oyyg1%40localhost.localdomain
In-Reply-To: <ron1-2B8474.00242602022010@news.gmane.org>

```
On Tue, 02 Feb 2010 00:24:26 -0800, Ron Garret <ron1@flownet.com> wrote:

> In article <op.u7hpv8nd4oyyg1@localhost.localdomain>,
>  "Octavio Alvarez" <alvarezp@alvarezp.ods.org> wrote:
>
>> > So... what does git reset do?
>>
>> Sets the current head (and branch, if not detached) to the specified
>> commit...
>
> Ah.  It's the "and branch" part that I was missing.  Thanks!
>
> Hm... maybe "detached head" is not as inappropriate a term as I first
> thought.  When you checkout a branch, HEAD really is "attached" to the
> branch insofar as the branch head gets "dragged along" on commits and
> resets.  (Have I got that right?)

99% right. I'm just not sure if there is such thing as "branch head".

You may compare the branch with a "moving tag", in which case the branch  
is just a pointer, so "branch head" would be redundant, and besides "HEAD"  
is an already used term. So you may say simply "branch" instead.

But it's easy intuitive to compare it with a bunch of related commits,  
each parent of another. And gitk also has a line that says "branch: _____,  
______, ______" for each commit.

In any case, it's just a matter of getting the terms to match the  
developers'.


-- 
--
Octavio.

```

## Jakub Narebski, 2010-02-02 15:30

Subject: Re: What does git reset do?
Message-ID: <m3vdefac6k.fsf@localhost.localdomain>
URL: https://gitlist.dev/e/m3vdefac6k.fsf%40localhost.localdomain
In-Reply-To: <ron1-A2A2DE.23475601022010@news.gmane.org>

```
Ron Garret <ron1@flownet.com> writes:

> The docs say that git-reset:
> 
> "Sets the current head to the specified commit..."
> 
> So I tried this:
> 
> 
> [ron@mickey:~/devel/gittest]$ git branch
> * br1
>   master
> [ron@mickey:~/devel/gittest]$ git reset --soft master
> 
> 
> ...expecting HEAD to now point to master.  But it doesn't:

First, 'current head' is what HEAD points to, which means 'br1'
branch.

Second, "git reset --soft master" sets 'br1' branch to _commit_
'master' (commit referenced by 'master' branch).

> 
> 
> [ron@mickey:~/devel/gittest]$ git branch
> * br1
>   master
> [ron@mickey:~/devel/gittest]$ more .git/HEAD 
> ref: refs/heads/br1
> 
> 
> So... what does git reset do?

Let's assume that we have the following situation:


                /-*        <-- branch_A
               /
  *---*---*---*---*---*    <-- branch_B  <--- HEAD

1. $ git checkout branch_A

sets HEAD to branch_A, and sets index and working directory:

                /-*        <-- branch_A  <--- HEAD
               /
  *---*---*---*---*---*    <-- branch_B


2. $ git reset --hard HEAD

sets current branch to commit pointer by branch_A (--soft, --mixed,
--hard), and sets index (--hard and --mixed) and working directory
(--hard):

                   /---------- branch_B  <--- HEAD
                  v

                /-*        <-- branch_A
               /
  *---*---*---*---*---*    

..................................................

Let's assume that we have the following situation:


  *---*---*---a---b---c    <-- branch_A  <--- HEAD
              ^
              |
            v1.0 (tag)


3. $ git checkout v1.0

detaches HEAD:


                /-b---c    <-- branch_A
               /
  *---*---*---a            <--- HEAD
              ^
              |
            v1.0 (tag)


4. $ git reset --hard v1.0

rewinds current branch:

                /-b---c    
               /
  *---*---*---a            <-- branch_A <--- HEAD
              ^
              |
            v1.0 (tag)

Note that commit 'c' might be referenced only by ORIG_HEAD, HEAD@{1}
(reflog for HEAD), and branch_A@{1} (reflog for branch_A); if it is
the case commits 'b' and 'c' would get garbage-collected and removed
eventually.

HTH
-- 
Jakub Narebski
Poland
ShadeHawk on #git

```
