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"
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
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
请遵循以下流程:
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^
9条答案
按热度按时间zfciruhq1#
tl;dr
首先运行
git add
。我刚刚发现,如果将未提交的更改添加到索引中(即“staged”,使用
git add ...
),那么git stash apply
(和,大概,git stash pop
)实际上会进行正确的合并。如果没有冲突,你就是黄金。如果没有,请像往常一样使用git mergetool
或使用编辑器手动解决它们。说清楚点,这就是我说的过程:
……这可能就是你要找的。
siv3szwd2#
运行
git stash pop
或git stash apply
本质上是一次合并。你不应该需要提交当前的更改,除非在stash中更改的文件也在工作副本中更改,在这种情况下,你会看到这个错误消息:在这种情况下,您不能一步将stash应用到当前更改。如果你真的不想两次提交,你可以提交修改,应用stash,再次提交,然后使用
git rebase
压缩这两次提交,但这可能会带来更多的麻烦。ruyhziif3#
我想要的是一种将我隐藏的更改与当前更改合并的方法
这里是另一个选项来做到这一点:
git stash show -p
将显示最后保存的stash的补丁。git apply
将应用它。合并完成后,可以使用git stash drop
删除合并的stash。fkvaft9z4#
我做这件事的方法是先
git add
,然后git stash apply <stash code>
。这是最简单的方法。ne5o7dgx5#
你可以很容易地
1.提交当前更改
1.释放你的隐藏和解决冲突
1.提交来自stash的更改
1.软重置为您正在进入的提交(上次正确提交)
xriantvc6#
正如@Brandan所建议的,以下是我需要做的事情
请遵循以下流程:
您将得到对
file
的完全合并的 * 本地 * 更改,准备做进一步的工作/清理或进行一次良好的提交。或者,如果您知道file
的合并内容是正确的,您可以编写一条合适的消息并跳过git reset HEAD^
。b5buobof7#
也许,这不是最坏的主意合并(通过difftool)从...是的...分支!
dba5bblo8#
我找到了另一个解决办法。您可以提交当前打开的更改,然后弹出隐藏,然后软重置到上次提交之前。
kmpatx3s9#
另一种选择是对本地未提交的更改执行另一个“git stash”,然后合并两个git stash。不幸的是,git似乎没有一种方法可以轻松地合并两个stash。因此,一个选择是创建两个.diff文件并同时应用它们--至少这不是一个额外的提交,也不涉及十个步骤的过程:|
如何:https://stackoverflow.com/a/9658688/32453