threads / discuss / 7525

'git checkout -f' versus 'git reset --hard'

Subject: 'git checkout -f' versus 'git reset --hard'

## tl;dr

4 messages between Apr 5, 2007 and Apr 5, 2007.

replies: 3people: 4as markdown or json

Bill Lear· Apr 5, 2007, 13:36 UTC · lore

After a failed merge, I want to undo things. I typically use git reset --hard, and it works like a charm. Others have tried to use git checkout -f, but I have cautioned that git reset --hard is really the way to do it. Is there a difference here, or are they equivalent?

Bill
Jeff King· Apr 5, 2007, 13:43 UTC · re: Bill Lear · lore

Re: 'git checkout -f' versus 'git reset --hard'

On Thu, Apr 05, 2007 at 08:36:09AM -0500, Bill Lear wrote:
> After a failed merge, I want to undo things.  I typically use git
> reset --hard, and it works like a charm.  Others have tried to use git
> checkout -f, but I have cautioned that git reset --hard is really the
> way to do it.  Is there a difference here, or are they equivalent?

Skimming through the code (and looking at the output of sh -x), it looks like both just end up executing git-read-tree --reset -u $HEAD.

-Peff
Shawn O. Pearce· Apr 5, 2007, 15:29 UTC · re: Jeff King · lore

Re: 'git checkout -f' versus 'git reset --hard'

Jeff King <peff@peff.net> wrote:
Show 9 quoted lines
> On Thu, Apr 05, 2007 at 08:36:09AM -0500, Bill Lear wrote:
> 
> > After a failed merge, I want to undo things.  I typically use git
> > reset --hard, and it works like a charm.  Others have tried to use git
> > checkout -f, but I have cautioned that git reset --hard is really the
> > way to do it.  Is there a difference here, or are they equivalent?
> 
> Skimming through the code (and looking at the output of sh -x), it looks
> like both just end up executing git-read-tree --reset -u $HEAD.

Sure, but git-reset also whacks MERGE_MSG, rr-cache/MERGE_RR, SQUASH_MSG, SQUASH_HEAD. Maybe checkout should do the same.

I guess checkout -f is fine, and does the job, but usually we say reset --hard. :-)

-- 
Shawn.
Linus Torvalds· Apr 5, 2007, 15:43 UTC · re: Bill Lear · lore

Re: 'git checkout -f' versus 'git reset --hard'

On Thu, 5 Apr 2007, Bill Lear wrote:
Show 5 quoted lines
>
> After a failed merge, I want to undo things.  I typically use git
> reset --hard, and it works like a charm.  Others have tried to use git
> checkout -f, but I have cautioned that git reset --hard is really the
> way to do it.  Is there a difference here, or are they equivalent?

They are equivalent, but *only* if not given any other arguments (or if given "HEAD", which is obviously the default).

HOWEVER! If you give them an argument, they work very differently. So
	git checkout -f <branchname>
	git reset --hard <branchname>

are fundamentally different operations: the "git checkout -f" thing will *switch* to the named branch (or create a detached HEAD if it's just a random commit SHA1 and not a branchname), while the "git reset --hard" thing will *force* the current branch top commit to the same as for <branchname>.

It just so happens that without any branchname they both default to the "current branch", and then the two end up doing the exact same thing, even though conceptually they are very different operations.

So they really are fundamentally different, it's just that for the common special case they end up doing the same thing.

		Linus

← back to recent threads