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