为什么git stash不是针对每个分支唯一的?

85

我想它允许从一个分支移动更改到下一个分支,但这就是cherry picking的用途,如果你没有对你的更改进行提交,也许你不应该将它们移动起来?

有时我会在错误的分支上应用错误的存储,这使我对这个问题感到困惑。


13
Git缺少一些东西,可以让你将未提交的更改与分支(或主干)关联起来。当您同时进行多个分支的工作时,这一点变得显而易见。正如这里的答案所指出的那样,stash根据其特性具有有用的应用程序。不过,有没有“git stash-here”呢? - Blake Taylor
4个回答

69

如前所述,如果您需要“每个分支的暂存”,则需要从现有分支派生一个新分支。

此外,除了已经提到的将暂存内容应用到您正在工作的分支中,它还允许您在还没有提交所有更改之前切换分支。这对于常规意义上的挑选操作不太适用,而是用于挑选您的工作副本。

例如,在一个功能分支上工作时,我经常会注意到代码中的一些微小错误或者漂亮问题,这些都与该分支无关。那么,我会立即修复这些问题。当需要提交时,我会有选择性地提交相关更改,但不包括修复和美化内容。相反,我会将这些内容暂存起来,这样就可以切换到我的稳定版修复分支,在那里可以应用暂存并单独提交每个微小的修改。(根据更改的具体情况,我也可能再次将它们暂存起来,以便在不同的功能分支上应用。)

这使我能够深入编程模式,专注于工作,而不必担心代码的正确性。然后,在休息时,我可以仔细地将更改分类整理到各个正确的位置。

如果暂存不是全局的话,这种类型的工作流程将更加困难。


5
我不同意这个说法:如前所述,如果您想要“分支暂存”,您确实需要从现有分支创建一个新分支。 特别是,我经常在两个版本的同一程序之间切换,而运行完整的 make 需要 10 分钟;能够每个分支暂存已构建的二进制文件将非常方便。我肯定不想将二进制文件放在日志或分支中。 - Clément
为什么?(我认为你知道,只是不自知。) - Aristotle Pagaltzis

21

从 Git 1.6 开始,你现在可以使用 stash 将代码恢复到分支上。

git stash branch name_of_new_branch

Git会为您创建新的分支,并将其检出!有关更多信息,请参见

  • git书籍

  • info git-stash并搜索选项=branch

我猜想您可以使用它移动存储。

git stash branch <branch | new_branch> [<stash>]

要查看您的存储列表,请使用

git stash list

参考资料


谢谢!我之前不知道可以将存储应用到分支上,但这似乎就是实际的行为。在一个分支上有一个存储,我切换到另一个分支并在那里做了一些工作。结果发现,在我重新基于主分支之前,我还需要对其中一些未完成的更改进行存储。我的更新后的 "gitk --all" 不再显示我的第一个存储;我以为它可能被覆盖了。在第二个分支中完成工作后,我弹出了那个存储。之后,我的更新后的 "gitk --all" 再次显示原始存储。 - Daniel Miladinov

17

如果你想要在一个分支上运行的"stash",可以像这样在当前分支的新分支上储存你的更改。

git checkout -b new_stash
git commit -a -m "stashed changes"
撤销暂存区更改。
git reset HEAD^
git branch -d new_stash

git stash尤其有用,因为您可以将更改拉入脏树中,即使您有未完成的编辑并且想要执行操作。


git pull

如果您不能直接提交更改,您可以将其保存到贮藏区中,然后再进行拉取并应用该贮藏。

git stash
git pull
git stash apply
git stash clear
希望这能有所帮助!

如果你想要隐藏的东西是一堆二进制文件,例如在该分支上运行make命令生成的文件,该怎么办呢?(对于每个分支进行隐藏将节省下次在该分支上进行增量构建的时间,但你肯定不想将这些二进制文件添加到索引中) - Clément

5

对我而言,git-stash最有用的功能是将尚未提交的更改移动到与当前检出分支不同的另一个分支。

例如- 我经常在bug-fixes分支上进行简单更改;只发现我正在处理的更改比我最初猜测的要复杂。 Git-stash是将这组更改移动到另一个分支的最简单方法。


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