不能将存储应用于工作目录
我不能申请隐藏回工作目录。
小故事:
首先,我尝试推进一些有效的更改,但它说:“不,你不能,先拉”…好吧,我会从github拉东西,然后推我的变化。 当我试图拉扯,它说我有变化,将被过度写,我应该藏匿我的变化。 好吧,我藏了变化…做了拉,并推动提交的变化。 但是现在,我无法恢复正在进行的无法改变的变化。
这是错误的:
MyPath/File.cs already exists, no checkout Could not restore untracked files from stash
当然,我还没有理解git的所有概念,他们混淆了我一些…也许我做错了什么。
如果有人可以帮我解决这个问题,那将是非常好的…我一直在searchgoogle和所有内容,现在已经有一个多小时了,而且我还没有find解决scheme。
非常感谢帮助。 谢谢!
这听起来像你的藏匿包括未跟踪的文件,随后被添加到回购。 当你尝试检查出来,git正确地拒绝,因为它会覆盖现有的文件。
要解决这个问题,你可以做一些类似于删除这个文件的东西(没关系,它仍然在回购中),应用你的存储,然后用in-repo版本replace文件的存储版本。
编辑:这也有可能只是在工作树中创build的文件没有被添加到回购。 在这种情况下,不要简单地删除本地文件,而是:
- 把它移到其他地方
- 应用藏匿
- 手动合并两个文件版本(工作树与移动)。
正如@blahdiblah提到的那样,您可以手动删除正在抱怨的文件,切换分支,然后手动将其添加回来。 但我个人更喜欢留在“内部混帐”。
最好的办法是将存储转换为分支。 一旦它是一个分支,你可以使用正常的分支相关的技术/工具,你知道和喜欢在git中正常工作。 这实际上是一种有用的通用技术,即使在没有列出的错误的情况下也可以使用。 它运作良好,因为一个隐藏真的是一个承诺(见PS)。
将存储转换为分支
下面根据HEAD在创build存储时创build一个分支,然后应用存储(它不提交)。
git stash branch STASHBRANCH
使用“存储分支”
你下一步做什么取决于隐藏和你的目标分支(我将称之为ORIGINALBRANCH)的位置之间的关系。
选项1 – 通常重新存储分支(自存储以来大量更改)
如果您在ORIGINALBRANCH上做了很多改变,那么您可能最好像任何当地分公司那样对待STASHBRANCH。 在STASHBRANCH中提交您的更改,在ORIGINALBRANCH上对其进行重新绑定,然后切换到ORIGINALBRANCH并对其进行重新绑定/合并STASHBRANCH更改。 如果存在冲突,则通常处理它们(这种方法的一个优点是可以看到并解决冲突)。
选项2 – 重置原始分支以匹配存储(自存储以来有限的更改)
如果你只是在保留一些阶段性变化的情况下隐藏起来的话,那么所有你想要做的就是获得额外的变化,当你隐藏的时候你可以做下面的事情。 它会切换回原来的分支和索引而不会改变你的工作副本。 最终结果将是您的工作副本中额外的存储更改。
git symbolic-ref HEAD refs/heads/ORIGINALBRANCH git reset
背景
提交是提交喜欢分支/标签(而不是补丁)
PS,将存储想象成一个补丁是很诱人的(就像将补丁视为一个补丁一样),但是隐藏实际上是对HEAD创build时的提交。 当你申请/stream行时,你正在做一些类似樱桃采摘到你当前的分支。 请记住,分支和标签实际上只是提交的引用,所以在很多方面,存储,分支和标签都是指向提交(及其历史)的不同方式。
有时甚至在你还没有改变工作目录的时候也是需要的
PPS,你可能需要这种技术,只需使用–patch和/或–include-untracked。 即使没有改变工作目录,这些选项有时可以创build一个藏匿,你不能只是申请回来。 我必须承认不完全明白为什么。 参见http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html进行一些讨论。;
最安全和最简单的方法可能会再次藏起来:
git stash -u # This will stash everything, including unstaged files git stash pop stash@{1} # This will apply your original stash
之后,如果你对结果感到满意,你可以打电话
git stash drop
删除你的“安全”隐藏。
解决scheme:您需要删除有问题的文件,然后尝试隐藏popup/应用程序,它应该通过。 不要删除其他文件,只是错误提到的那些文件。
问题:有时候Git很糟糕。 当运行git stash -u
它包含未跟踪的文件(酷!),但它不会删除那些未跟踪的文件, 并不知道如何将残余的未跟踪文件应用于剩菜(不酷!),真正使-u
选项很无用。
我同样阻止popup操作是因为剩下的忽略文件(请参阅.gitignore文件)。 Git状态显示我跟踪和未跟踪,但我的活动并没有清理被忽略的文件。
详细信息:我曾经使用过git stash save -a
,检出了master以编译并看到原来的行为,然后试图把它全部回来继续编辑。 当我检查出我的分支,并试图popup,我忽略的文件仍然存在之前的存储保存。 那是因为master的签出只影响了提交的文件 – 它没有擦除被忽略的文件。 所以stream行失败了,本质上说它不想恢复我的藏匿的文件顶部仍然存在的文件。 不幸的是,我不知道怎样与他们开始合并会议。
最后,我用git clean -f -d -x
删除被忽略的文件。 有趣的是,在我的〜30,清理后仍有4个文件(埋在子目录中)。 我必须弄清楚他们在什么类别,他们必须手动删除。
然后我的stream行音乐成功了。
通过Git 2.14.x / 2.15(2017年第3季度), qwertzguy从2014年开始的解决scheme将不再是必需的。
在2017年第三季度之前,您必须删除有问题的文件,然后尝试隐藏stream行/再次申请。
随着下一个Git版本,你不必这样做。
见Nicolas Morey-Chaisemartin( nmorey
)的 提交bbffd87 (2017年8月11日) 。
(由Junio C gitster
合并- gitster
– in commit 0ca2f32 ,2017年8月23日)
stash
:重置前清理未跟踪的文件如果在包含文件的repo上调用
git stash -u
,由于当前修改了gitignore
文件,该文件将被隐藏,但不会从工作树中删除。
这是由于git-stash
首先进行reset --hard
,清除.gitignore
文件修改,然后调用git clean
,保持文件不变。
这会导致git stash pop
失败,因为该文件存在 。这个补丁简单地在清理和重置之间切换顺序,并为这个用例添加一个testing。
遵循存储的最安全的方法
git stash -u
这将包括所有包括暂时的变化
混帐藏匿下降
完成后,删除你的“安全”隐藏。
git stash show --patch | patch -p1
其他解决scheme
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