git stash pop会盲目地覆盖本地更改还是将它们与本地更改合并?
如果合并,则可能存在合并冲突。有没有办法提前知道,使用--dry-run或其他方法会有合并冲突?
我可以找到--dry-run使用git fetch和git push但不能使用git stash pop。
编辑在几个答案之后专门解释问题 -
我有一种情况,我有一个大约几天的git藏匿处。 git stash完成之后,本地分支已被修改。这意味着,本地文件和存储文件之间存在差异(跟踪所有文件,并且在存储或本地分支中没有未跟踪的文件)。
问题是,我猜,一旦我执行git stash apply,在复杂的合并操作情况下本地更改将处于冲突状态,因此无法撤消(因为没有撤消合并操作)。 git checkout不会有帮助,因为本地分支有本地更改。我的理解是否正确?
在进行git stash apply之前,我想先做一个干运行才能看到结果。 所以,在我做任何事情并稍后哭泣之前,我想找到一个解决这个问题的优雅方案。
答案 0 :(得分:6)
是不是可以用干跑git stash pop?
我不确定干跑,但你可以apply
藏匿而不是pop
它(保留藏匿的副本,以防更改不适合,并且您希望稍后再应用它们):
git stash apply
然后观看结果,如果您不喜欢它们,只需checkout
对先前状态的更改,或将冲突解决为ours
。否则,它们的更改都没问题,将它们解析为theirs
。
git stash apply
不会覆盖未跟踪的文件(在您提交未提交的文件之前,它将自动应用)。换句话说,git stash pop/apply
是一个安全的过程,不会导致任何数据丢失。
我想,一旦我执行git stash apply,本地更改将处于冲突状态。
不,这不会发生,但如果您提交了更改。即,无论如何,本地更改不会被覆盖或丢失。 Git会抱怨你的更改必须在你申请藏匿之前提交。看到这个,这里我尝试应用stash,其中我的一个更改没有被提交(并且它们将受到存储数据的影响):
错误:合并将覆盖对以下文件的本地更改:
file.txt的
请在合并之前提交更改或存储更改 中止
当你提交它们时,是的,你将能够应用存储,在这里你可能会遇到冲突。
因为没有撤消合并操作
当然有,只需恢复合并提交:git revert --no-commit <MergeCommitHash>
。
同样,我确认git stash apply
是安全流程。它将拒绝覆盖任何未经修改的更改(即,您可以安全地丢失任何数据),如果您合并,并且结果不正常,只需还原合并提交。
如果还有什么不清楚,我会尽力帮助你。
答案 1 :(得分:1)
Git通常会尽可能地保护您的本地更改。这适用于检查更改以及应用stashes。如果您尝试应用可能影响具有本地未更改的更改的文件中的更改的存储,您将收到以下错误消息:
error: Your local changes to the following files would be overwritten by merge:
conflicting-file.ext
Please commit your changes or stash them before you merge.
Aborting
因此,您可以安全地尝试应用存储,看看它是否会成功。
话虽这么说,当没有本地uncommited 更改时,应用stashes 将尝试将更改与当前版本合并。执行此操作时,可能会发生合并冲突,然后您必须手动解决。
通常,这不是问题,但在使用git stash pop
时存在一个问题:git stash pop
将应用存储,可能导致合并冲突,然后删除存储。如果您在解决合并冲突时遇到问题,那么您可能希望能够回顾原来的存储,然后您就无法做到这一点。
所以我总是建议你使用git stash apply
代替,这只会应用存储但保留它。然后,当成功应用存储并且您已成功解决任何可能的合并冲突时,您可以使用git stash drop
删除存储。因此,这是git stash pop
的安全替代方案。