Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stash only one file out of multiple files that have changed with Git?

Tags:

git

git-stash

How can I stash only one of multiple changed files on my branch?

like image 542
Rachel Avatar asked Jun 14 '10 20:06

Rachel


People also ask

Can you git stash just one file?

To stash a specific file, use the “git stash push” command and specify the file you want to stash. However, the other tracked files that may be modified in your current working directory are untouched.

How do I stash only staged changes in git?

Stage all your files that you need to stash. Run git stash --keep-index . This command will create a stash with ALL of your changes (staged and unstaged), but will leave the staged changes in your working directory (still in state staged). Now your "good stash" has ONLY staged files.

Can you stash multiple changes in git?

If you want to git stash pop twice because you want both stashes in the same commit but you encounter "error: Your local changes to the following files would be overwritten by merge:" on your 2nd git stash pop , then you can: 1) git stash pop , 2) git add . , and 3) git stash pop . This helped me.

How do I stash all my files except one?

You can stage the file you want to preserve by doing git add <file> and then use git stash push --keep-index . This will stash everything but staged files.


2 Answers

git stash push -p -m "my commit message" 

-p let's you select the hunks that should be stashed; whole files can be selected as well.

You'll be prompted with a few actions for each hunk:

   y - stash this hunk    n - do not stash this hunk    q - quit; do not stash this hunk or any of the remaining ones    a - stash this hunk and all later hunks in the file    d - do not stash this hunk or any of the later hunks in the file    g - select a hunk to go to    / - search for a hunk matching the given regex    j - leave this hunk undecided, see next undecided hunk    J - leave this hunk undecided, see next hunk    k - leave this hunk undecided, see previous undecided hunk    K - leave this hunk undecided, see previous hunk    s - split the current hunk into smaller hunks    e - manually edit the current hunk    ? - print help 
like image 72
konrad.kruczynski Avatar answered Sep 18 '22 15:09

konrad.kruczynski


Disclaimer: the following answer is for git before git 2.13. For git 2.13 and over, check out another answer further down.


Warning

As noted in the comments, this puts everything into the stash, both staged and unstaged. The --keep-index just leaves the index alone after the stash is done. This can cause merge conflicts when you later pop the stash.


This will stash everything that you haven't previously added. Just git add the things you want to keep, then run it.

git stash --keep-index 

For example, if you want to split an old commit into more than one changeset, you can use this procedure:

  1. git rebase -i <last good commit>
  2. Mark some changes as edit.
  3. git reset HEAD^
  4. git add <files you want to keep in this change>
  5. git stash --keep-index
  6. Fix things up as necessary. Don't forget to git add any changes.
  7. git commit
  8. git stash pop
  9. Repeat, from #5, as necessary.
  10. git rebase --continue
like image 42
bukzor Avatar answered Sep 20 '22 15:09

bukzor