无法将存储应用于工作目录

Miguel Angelo 89 git git-stash

我无法将存储应用回工作目录.

小故事:

首先,我试图推动一些改变,但它说:"不,你不能,先拉"...好吧,然后,我会从github拉出东西,然后推动我的改变.当我试图拉动时,它说我的变化会被过度写,我应该把我的变化藏起来.好吧,我隐藏了变化......做了拉动,并推动了提交的更改.但现在,我无法恢复我正在进行的未经修改的变化.

这是错误:

MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash

当然我还没有理解git的所有概念,他们让我有点困惑......也许我做错了什么.

如果有人可以帮我解决这个问题会很棒...我现在一直在搜索谷歌和所有东西超过一个小时,我还没有找到解决方案.

非常感谢帮助.谢谢!

blahdiblah.. 72

这听起来像你的藏匿包括一个未跟踪的文件,后来被添加到仓库.当你尝试检查出来时,git正确拒绝,因为它会覆盖现有文件.

要修复,你可以做一些事情,比如删除那个文件(没关系,它仍然在repo中),应用你的存储,然后根据需要用in-repo版本替换文件的存储版本.

编辑:文件也可能只在工作树中创建,没有添加到仓库中.在这种情况下,不要简单地删除本地文件,而是:

  1. 把它移到其他地方
  2. 应用藏匿处
  3. 手动合并两个文件版本(工作树与移动).

  • 虽然答案是有效的,但我真的不确定git是否"正确".文件位于repo中,因此不存在数据丢失的危险.为什么不直接应用这些变化呢?看到这个帖子 - http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html (8认同)
  • 我认为这个答案不是最有帮助的.`git stash`应该有助于快速备份本地更改.手动删除一组文件以恢复它会中断流程.另一个答案中的`git stash branch`方法听起来更好,但仍然比预期更加手动. (4认同)
  • 有什么办法我可以避免将来存放东西......我来自SVN,它看起来如此向前......你只是更新,解决冲突,然后提交.Git不能那么难,我需要在循环中添加两个步骤.再次感谢! (2认同)
  • @Miguel:Stashing不是*障碍.它是Git提供的一个额外工具,它允许您改进工作流程并避免冲突和不洁净的提交.http://git-scm.com/docs/git-stash (2认同)

Koraktor.. 55

最安全,最简单的方法可能是再次收藏:

git stash -u             # This will stash everything, including unstaged files
git stash pop stash@{1}  # This will apply your original stash

之后,如果您对结果感到满意,可以致电

git stash drop

删除你的"安全"存储.

  • stash pop将应用并删除您原来的藏匿处.只是为了安全使用`apply`而不是`pop`. (9认同)
  • 事实上,`pop`是`apply`和`drop`的组合,但只有`apply`才能没有冲突地工作.但是,"apply"通常更安全. (2认同)
  • 这假设您要保留的工作目录中没有其他更改.对于这个特殊的问题,他暗示(但没有明确说出)他处于一个干净的状态,但是我想指出那些来到这里的地方变化的人. (2认同)

studgeek.. 54

正如@blahdiblah所提到的,您可以手动删除它所抱怨的文件,切换分支,然后手动添加它们.但我个人更喜欢留在"内部git".

执行此操作的最佳方法是将存储转换为分支.一旦它成为一个分支,你就可以使用你熟悉和喜爱的常规分支相关技术/工具在git中正常工作.即使您没有列出错误,这实际上也是一种有用的常用技术.它运作良好,因为存储确实是一个隐藏的承诺(见PS).

将存储转换为分支

以下内容在创建存储时创建基于HEAD的分支,然后应用存储(它不提交存储).

git stash branch STASHBRANCH

使用"藏匿分支"

你接下来要做什么取决于藏匿处和目标分支(我将称之为ORIGINALBRANCH)之间的关系.

选项1 - 正常重新存储存储分支(自存储以来的许多更改)

如果您在ORIGINALBRANCH中进行了很多更改,那么您可能最好像任何本地分支一样处理STASHBRANCH.在STASHBRANCH中提交您的更改,在ORIGINALBRANCH上重新绑定它,然后切换到ORIGINALBRANCH并重新绑定/合并STASHBRANCH对它的更改.如果存在冲突,则正常处理它们(此方法的一个优点是您可以查看并解决冲突).

选项2 - 重置原始分支以匹配存储(自存储以来的有限更改)

如果你只是在保留一些阶段性更改时被隐藏,然后提交,而你想要做的就是获得额外的更改,当你被隐藏时,你可以执行以下操作.它将切换回原始分支和索引,而不会更改您的工作副本.最终结果将是您的工作副本中的其他隐藏更改.

git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset

背景

Stashes是像树枝/标签(不是补丁)的提交

PS,很容易将存储视为一个补丁(就像它很容易将提交视为补丁一样),但存储实际上是在创建时对HEAD的提交.当您应用/弹出时,您正在做类似于将其挑选到当前分支中的内容.请记住,分支和标记实际上只是对提交的引用,因此在许多方面,stashes,branches和tags只是指向提交(及其历史记录)的不同方式.

即使您没有进行工作目录更改,有时也需要

PPS,在使用带有--patch和/或--include-untracked的存储之后,您可能需要这种技术.即使不更改工作目录,这些选项有时也会创建一个您不能仅仅应用的存储.我必须承认不完全理解为什么.有关讨论,请参见http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html.

  • 如果您遇到这种情况,"git stash branch STASHBRANCH"似乎不起作用(与pop一样出现完全相同的错误消息).您可能需要事先进行一些git重置. (8认同)
  • 这个答案应该标记为解决方案,因为它提供了有关如何最有效地解决"锁定存储"的最有用的指示.也许通过首先提到"简单删除解决方案"并将分支解决方案作为第二选项来改进它. (4认同)

qwertzguy.. 39

解决方案:你需要删除有问题的文件,然后尝试再次存储弹出/应用,它应该通过.不要删除其他文件,只删除错误提到的文件.

问题: Git有时很糟糕.当git stash -u它运行时包括未跟踪的文件(酷!)但它不会删除那些未跟踪的文件,也不知道如何在剩余的顶部应用隐藏的未跟踪文件(不酷!),这真的使-u选项相当无用.

  • 如果这是我的问题,我会接受这个答案.谢谢@qwertzguy,你的答案解决了我的问题, (3认同)
  • _"它不会删除那些未跟踪的文件"_ ...并且不会在`git stash show`中列出它们.这个答案让灯泡继续下去. (2认同)
  • 加上Git有时很烂。 (2认同)

小智.. 27

要将存储中的代码差异作为补丁应用,请使用以下命令:

git stash show --patch | patch -p1

  • 通常最好解释一个解决方案,而不是仅发布一些匿名代码行.您可以阅读[如何撰写一个好的答案](/sf/ask/17360801/),以及[完全解释基于代码的答案](https://meta.stackexchange.com /问题/ 114762 /解释-entirely-%E2%80%8C%E2%80%8Bcode基于-答案). (8认同)