Ron Garret <ron1@xxxxxxxxxxx> 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html