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
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
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.
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