如果Git Stash保存了Diffs,那为什么它不能应用于不同的分支?

时间:2016-04-13 10:54:26

标签: git

据我所知,Git Stash是一系列差异。

例如,如果我有一个包含单个文件的整个仓库foo.txt

该文件的32行只是

Lorem Ipsum 01
Lorem Ipsum 02
Lorem Ipsum 03
...
Lorem Ipsum 30
a first line: good
a second line: bad

我做了一切。

现在我创建一个新分支:

git checkout -b feature123

现在我在这个分支上,我将单词good更改为better,将bad更改为worse

现在,假设我的项目经理过来说“紧急!我们必须将01更改为011,将02更改为022”。

所以我存储了更改,然后切换到master分支:

git stash
git checkout master

我按照他的要求将01更改为011,将02更改为022

并且说,我想将我之前“隐藏”的更改合并到master分支:

git stash apply

但会出错:

error: Your local changes to the following files would be overwritten by merge:
    foo.txt
Please, commit your changes or stash them before you can merge.
Aborting

为什么?它不能只将差异集应用于foo.txt吗?

(PS我可以先提交,然后使用git stash apply,并能够将这些差异应用到foo.txt。但为什么不在提交之前?所以git stash真的只是保存了差异的集合 - 精确地重复:差异的集合,然后做一个git checkout .(放弃所有的变化)。这是真的吗?)

2 个答案:

答案 0 :(得分:3)

  

Git Stash是一系列差异。

不是真的。存储是一组提交对象,每个提交对象都记录了项目的完整快照。 git stash pop在当前头,存储和存储基于的提交之间进行合并。

理论上可以在本地修改的文件上执行合并,但在实践中:

  • merge这对于stash来说是一个非常糟糕的主意,因为它会鼓励用户进行"邪恶的合并",即在同一次提交中同时进行与合并相关的手动更改。因此,禁止合并触摸本地修改的文件,merge使用与stash pop相同的机制,因此禁止它以同样的方式。

  • 索引使事情看起来比它们看起来更复杂。如果文件具有未暂存的内容,并且您希望对其应用存储,则没有正确的方法来定义存储应用程序末尾应该是索引的内容。实际上,feature123允许触摸索引与工作树匹配的文件。

注意:您的问题不在于您在不同的分支机构,而是您有未经修改/未分阶段的更改。您在分支git checkout master上执行了这些更改,但在使用BrowserPreferences.SetChromiumSwitches("--enable-npapi"); 切换分支时会保留这些更改。

答案 1 :(得分:1)

man git stashpop(也适用于apply)下面说了以下内容:

  

工作目录必须与索引匹配。

所以你是对的,它可以将差异集合应用到foo.txt,但如果你有非分段本地更改则不能。如果您对工作目录和索引之间的区别感到困惑,也许this answer可以提供帮助。

运行git add hei.txt,您就可以应用存储。