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

4 messages, 4 authors, 2016-06-15 · open the first message on its own page

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

From: Bill Lear <hidden>
Date: 2016-06-15 22:43:03

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

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

From: Jeff King <hidden>
Date: 2016-06-15 22:43:03

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

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

From: Shawn O. Pearce <hidden>
Date: 2016-06-15 22:43:03

Jeff King [off-list ref] wrote:
On Thu, Apr 05, 2007 at 08:36:09AM -0500, Bill Lear wrote:
quoted
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.

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

From: Linus Torvalds <torvalds@linux-foundation.org>
Date: 2016-06-15 22:43:03


On Thu, 5 Apr 2007, 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?
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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help