git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] reset: update help text

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Mar 31, 2011, 18:42 UTC
Message-ID
<20110331184246.GA19264@elie>
In-Reply-To
<AANLkTiknvWE9Fe3u88Jbis4Cgxd5ubqaR6MzYOJZ-AtM@mail.gmail.com>
Nguyen Thai Ngoc Duy wrote:
> To be honest, I have no idea what the above describes. I read 9bc454d
> (reset: add option "--keep" to "git reset" - 2010-01-19) and figured
> that --keep is like --merge except that "git diff" before and after
> the reset is exactly the same, is it? I have never used --keep before.
I use "git reset --keep" to
 - discard a bad commit: git reset --keep HEAD^
 - start working against a different commit:
	git checkout -b topic &&
	... hack hack hack without committing ... &&
	: "oops, I thought I was on master but I was somewhere else" &&
	git reset --keep master
The spirit of the thing[1] is:
 * if the diff "HEAD -> <commit>" touch paths in which we have local
   changes, error out;
 * otherwise, checkout the relevant paths from <commit> but leave the
   paths in which we have local changes alone.

which indeed means "git diff --cached" and "git diff" before and after would be exactly the same. But there are some edge cases, in which the diff "HEAD -> <commit>" makes the same change we did and the reset --keep is still allowed.

This is totally different from --merge. The only legitimate use of --merge is to cancel a merge you just performed, imho --- the effect otherwise is too scary ("git add <path>; git reset --merge elsewhere" --- bye, bye, changes made at <path>).

Hope that helps, Jonathan

[1] Detailed semantics: for each path listed by "git diff --name-only HEAD <commit>":

 * if the worktree, index, and HEAD match, make the index and worktree
   match <commit>.
 * otherwise, if it is "not easy" to keep local changes, error out.
   We are not going to do a three-way merge.  That is,
   - if the index matches neither HEAD nor <commit>, error out;
   - if the index matches HEAD but not the worktree, error out.
 * otherwise, it is "easy", so keep local changes.
   - if the index already matches <commit>, leave the index and
     worktree alone.
   - if the index and worktree match HEAD, make them match the
     <commit> instead.

These are the same rules used by fast-forward merges and plain "git checkout".

Previous: Nguyen Thai Ngoc DuyNext: Junio C Hamano
Message 5 of 9 in “reset: update help text”
  1. reset: update help textNguyễn Thái Ngọc Duy, Mar 29, 2011
  2. Nguyen Thai Ngoc DuyMar 29, 2011
  3. Jonathan NiederMar 29, 2011
  4. Nguyen Thai Ngoc DuyMar 31, 2011
  5. Jonathan NiederMar 31, 2011
  6. Junio C HamanoMar 31, 2011
  7. Jonathan NiederMar 31, 2011
  8. Nguyen Thai Ngoc DuyApr 2, 2011
  9. Junio C HamanoMar 31, 2011

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.