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

tools for easily "uncommitting" parts of a patch I just commited?

From
Jacob Keller <jacob.keller@gmail.com>
Date
Oct 19, 2016, 22:26 UTC
Message-ID
<CA+P7+xqFOn4NSfZ2zpa_y1za3uHZrGGG3ktEtuOcvJLCrAYUhQ@mail.gmail.com>
Hi,

I recently (and in the past) had an issue where I was using git add --interactive and accidentally did something like the following:

# hack lots of randmo changes, then begin trying to commit then separately git add -i # set only the changes I want # accidentally add <file> to the commit $git commit -s <file> # type up a long commit message # notice that I committed everything

At this point I'd like to be able to do something like: $git unstage -i # select each hunk to unstage

and end up with a commit that only has what I originally wanted, without having to re-write the commit message, nor having to do a lot of weird things, or anything.

I can ofcourse use reset HEAD^ and lose my commit message, but then I'd have to retype that out or copy paste it from somewhere else.

I ended up doing something like:

# save the current tree $git rev-parse HEAD >savetree # checkout the old files and re-write $git checkout HEAD^ <file> # update commit removing all changes from this file $git commit --allow-empty --amend <file> # now checkout the tree again to the contents of the saved tree $git checkout $(cat savetree) <file> # now add only the parts I wanted before $git add -i # finally amend the commit $git commit --amend

That's a lot of steps and forces me to save my own file.
I thought of a few alternatives:
1. Create an advice setting which basically allows me to say "git,
please prevent me from staging files + an index if the files I marked
also conflict with paths already added to the index, maybe unless I
passed a force option"
or
2. somehow streamline the process of what I did above so I could just
do something like:
git commit --amend --set-tree=HEAD^

which would force the commit tree up one and avoid the double checkout stuff, without actually changing my checked out copy at all

Then I'd be able to quickly re-add what I wanted.
3. somehow allow an unstage option.

So for the TL;DR; .. does anyone know of any tools which would help automate the process so I could simply do

"git uncommit -i" and run a tool just like git add interactive or git add -p?

Thanks, Jake

Next: Jeff King
Message 1 of 16 in “tools for easily "uncommitting" parts of a patch I just commited?”
  1. Jacob KellerOct 19, 2016
  2. Jeff KingOct 19, 2016
  3. Jacob KellerOct 19, 2016
  4. Jeff KingOct 20, 2016
  5. Jacob KellerOct 20, 2016
  6. Junio C HamanoOct 20, 2016
  7. Jacob KellerOct 20, 2016
  8. Junio C HamanoOct 20, 2016
  9. Jacob KellerOct 20, 2016
  10. Junio C HamanoOct 20, 2016
  11. Jacob KellerOct 20, 2016
  12. Lukas FleischerOct 22, 2016
  13. Jacob KellerOct 23, 2016
  14. Duy NguyenOct 23, 2016
  15. Jeff KingOct 23, 2016
  16. Duy NguyenOct 23, 2016

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.