git stash -> merge stashed change with current changes

匿名 (未验证) 提交于 2019-12-03 02:44:02

问题:

I made some changes to my branch and realized I forgot I had stashed some other necessary changes to said branch. What I want is a way to merge my stashed changes with the current changes.

Is there a way to do this?

Its more for convenience, I eventually gave up and committed first my current changes, then my stashed changes, but I would have preferred to get them in with one fell swoop.

回答1:

Running git stash pop or git stash apply is essentially a merge. You shouldn't have needed to commit your current changes unless the files changed in the stash are also changed in the working copy, in which case you would've seen this error message:

error: Your local changes to the following files would be overwritten by merge:        file.txt Please, commit your changes or stash them before you can merge. Aborting 

In that case, you can't apply the stash to your current changes in one step. You can commit the changes, apply the stash, commit again, and squash those two commits using git rebase if you really don't want two commits, but that may be more trouble that it's worth.



回答2:

I just discovered that if your uncommitted changes are added to the index (i.e. "staged", using "git add ..."), then "git stash apply" (and, presumably, "git stash pop") will actually do a proper merge. If there are no conflicts, you're golden. If not, resolve them as usual with "git mergetool", or manually with an editor.

To be clear, this is the process I'm talking about:

mkdir test-repo && cd test-repo && git init echo test > test.txt git add test.txt && git commit -m "Initial version"  # here's the interesting part:  # make a local change and stash it: echo test2 > test.txt git stash  # make a different local change: echo test3 > test.txt  # try to apply the previous changes: git stash apply # git complains "Cannot apply to a dirty working tree, please stage your changes"  # add "test3" changes to the index, then re-try the stash: git add test.txt git stash apply # git says: "Auto-merging test.txt" # git says: "CONFLICT (content): Merge conflict in test.txt" 

... which is probably what you're looking for.



回答3:

What I want is a way to merge my stashed changes with the current changes

Here is another option to do it:

git stash show -p|git apply git stash drop 

git stash show -p will show the patch of last saved stash. git apply will apply it. After the merge is done, merged stash can be dropped with git stash drop.



回答4:

As suggested by @Brandan, here's what I needed to do to get around

error: Your local changes to the following files would be overwritten by merge:        file.txt Please, commit your changes or stash them before you can merge. Aborting 

Follow this process:

git status  # local changes to `file` git stash list  # further changes to `file` we want to merge git commit -m "WIP" file git stash pop git commit -m "WIP2" file git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^ # mark the second commit to squash into the first using your EDITOR git reset HEAD^ 

And you'll be left with fully merged local changes to file, ready to do further work/cleanup or make a single good commit. Or, if you know the merged contents of file will be correct, you could write a fitting message and skip git reset HEAD^.



回答5:

Another option is to do another "git stash" of the local uncommitted changes, then combine the two git stashes. Unfortunately git seems to not have a way to easily combine two stashes. So one option is to create two .diff files and apply them both--at lest its not an extra commit and doesn't involve a ten step process :|

how to: https://stackoverflow.com/a/9658688/32453



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!