使用git stash save或git commit进行本地更改?

时间:2013-09-11 09:37:17

标签: git github git-commit git-stash

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

git stash save "save message" 

git commit -am "save message"

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

4 个答案:

答案 0 :(得分:13)

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

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

换句话说,是的,可以使用提交进行临时的私有存储。但是,使用隐藏功能要容易得多。实际上,对于这个用例,该功能是制作

答案 1 :(得分:3)

就我个人而言,我更喜欢直接进入私人(本地)分支机构,但是仍然可以使用。请注意关于藏匿处的两件事:

  • 他们是他们自己的提交。除了标签之外,“存储”提交与绑定到分支或标签标签的提交之间没有根本区别。 (标签标签的格式为refs/tags/tag-foo;分支的格式为refs/tags/branch-foo;单标签的存储提交标记为refs/stash。当然,分支标签也有“自动”当您添加提交“功能时移动,但如果您从未在那里添加更多提交,则它们永远不会移动,因此它们也可以保存单个提交。”
  • 使用reflogs实现存储“stack” 1 。 Reflogs 可以到期 - 默认情况下最多(30或90天后),而refs/stash中的那些不会,但您可以使用配置条目更改此内容 - 因此堆叠的存储提交也可以“到期“(同时reflog条目到期)。 (更确切地说,它们“变得可收藏”,但如果它们消失了,这种区别就没有用了。:-))

藏匿的意图是短期保存。如果你曾经回到过一个回购并找到一堆藏匿处,所有这些都被命名为“分支机构上的WIP”,试图找出它们并不好玩。

其他功能/错误:-) 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以外的所有藏匿处。

答案 2 :(得分:0)

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

我建议你一次浏览git here的文档。还阅读有关该工具的信息。在此之后,你肯定会成为git的主人。

答案 3 :(得分:0)

我做的事情有点不同。对我来说,存放更多是为了快速保存,而不是日常工作,因为它们(实际上)不能(很容易)实际存储。 (即如果我有20个已更改的文件,并且我想创建两个每个十个的藏匿处,那么这并不容易。)

这就是为什么我希望我的日常更改只针对我的个人用途而实际的,虽然是临时分支,所以我可以随时附上笔记和我的工作。每日签到,实验等。基本上我的东西想要推到最终的回购。

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

然后我为这些&#34; new&#34;创建一个新的分支。更改,我可以立即提交它们,或者我可以将它分成几个提交,如果它有意义(即一个用于后端的东西,另一个用于前端的东西,另一个用于资源等)< / p>

当我完成后,我离开了一个漂亮的,新的,干净的分支,其历史记录对其他开发者有意义,没有我的日常记录,并准备合并并推回到主要回购。然后我可以删除我的临时分支并继续下一个任务。

所以回顾......

  1. 创建工作分支
  2. 尽可能多的提交/支行完成工作
  3. 如果您准备好合并而不保留该历史记录,请将git-reset重新设置为您分支的原始提交。您的所有更改现在都是本地更改。
  4. 按照您认为合适的方式重新提交并合并
  5. 另一个好处是我实际上可以将临时分支推送到远程仓库,这样我就可以在多个位置工作,而这些位置可以用存储来完成。请记住,当您完成后,清理服务器上的东西以保持回购浏览的清洁。 (有些人可能认为技术上提交仍然存在,只是分离,这是真的,但分支在GIT中是轻量级的,在某种程度上,它成为另一个不丢失工作的安全网,因为你可以找回一个独立的提交如果真的有必要的话。)