据我所知,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 .
(放弃所有的变化)。这是真的吗?)
答案 0 :(得分:3)
Git Stash是一系列差异。
不是真的。存储是一组提交对象,每个提交对象都记录了项目的完整快照。 git stash pop
在当前头,存储和存储基于的提交之间进行合并。
理论上可以在本地修改的文件上执行合并,但在实践中:
merge
这对于stash
来说是一个非常糟糕的主意,因为它会鼓励用户进行"邪恶的合并",即在同一次提交中同时进行与合并相关的手动更改。因此,禁止合并触摸本地修改的文件,merge
使用与stash pop
相同的机制,因此禁止它以同样的方式。
索引使事情看起来比它们看起来更复杂。如果文件具有未暂存的内容,并且您希望对其应用存储,则没有正确的方法来定义存储应用程序末尾应该是索引的内容。实际上,feature123
允许触摸索引与工作树匹配的文件。
注意:您的问题不在于您在不同的分支机构,而是您有未经修改/未分阶段的更改。您在分支git checkout master
上执行了这些更改,但在使用BrowserPreferences.SetChromiumSwitches("--enable-npapi");
切换分支时会保留这些更改。
答案 1 :(得分:1)
man git stash
在pop
(也适用于apply
)下面说了以下内容:
工作目录必须与索引匹配。
所以你是对的,它可以将差异集合应用到foo.txt
,但如果你有非分段本地更改则不能。如果您对工作目录和索引之间的区别感到困惑,也许this answer可以提供帮助。
运行git add hei.txt
,您就可以应用存储。