Answers:
我刚刚发现,如果将您未提交的更改添加到索引中(即使用进行了“暂存” git add ...
),则git stash apply
(并且大概是git stash pop
)实际上将进行正确的合并。如果没有冲突,那您就是金。如果不是,请使用正常解决问题git mergetool
,或使用编辑器手动解决。
明确地说,这是我正在谈论的过程:
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"
...这可能就是您要寻找的。
跑git add
第一。
git stash apply --force
什么。
git add .
,git stash apply
然后git reset
将隐藏应用于我的工作更改并合并而不必进行提交。
运行git stash pop
或git stash apply
本质上是合并。除非隐藏文件中更改的文件在工作副本中也被更改,否则您不需要提交当前更改,在这种情况下,您将看到以下错误消息:
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 rebase
如果您确实不希望进行两次提交,则可以提交更改,应用存储,再次提交并压缩这两个提交,但这可能更麻烦,值得这样做。
git commit --amend
。
我想要的是一种将隐藏的更改与当前更改合并的方法
这是另一种选择:
git stash show -p|git apply
git stash drop
git stash show -p
将显示最后保存的隐藏补丁。git apply
将应用它。合并完成后,可以使用删除合并的存储git stash drop
。
git stash pop
在合并完全适用的情况下不这样做……
git stash show -p --no-color | git apply --3way
(--3way
=如果补丁失败,则退回到三路合并)。
git stash show -p
将通过合并git apply
,如果可能的话不会发生冲突。
正如@Brandan所建议的那样,这是我需要解决的问题
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^
您将剩下对的完全合并的本地更改file
,准备进行进一步的工作/清理或进行单个良好的提交。或者,如果您知道的合并内容file
正确,则可以编写适当的消息并跳过git reset HEAD^
。
另一种选择是对本地未提交的更改执行另一个“ git stash”,然后合并两个git stash。不幸的是,git似乎没有办法轻松地合并两个存储。因此,一种选择是创建两个.diff文件并同时应用它们-至少这不是额外的提交,并且不涉及十个步骤: