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

git reset --keep (Re: What's cooking in git.git (Mar 2010, #01; Wed, 03))

From
Jonathan Nieder <jrnieder@gmail.com>
Date
Mar 5, 2010, 16:25 UTC
Message-ID
<20100305162521.GA25120@progeny.tock>
In-Reply-To
<7vk4trlhim.fsf@alter.siamese.dyndns.org>
Junio C Hamano wrote:
> Do you think I finally understood what "reset --keep" is about?

Probably. :) Let me take the opportunity to give some examples of what I am hoping to use it for, to see if I am crazy.

Show 14 quoted lines
> Nah, what was I thinking.  If I rephrase your side note <2> and <3> a
> little bit, everything makes sense.  Perhaps like so:
> 
>     <2> In the ideal world, you could have realized that the earlier
>     commit did not belong to the new topic when you created and switched
>     to branch2 (i.e. "git checkout -b branch2 start"), but nobody is
>     perfect.
> 
>     <3> But you can use "reset --keep" to remove the unwanted commit after
>     you switched to "branch2".
> 
> And it becomes very clear that "reset --keep" is a sensible way to recover
> from this mistake.  No need to do "read-tree -m -u" followed by "reset"
> anymore.

Yes, this (recovery from a wrong choice of starting commit for a new branch) makes sense. Here are some other planned uses:

1. Helping people new to git.

A person not very familiar with git comes to me asking how to undo the last couple of commits. After a quick conversation, it becomes clear that the commits in question were not pushed out to any public repository and that this person does not feel it would be useful to publish the problem commits.

Currently, I would have to advise such a person to use
	git reset --hard HEAD^^
I would prefer to recommend
	git reset --keep HEAD^^

because if there are uncommitted changes then it will give a "needs update" message (right?) and I can help the person to deal with it.

2. Splitting up a huge patch.

Suppose I have a huge patch consisting of several unrelated changes applied to the work tree but not commited. I want to split it into logical changes, commiting each one, and when I am done I will use a loop reading from git rev-list to test all the resulting commits automatically. A workflow for this looks something like the following:

 git checkout -b series1
 git add -p
 git commit
 git add -p
 git commit
 git checkout -b series2 appropriate-base
 git add -p
 git commit
 ...
Having 'git reset --keep' available would add some flexibility:
 * As you mentioned, reset --keep would let me recover from 'git
   checkout -b' to the wrong commit.
 * As in example 1, if some part of the patch turns out to be a
   bad idea after all, I can try to discard it.

A 'git stash' might be worth avoiding in some cases because it touches unrelated files, which means wasted time rebuilding everything.

3. Keeping unrelated extra changes around.

Suppose I am Linus, and I keep on forgetting to update the version number in a file named version.h or something. So I update it in advance as soon as I remember, but I do not commit the change or register it in the index because it is not time yet.

Then in almost every instance when I would have normally used 'reset --hard', I should use 'reset --keep' instead. The only exception is when I am mean “screw it all, reset to a completely known state”; in that case, I will have to update version.h by hand again.

Previous: Junio C HamanoNext: Christian Couder
Message 9 of 38 in “What's cooking in git.git (Mar 2010, #01; Wed, 03)”
  1. Junio C HamanoMar 4, 2010
  2. Adam SimpkinsMar 4, 2010
  3. Björn GustavssonMar 4, 2010
  4. Junio C HamanoMar 4, 2010
  5. Tay Ray ChuanMar 4, 2010
  6. Junio C HamanoMar 4, 2010
  7. Junio C HamanoMar 4, 2010
  8. Junio C HamanoMar 5, 2010
  9. git reset --keep (Re: What's cooking in git.git (Mar 2010, #01; Wed, 03))Jonathan Nieder, Mar 5, 2010
  10. Christian CouderMar 5, 2010
  11. Christian CouderMar 5, 2010
  12. Thomas RastMar 4, 2010
  13. Mark LodatoMar 5, 2010
  14. Mark LodatoMar 5, 2010
  15. Junio C HamanoMar 5, 2010
  16. Add tests for git format-patch --to and format.to config optionMiklos Vajna, Mar 6, 2010
  17. Junio C HamanoMar 6, 2010
  18. format-patch --to: overwrite format.to contents, don't append itMiklos Vajna, Mar 6, 2010
  19. Stephen BoydMar 7, 2010
  20. Miklos VajnaMar 7, 2010
  21. Junio C HamanoMar 7, 2010
  22. Stephen BoydMar 7, 2010
  23. Junio C HamanoMar 7, 2010
  24. 0/4 format-patch and send-email ignoring config settingsStephen Boyd, Mar 7, 2010
  25. 0/3 format-patch and send-email ignoring config settingsStephen Boyd, Mar 7, 2010
  26. 1/3 format-patch: use a string_list for headersStephen Boyd, Mar 7, 2010
  27. 2/3 format-patch: add --no-cc, --no-to, and --no-add-headersStephen Boyd, Mar 7, 2010
  28. 3/3 send-email: add --no-cc, --no-to, and --no-bccStephen Boyd, Mar 7, 2010
  29. Junio C HamanoMar 9, 2010
  30. 1/4 send-email: actually add bcc headersStephen Boyd, Mar 7, 2010
  31. Stephen BoydMar 7, 2010
  32. 2/4 format-patch: use a string_list for headersStephen Boyd, Mar 7, 2010
  33. Erik Faye-LundMar 7, 2010
  34. Stephen BoydMar 7, 2010
  35. Johannes SchindelinMar 7, 2010
  36. 3/4 format-patch: add --no-cc, --no-to, and --no-add-headersStephen Boyd, Mar 7, 2010
  37. 4/4 send-email: add --no-cc, --no-to, and --no-bccStephen Boyd, Mar 7, 2010
  38. Steven DrakeMar 10, 2010

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.