I\'d like to know if it is possible to extract a single file or diff of a file from a git stash without popping the stash changeset off.
Might anyone be able to prov
Edit: See cambunctious's answer, which is basically what I now prefer because it only uses the changes in the stash, rather than comparing them to your current state. This makes the operation additive, with much less chance of undoing work done since the stash was created.
To do it interactively, you would first do
git diff stash^! -- path/to/relevant/file/in/stash.ext perhaps/another/file.ext > my.patch
...then open the patch file in a text editor, alter as required, then do
git apply < my.patch
cambunctious's answer bypasses the interactivity by piping one command directly to the other, which is fine if you know you want all changes from the stash. You can edit the stash^! to be any commit range that has the cumulative changes you want (but check over the output of the diff first).
If applying the patch/diff fails, you can change the last command to git apply --reject which makes all the changes it can, and leaves .rej files where there are conflicts it can;r resolve. The .rej files can then be applied using wiggle, like so:
wiggle --replace path/to/relevant/file/in/stash.ext path/to/relevant/file/in/stash.ext.rej
This will either resolve the conflict, or give you conflict markers that you'd get from a merge.
Previous solution: There is an easy way to get changes from any branch, including stashes:
$ git checkout --patch stash@{0} path/to/file
You may omit the file spec if you want to patch in many parts. Or omit patch (but not the path) to get all changes to a single file. Replace 0 with the stash number from git stash list, if you have more than one. Note that this is like diff, and offers to apply all differences between the branches. To get changes from only a single commit/stash, have a look at git cherry-pick --no-commit.