不能将存储应用于工作目录

我不能申请隐藏回工作目录。

小故事:

首先,我尝试推进一些有效的更改,但它说:“不,你不能,先拉”…好吧,我会从github拉东西,然后推我的变化。 当我试图拉扯,它说我有变化,将被过度写,我应该藏匿我的变化。 好吧,我藏了变化…做了拉,并推动提交的变化。 但是现在,我无法恢复正在进行的无法改变的变化。

这是错误的:

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

当然,我还没有理解git的所有概念,他们混淆了我一些…也许我做错了什么。

如果有人可以帮我解决这个问题,那将是非常好的…我一直在searchgoogle和所有内容,现在已经有一个多小时了,而且我还没有find解决scheme。

非常感谢帮助。 谢谢!

这听起来像你的藏匿包括未跟踪的文件,随后被添加到回购。 当你尝试检查出来,git正确地拒绝,因为它会覆盖现有的文件。

要解决这个问题,你可以做一些类似于删除这个文件的东西(没关系,它仍然在回购中),应用你的存储,然后用in-repo版本replace文件的存储版本。

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

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

正如@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