gpt4 book ai didi

git - 如果 Git Stash 保存了 Diff,那么为什么不能将其应用到不同的分支呢?

转载 作者:行者123 更新时间:2023-12-02 04:11:24 24 4
gpt4 key购买 nike

据我了解,Git Stash 是 diff 的集合。

例如,如果我有一个包含单个文件的完整存储库 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

现在我在这个分支上,我改变了这个词goodbetter ,和badworse .

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

所以我 stash 了更改,然后更改为 master分支:

git stash
git checkout master

我更改了 01011 ,和02022按照他的要求。

并且说,我想将我之前“stash ”的更改 merge 到 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

(P.S.我可以先提交,然后使用 git stash apply ,并能够将这些差异应用到 foo.txt 。但是为什么不在提交之前呢?所以 git stash 实际上只是保存了一组差异 - 到精确重复:差异集合,然后执行 git checkout . (放弃所有更改)。是这样吗?)

最佳答案

Git Stash is a collection of diffs.

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

理论上可以对本地修改的文件执行 merge ,但实际上:

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

  • 索引使事情比看起来更复杂。如果文件具有未暂存的内容,并且您想对其应用存储,则没有正确的方法来定义存储应用程序末尾的索引内容。实际上,stash pop 可以访问索引与工作树匹配的文件。

注意:您的问题不是您位于不同的分支,而是您有未提交/未暂存的更改。您在分支 feature123 上进行了这些更改,但在使用 git checkout master 切换分支时它们会被保留。

关于git - 如果 Git Stash 保存了 Diff,那么为什么不能将其应用到不同的分支呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36596216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com