代码之家  ›  专栏  ›  技术社区  ›  n179911

为什么“Git Stash应用”阶段我的更改?

git
  •  17
  • n179911  · 技术社区  · 15 年前

    我做了改变,然后我 git stash 然后我 git stash apply

    我的问题是

    1. 为什么在我之后 Git StApple应用 ,我的改变变成了“舞台”?也就是说,如果我这样做,我什么也看不见。 git diff ,我只看到我的区别,如果我这样做的话 git diff --cached ?

    2. 是否有任何“取消”我的更改 Git StApple应用 命令?

    3. 是否有任何git命令基本上让我“备份我的更改,将其重置到头部,并将备份复制回”?我想 暂存 然后 Git StApple应用 这是命令,但它是如何“上演”我的所有更改的?有同等的东西让我 Git StApple应用 没有“我的改变”部分?

    3 回复  |  直到 6 年前
        1
  •  13
  •   Greg Hewgill    15 年前

    如果您发现您的更改是意外进行的,请执行以下操作:

    git reset HEAD
    

    我通常只在应用隐藏的更改时出现冲突时才会看到这一点。在执行以下操作之前,您需要检查是否是这种情况 git reset .

    这个 git stash 命令是最适合您的用例的命令。我一直用它来达到这个目的。

        2
  •  9
  •   Community CDub    8 年前

    为什么Git Stash应用Stage My Changes?

    任何会影响你工作树的东西( like a git checkout -- afile )将首先影响您的索引。

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

    索引也由 git stash apply 用于记录合并冲突,作为 index has stage-n entries . 见 git merge :

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

    • 阶段1存储来自共同祖先的版本,
    • 头部第2阶段,以及
    • 合并头的第3阶段(您可以使用 git ls-files -u )

    在进化史上 git stash --apply ,需要注意两个有趣的事件: 2011年4月(Git 1.7.5.1, commit e0e2a9c ) stash 应用时已放弃脏工作树检查。

    在应用存储之前,我们要确保工作树中没有索引之外的更改。这张支票可以追溯到原始 git-stash.sh ,并且可能是为了防止在合并过程中意外丢失工作树中的更改。

    但是,此检查有两个问题:

    1. 这是过于限制的。如果我的存储只更改文件” foo “但是” bar “工作树上很脏,这会阻止我们使用藏物。

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

    所以我们可以直接取消支票。

    使用索引管理由 Git StApple应用 导致另一个bug,2015年4月检测到,git 2.4.2, commit ed178ef :

    藏匿处 :需要一个干净的索引才能应用

    如果索引中有阶段性内容并运行“ stash apply “,我们可能会遇到冲突并将新条目放入索引中。
    在那一点上恢复到初始状态是困难的,因为类似“的工具 git reset --keep “会吹走任何舞台上的东西 .
    我们可以通过在有阶段性更改时拒绝应用来使这更安全。

        3
  •  3
  •   Greg Hewgill    15 年前

    我想你的配置可能有点问题 git stash 在重置为最新提交之前记录索引和工作树的状态, git stash apply 仅当使用 --index 选择权。

    一个可能的混淆点是,如果您有冲突(即,由于存储应用于不同的提交而引入了合并冲突,其中受存储影响的文件在进行存储的提交之后已被更改),那么如果您使用 mergetool 为了解决冲突, 秋葵醇 将自动将更改转移到成功解析的文件中。

    正如GregHewgill所说,简单的重置将取消所有阶段性更改。

    git reset