我无法将存储重新应用到工作目录。
小故事:
首先,我试图推动一些改变,但它说:“不,你不能,先拉”......好吧,我会从github拉出东西,然后推动我的改变。当我试图拉动时,它说我的变化会被过度改写,而且我应该保留我的变化。好吧,我隐藏了变化......做了拉动,并推动了提交的更改。但是现在,我无法恢复我正在进行的未经修改的变化。
这是错误:
MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash
当然我还不了解git的所有概念,他们让我有点困惑......也许我做错了。
如果有人可以帮我解决这个问题会很棒...我现在一直在搜索Google和所有内容超过一个小时了,我还没有找到解决方案。
非常感谢帮助。谢谢!
答案 0 :(得分:71)
听起来你的藏匿包含一个未跟踪的文件,后来被添加到了回购邮件中。当你尝试检查出来时,git正确拒绝,因为它会覆盖现有文件。
要修复,你可以做一些事情,比如删除那个文件(没关系,它仍然在repo中),应用你的存储,然后用适当的in-repo版本替换文件的存储版本。
编辑:也可能只在工作树中创建了文件而没有将添加到repo中。在这种情况下,不要简单地删除本地文件,而是:
答案 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)之间的关系。
如果您在ORIGINALBRANCH中进行了很多更改,那么您可能最好像任何本地分支一样处理STASHBRANCH。在STASHBRANCH中提交您的更改,在ORIGINALBRANCH上将其重新绑定,然后切换到ORIGINALBRANCH并重新绑定/合并STASHBRANCH对其的更改。如果存在冲突,则通常处理它们(此方法的一个优点是您可以查看并解决冲突)。
如果你只是在保留一些阶段性更改时被隐藏,那么你已经做了,而你想要做的就是获得额外的更改,这些更改不会在你发布的时候暂存,你可以执行以下操作。它将切换回原始分支和索引,而不会更改您的工作副本。最终结果将是您的工作副本中的其他隐藏更改。
git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
git reset
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 bbffd87见Nicolas 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
完成工作后,删除“安全”存储。