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

时间:2012-05-09 01:55:32

标签: git git-stash

我无法将存储重新应用到工作目录。

小故事:

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

这是错误:

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

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

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

非常感谢帮助。谢谢!

9 个答案:

答案 0 :(得分:71)

听起来你的藏匿包含一个未跟踪的文件,后来被添加到了回购邮件中。当你尝试检查出来时,git正确拒绝,因为它会覆盖现有文件。

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

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

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

答案 1 :(得分:52)

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

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

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

git stash drop

删除“安全”存储。

答案 2 :(得分:52)

如@blahdiblah所述,您可以手动删除它所抱怨的文件,切换分支,然后手动添加它们。但我个人更喜欢留在“内部”。

执行此操作的最佳方法是将存储转换为分支。一旦它成为一个分支,你就可以使用你熟悉和喜爱的常规分支相关技术/工具在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

答案 3 :(得分:39)

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

问题: Git有时很糟糕。运行git stash -u时,它包含未跟踪的文件(很酷!)但删除那些未跟踪的文件,而知道如何在顶部应用隐藏的未跟踪文件残羹剩饭(不酷!),这真的使-u选项变得毫无用处。

答案 4 :(得分:22)

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

git stash show --patch | patch -p1

答案 5 :(得分:0)

这件事对我来说已经发生过很多次,我用Declare @List varchar(max) = '439,5000,...' Select A.* From Inventroy A Join ( Select Value = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) From (values (Cast('<x>' + replace(@List,',','</x><x>')+'</x>' as xml) )) A(x) Cross Apply x.nodes('x') AS B(i) ) B On charindex(B.Value,A.RowKey)>0 存放了未跟踪的文件,这些文件最终被添加到了仓库中,我无法再应用已隐藏的更改。

我找不到强制git stash -u替换文件的方法,因此我首先删除了已隐藏的未跟踪文件的本地副本(请小心,因为它将删除所有未更改的文件'未提交),然后应用隐藏的更改:

git stash pop/apply

最后,如果缺少某些内容,我将使用rm `git ls-tree -r stash@{0}^3 --name-only` git stash apply git status和其他工具检查并添加已删除文件中的部分内容。


如果您要保留未提交的更改,则可以先创建一个临时提交:

git diff

使用适合您的工具将先前提交的更改合并回本地文件,并删除虚拟提交:

git add --all
git commit -m "dummy"
rm `git ls-tree -r stash@{0}^3 --name-only`
git stash apply

答案 6 :(得分:-1)

其他解决方案:

cd to/root/your/project

# Show what git will be remove
git clean -n

# If all is good
git clean -f

# If not all is good, see
git clean --help

# Finish
git stash pop

答案 7 :(得分:-1)

使用Git 2.14.x / 2。15(2017年第3季度),2014年的qwertzguy&#39; solution将不再需要。

2017年第三季度之前,你必须删除有问题的文件,然后尝试再次存储pop / apply 在下一个Git版本中,您不必这样做。

commit bbffd87Nicolas Morey-Chaisemartin (nmorey)(2017年8月11日) (由Junio C Hamano -- gitster --合并于commit 0ca2f32,2017年8月23日)

  

stash:在重置之前清除未跟踪的文件

     

如果在包含不是的文件的repo上调用git stash -u   由于gitignore文件的当前修改而被忽略,   此文件被隐藏但未从工作树中删除   这是因为git-stash首先执行reset --hard清除了.gitignore   git clean文件修改,然后调用git stash pop,保留文件   不变。
  由于文件存在,导致{{1}}失败。

     

此补丁只是在清理和重置之间切换顺序   并为此用例添加测试。

答案 8 :(得分:-1)

遵守存款的最安全方式

git stash -u

这将隐藏所有包括非分段更改

git stash drop

完成工作后,删除“安全”存储。