Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';git stash apply';上演我的改变?_Git - Fatal编程技术网

为什么';git stash apply';上演我的改变?

为什么';git stash apply';上演我的改变?,git,Git,我做了一个更改,然后我git stash然后我git stash apply 我的问题是 为什么在我git stash apply之后,我的更改变为“暂存”?i、 e.如果我执行git diff,我将看不到任何东西,我只看到我执行git diff--cached时的差异 是否仍然可以通过git stash apply命令“取消显示”我的更改 是否有任何git命令基本上允许我“备份我的更改,将其重置为头部并将我的备份复制回来”?我想,git stash然后,git stash apply就是这个命

我做了一个更改,然后我
git stash
然后我
git stash apply

我的问题是

  • 为什么在我
    git stash apply
    之后,我的更改变为“暂存”?i、 e.如果我执行
    git diff
    ,我将看不到任何东西,我只看到我执行
    git diff--cached
    时的差异

  • 是否仍然可以通过
    git stash apply
    命令“取消显示”我的更改

  • 是否有任何git命令基本上允许我“备份我的更改,将其重置为头部并将我的备份复制回来”?我想,
    git stash
    然后,
    git stash apply
    就是这个命令,但是它是如何“暂存”我所有的更改的呢?是否有任何等价物允许我在不使用“我的更改”部分的情况下应用
    git stash


  • 如果您发现您的更改被意外转移,请执行以下操作:

    git reset HEAD
    
    我通常只在应用隐藏的更改时出现冲突时才会看到这一点。在执行
    git重置
    之前,您需要检查情况是否如此


    git stash
    命令是最适合您的用例的命令。我一直使用它就是为了这个目的。

    我认为您的配置可能有问题,因为在重置为最新提交之前,
    git stash
    记录索引和工作树的状态,
    git stash apply
    仅当使用
    --index
    选项时,才应尝试恢复索引的状态

    一个可能的混淆点是,如果您有冲突(即,由于存储应用于另一个提交,而受存储影响的文件自提交后已更改),则如果您使用
    mergetool
    解决冲突,
    mergetool
    将在成功解析时自动对文件进行阶段性更改

    正如格雷格·休吉尔(Greg Hewgill)所说,一次简单的重置将取消所有阶段性更改的显示

    git reset
    
    为什么git stash应用我的更改

    任何会影响工作树()的内容都会首先影响索引

    索引是将对象从工作树移动到对象存储以及将对象从对象存储移动到工作树的中间人

    git stash apply
    也使用该索引记录合并冲突,例如。见:

    对于冲突路径,索引文件最多记录三个版本:

    • 阶段1存储来自共同祖先的版本
    • 从HEAD开始的第2阶段,以及
    • 合并头的阶段3(您可以使用
      git ls文件-u
      检查阶段)
    git stash--apply
    的发展历史中,需要注意两个有趣的事件: 2011年4月(Git 1.7.5.1,),
    stash
    放弃了对apply的脏工作树检查

    在应用隐藏之前,请确保工作树中没有不在索引中的更改。此检查可追溯到原始的
    git stash.sh
    ,大概是为了防止工作树中的更改在合并过程中意外丢失

    但是,此检查存在两个问题:

  • 这是过分的限制。如果我的隐藏只更改文件“
    foo
    ”,但“
    bar
    ”在工作树中变脏,则会阻止我们应用隐藏

  • 这是多余的。在实际调用merge recursive之前,我们根本不接触工作树。
    但它有自己的(更准确的)检查以避免丢失工作树数据,并且将中止合并,并显示一条更好的消息,告诉我们哪些路径存在问题

  • 因此,我们可以完全放弃支票

    使用索引管理git stash apply进行的合并会导致另一个bug,于2015年4月检测到,git 2.4.2,:

    隐藏
    :需要一个干净的索引才能应用 如果您在索引中暂存了内容并运行“
    stash apply
    ”,我们可能会遇到冲突并将新条目放入索引中。
    恢复到原始状态在这一点上是很困难的,因为像“
    git reset--keep
    ”这样的工具会吹走任何分段的内容
    我们可以通过在有阶段性更改时拒绝应用来确保安全性

    git reset
    

    git stash apply
    不会为我暂存已保存的更改。你能发布你正在做的事情的更多细节吗?我有与OP完全相同的问题。当git stash apply出现冲突时,更改被转移。我不使用任何解决冲突的工具,只使用我的代码编辑器。关于谁在进行隐藏的更改,还有其他建议吗?注意:windows上的msysgit!唯一一个远程接近罪魁祸首的配置是core.logallrefupdates=true,但我怀疑,它一定与此有关。