26

我更改了我的仓库中的一些文件,但不希望它们被公开或创建任何临时分支来存储它们。我只想将这些更改保存在某个地方。那么哪个命令更好:

git stash save "save message" 

或者

git commit -am "save message"

?

如果我使用git commit,我的所有本地提交是否都会被一个git push命令公开推送?如果我只想在其中推送一个特定的提交怎么办?

4

4 回答 4

20

推送时,您总是推送一个特定的提交(通常是当前签出分支顶端的提交)。但是,由于提交的哈希部分包含它所基于的提交(其父提交),因此您必须推送所有父提交。通过推送父提交,您还必须推送他们的父提交等等。因此,您只能推送特定提交的整个历史记录。

如果你创建一个提交只是为了存储一些东西而不是为了推送,你需要确保你永远不会推送那个提交,也不会推送任何基于那个提交的提交。为此,在您完成基于临时提交的工作后,您需要将临时提交压缩到您创建的新提交中以推送它。

换句话说,是的,可以将提交用于临时的私有存储。但是,使用存储功能要容易得多。事实上,该功能就是这个用例而设计的。

于 2013-09-11T10:31:43.320 回答
5

就我个人而言,我更喜欢直接去私人(本地)分支机构,但隐藏工作。请注意有关 stash 的两件事:

  • 他们是他们自己的承诺。除了标签之外,“stash”提交和绑定到分支或标签标签的提交之间没有根本区别。(标签标签的形式refs/tags/tag-foo为;分支的形式为refs/tags/branch-foo;而-single-labeled stash commit 被标记为refs/stash。当然,分支标签也具有“添加提交时自动移动”功能,但如果您从不添加更多提交在那里,它们从不移动,因此它们可以很好地保存单个提交。)
  • 存储“堆栈” 1是使用 reflogs 实现的。Reflogs可以过期——默认情况下大多数会过期(在 30 或 90 天后),而那些refs/stash不会过期,但你可以使用配置条目来更改它——所以堆叠的 stash 提交也可以“过期”(同时 reflog 条目过期) . (更准确地说,它们“变得可收藏”,但如果它们消失了,这种区别就没有帮助。:-))

藏匿的目的是为了短期保存一些东西。如果你曾经很晚才回到一个 repo 并找到了一堆名为“WIP on branch”的存储库,那么试图找出它们并不是一件有趣的事情。

:-)stash提供的其他功能/错误是:

  • git stash branch让您在事后改变主意并将存储变成分支。所以,如果“短期”成为一个问题(你打算今天下午修复它,但现在它已经被推迟了至少一个月),你毕竟可以把储藏室变成一个分支。
  • git stash apply [--index]将尽最大努力“重新制作”当前分支中应用的更改。--index它将尝试独立地恢复分阶段和非分阶段的更改。(不过,在某些情况下这是不可能的。)
  • git stash pop自动为您丢弃存储参考。不幸的是,即使您打算使用git stash pop --index并忽略该--index部分,它也会这样做。如果您使用pop. 如果你使用apply, 并且稍后drop一旦你确定你已经按照你想要的方式恢复了一切,你就可以避免这个问题。

请注意,这git stash branch意味着--index:新创建的分支将分阶段和未分阶段的更改恢复到您执行git stash. (该分支也会从您执行 时的提交中分支出来git stash。)提交更改(git add如果需要,可以进行更多操作,或者作为两个单独的提交,或其他)并继续进行,就像您创建了一个私有分支一样首先。


1堆栈的可过期部分包含输出中除stash@{0},之外的所有存储git stash list

于 2013-09-11T18:46:34.327 回答
2

我做的事情有点不同。对我来说,存储更多是为了快速保存,而不是日常工作,因为它们不是(容易)细化的,你可以实际存储的东西。(即,如果我有 20 个更改的文件,并且我想创建两个每个 10 个的 stash,这并不容易。)

这就是为什么我希望将我的日常更改提交给一个实际的,尽管是临时的分支,仅供我个人使用,这样我就可以在我去的时候包含笔记和我的工作。每日签到、实验等。基本上我不想把事情到最终回购。

当我处于准备提交回主存储库的状态时,我对最初分支的提交使用“软重置”命令。这会将我所有临时分支提交的更改恢复为原始提交上的当前更改,而没有我的任何日常工作历史记录。

然后,我为这些“新”更改创建一个新分支,我可以一次全部提交它们,或者如果有意义的话,我可以将它分成几个提交(即一个用于后端,另一个用于前端 -结束的东西,另一个资源等)

完成后,我留下了一个不错的、新的、干净的分支,其历史对其他开发人员有意义,没有我的日常笔记,并准备合并并推回主仓库。然后我可以删除我的临时分支并继续下一个任务。

所以回顾一下...

  1. 创建工作分支
  2. 根据需要进行尽可能多的提交/子分支以完成工作
  3. 当您准备好合并回来而不保留该历史记录时, git-reset 回到您分支的原始提交。您的所有更改现在都是本地更改。
  4. 根据需要重新提交和合并

另一个好处是我实际上可以将临时分支推送到远程仓库,这样我就可以在多个位置工作,而这是你无法使用存储的。请记住,当你完成后,清理服务器上的备份以保持 repo 浏览干净。(有些人可能会争辩说,从技术上讲,提交仍然存在,只是分离的,这是真的,但分支在 GIT 中是轻量级的,并且在某种程度上,它成为另一个不丢失工作的安全网,因为您可以取回分离的提交如果真的有必要。)

于 2017-10-09T16:21:42.903 回答
1

我建议你使用存储工具。这就是它在这里的原因。您可以存储您的更改,然后将它们添加到您的代码中。git stash 可以使用更多的功能。这是链接http://git-scm.com/book/en/Git-Tools-Stashing

我建议你在这里浏览一下 git 的文档。另请阅读有关该工具的信息。在此之后,您肯定会成为 git 的主人。

于 2013-09-11T13:27:47.053 回答