Git 为什么可以';是否将存储应用于工作目录?

Git 为什么可以';是否将存储应用于工作目录?,git,git-stash,Git,Git Stash,我无法将隐藏应用回工作目录 小故事: 首先,我试图推动一些承诺的改变,但它说:“不,你不能,先拉”。。。好吧,我将从GitHub中提取内容,然后推动我的更改。当我尝试拉取时,它说我有将被覆盖的更改,并且我应该隐藏我的更改。好的,我把变化藏起来了。。。执行拉、推提交的更改。但是现在,我无法恢复我正在进行的未提交的更改 这就是错误: 当然我还不了解git的所有概念,它们让我有点困惑。。。也许我做错了什么 如果有人能帮我解决这个问题就太好了。。。我已经搜索谷歌和所有东西一个多小时了,但我还没有找到解决

我无法将隐藏应用回工作目录

小故事:

首先,我试图推动一些承诺的改变,但它说:“不,你不能,先拉”。。。好吧,我将从GitHub中提取内容,然后推动我的更改。当我尝试拉取时,它说我有将被覆盖的更改,并且我应该隐藏我的更改。好的,我把变化藏起来了。。。执行拉、推提交的更改。但是现在,我无法恢复我正在进行的未提交的更改

这就是错误:

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

如果有人能帮我解决这个问题就太好了。。。我已经搜索谷歌和所有东西一个多小时了,但我还没有找到解决办法


非常感谢你的帮助。谢谢

听起来你的藏品中包含了一个未跟踪的文件,该文件随后被添加到回购协议中。当您尝试签出它时,git正确地拒绝了,因为它将覆盖现有文件

要修复此问题,您可以执行一些操作,例如删除该文件(没关系,它仍在repo中)、应用您的存储,然后根据需要将文件的存储版本替换为repo中的版本

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

  • 把它搬到别的地方去
  • 使用藏匿物
  • 手动合并两个文件版本(工作树与移动)

  • 最安全、最简单的方法可能是再次藏匿物品:

    git stash -u             # This will stash everything, including unstaged files
    git stash pop stash@{1}  # This will apply your original stash
    
    之后,如果你对结果满意,你可以打电话

    git stash drop
    

    要删除您的“安全”存储。

    正如@bentolo所提到的,您可以手动删除它抱怨的文件,切换分支,然后手动将它们添加回。但我个人更喜欢“在git内”

    最好的方法是将存储转换为分支。一旦它成为一个分支,您就可以使用您熟悉和喜爱的与分支相关的技术/工具在git中正常工作。这实际上是一种有用的通用技术,即使在没有列出的错误的情况下也可以使用隐藏。它工作得很好,因为隐藏实际上是一种隐藏的提交(参见PS)

    将存储转换为分支 以下内容在创建隐藏时基于头创建一个分支,然后应用该隐藏(它不提交)

    与“藏匿处”合作 下一步要做什么取决于存储和目标分支(我称之为ORIGINALBRANCH)现在所在位置之间的关系

    选项1-正常重新设置隐藏分支的基础(自隐藏以来发生了大量变化) 如果你在原来的分支机构中做了很多改变,那么你可能会像对待任何本地分支机构一样对待STASHBRANCH。在StathBranch中提交您的更改,在ORIGINALBRANCH上重新设置其基础,然后切换到ORIGINALBRANCH并在其上重新设置/合并StathBranch更改。如果存在冲突,则正常处理(这种方法的优点之一是您可以看到并解决冲突)

    选项2-重置原始分支以匹配隐藏(自隐藏后的有限更改) 如果您只是在保留某些暂存更改的同时进行了隐藏,然后提交,并且您所要做的就是获取在隐藏时未暂存的其他更改,那么您可以执行以下操作。它将切换回原始分支和索引,而不更改工作副本。最终结果将是在工作副本中额外隐藏更改

    git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
    git reset
    
    背景 隐藏是分支/标记(不是补丁) PS,将隐藏视为补丁很有诱惑力(就像将提交视为补丁一样),但隐藏实际上是创建时针对头部的提交。当你申请/弹出时,你正在做一些类似于cherry的事情,将其挑选到你当前的分支中。请记住,分支和标记实际上只是对提交的引用,因此在许多方面,隐藏、分支和标记只是指向提交(及其历史)的不同方式

    有时需要,即使您尚未更改工作目录 PPS,您可能需要这种技术,只需将stash与--patch和/或--include untracked一起使用即可。即使不更改工作目录,这些选项有时也会创建一个隐藏,而您不能直接应用回。我必须承认我不完全明白为什么。有关讨论,请参阅。

    解决方案:您需要删除有问题的文件,然后再次尝试隐藏pop/apply,它应该会通过。不要删除其他文件,只删除错误中提到的文件

    问题是:Git有时很烂。当运行
    git stash-u
    时,它包含未跟踪的文件(很酷!),但不会删除这些未跟踪的文件,也不知道如何在剩余文件(不酷!)上应用隐藏的未跟踪文件,这确实使得
    -u
    选项毫无用处。

    其他解决方案:

    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
    

    我类似的阻塞pop操作是因为剩余的忽略了文件(请参见.gitignore文件)。Git状态显示我被跟踪和未跟踪,但我的活动没有清理被忽略的文件

    详细信息:我使用了
    git stash save-a
    ,检查了主程序以进行编译并查看原始行为,然后尝试将其全部放回继续编辑。当我签出我的分支并尝试弹出时,我忽略的文件仍然存在于隐藏保存之前。这是因为主文件的签出只影响已提交的文件——它不会擦除被忽略的文件。所以pop失败了,本质上是说它不想在仍然存在的文件上恢复我隐藏的被忽略的文件。不幸的是,我无法找到一种方法来启动与他们的合并会话

    最终,我使用了
    gitclea
    
    git symbolic-ref HEAD refs/heads/ORIGINALBRANCH
    git reset
    
    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
    
    git stash show --patch | patch -p1
    
    rm `git ls-tree -r stash@{0}^3 --name-only`
    git stash apply
    
    git add --all
    git commit -m "dummy"
    rm `git ls-tree -r stash@{0}^3 --name-only`
    git stash apply
    
    git reset HEAD~1