“git stash apply”或“git stash pop”命令会将修改过的文件添加到提交中吗?

7

我在本地主分支上进行了几处更改。这些本地更改尚未被暂存(添加)。

为了更新主分支,我执行了以下操作:

  1. 将我的本地更改存储。
  2. git pull
  3. git stash apply

我发现,在此之后,本地更改被暂存(添加)了?

它们不应该像之前一样保持未暂存状态吗?


我认为您正在询问与此问题相同的内容:https://dev59.com/nHM_5IYBdhLWcg3ww2Kb - Tor Klingberg
2个回答

5

git stash基本上与git commit相同。它创建了一个完整的提交,但不将其添加到历史记录中。相反,它将提交添加到暂存区。

因此,git stash必须做出选择:要么提交(储藏)所有未提交的更改,要么只提交(储藏)已添加到索引的更改。它不能两者兼备。那样需要进行两次提交而不是一次。

据我所知,git stash获取所有未提交的更改。


在这种情况下,我可以取消暂存由“git stash apply”暂存的更改吗? - Karun
当然可以。git stash apply 只是为了帮助你暂存更改。如果你不想将它们暂存,可以将其取消暂存。 - functionpointer
1
你不觉得这和文档相矛盾吗?git stash pop的条目中提到了--index选项,并解释说:如果使用--index选项,则尝试恢复的不仅是工作树的更改,还包括索引的更改。但是,当存在冲突时(这些冲突存储在索引中,因此您无法像最初那样应用更改),这可能会失败。在我看来,这意味着除非指定了--index,否则存储的更改仅应用于工作树,而不涉及索引。 - kostix
@Karun,你用什么程序与你的Git存储库进行交互?原生Git客户端还是其他什么东西? - kostix
2
FYI,git stash实际上确实会产生两个(有时是三个)提交。当git stash完成后,refs/stash是一个具有两个或三个父级的提交。 "主"提交refs/stash本身包含工作树状态,而refs/stash^2包含保存的索引状态。第三个提交refs/stash^3仅在您使用了-u-a并且包含未跟踪的文件(以及使用-a时被忽略)。 (git rev-parse refs/stash^ == git rev-parse HEAD。) - torek
显示剩余4条评论

2
git stash是将更改添加到您的本地系统中,但不会将它们添加到代码树中。您可以通过命令git stash list随时查看所有已储藏的内容。您还可以在主内容进行更改后(例如pull命令后)稍后添加您的储藏内容。建议您遵循Git的原始文档,以便更加清晰明了。这里是http://git-scm.com/book/en/Git-Tools-Stashing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接