从Git SCM书中:
通常,当您从事项目的一部分时,事情处于混乱状态,您想切换分支以进行其他工作。问题是,您不想做一次半完成的工作,只是想稍后再回到这一点。这个问题的答案是git stash命令。
暂存会占用工作目录的脏状态(即,已修改的跟踪文件和暂存的更改),并将其保存在未完成的更改堆栈中,您可以随时重新应用它们。
鉴于此描述,我会说这是一种反模式。对Git Stash的过于简化的解释是,它是源代码控制的“剪切和粘贴”。您将一堆更改过的文件,保存在Git正常分支工作流程之外的一支握笔中,然后在以后将这些更改重新应用于其他分支。
再往前走一点,致力于掌握是这里的反模式。使用分支。那就是他们的目的。
真正归结为:
您可以将螺丝钉在墙上,这样可以固定图片,但是应该使用螺丝刀。当螺丝刀正坐在您旁边时,请勿使用锤子。
关于提交“破损”代码
虽然以下是意见,但我是根据经验得出的。
提早提交,并经常提交。提交任意数量的损坏代码。在您入侵某些内容时,将您的本地提交历史记录视为“保存点”。完成逻辑工作后,进行提交。当然,它可能会破坏所有内容,但是,只要您不推动这些提交,那都没有关系。推送之前,请重新整理和压缩您的提交。
- 建立新分支
- 哈克哈克哈克
- 提交破损的代码
- 完善代码并使其起作用
- 提交工作代码
- 变基和压扁
- 测试
- 测试通过时推送
对于OP来说,这个Linux内核消息线程可能是令人感兴趣的,因为听起来好像OP团队的某些成员正在以类似的方式使用Git。
@RibaldEddie在下面的评论中说:
首先,存储不是在“分支工作流”之外,因为在内部,存储只是另一个分支。
(冒着引起许多人愤怒的危险)
莱纳斯说:
使用“ git stash”,您也可以具有多个不同的隐藏对象,但是它们不会彼此排队-它们只是随机存储的独立补丁,因为它们在某些时候不方便而被隐藏了。
我认为@RibaldEddie想要说的是,您可以git stash
在功能分支工作流程中使用它-这是事实。这不是git stash
问题所在。它是提交到master和using的组合git stash
。这是一种反模式。
澄清 git rebase
来自@RibaldEddie的评论:
变基更像是粘贴复制,甚至更糟地修改已提交的历史记录。
(强调我的)
修改提交历史记录不是什么坏事,只要它是本地提交历史记录即可。如果您将已经推送的提交作为基准,那么实质上您将使用分支孤立其他任何人。这不好。
现在,假设您在一天内进行了几次提交。一些提交是好的。有些...不太好。该git rebase
命令与压缩提交一起是清除本地提交历史记录的好方法。合并到公共分支的一次提交很不错,因为它可以保持团队共享分支的提交历史记录整洁。重新基准化后,您将需要再次测试,但是如果测试通过,则可以推送一个干净的提交,而不是多个脏提交。
关于干净提交历史记录,还有另一个有趣的Linux Kernel线程。
再次,从莱纳斯:
我想要干净的历史记录,但这确实意味着(a)干净和(b)历史记录。
人们可以(也许应该)为自己的私有树(他们自己的工作)建立基础。那是清理工作。但是从来没有其他人编写代码。那是“毁灭的历史”
因此历史部分相当简单。只有一个主要规则,还有一个次要说明:
您绝对不能破坏他人的历史。您不得重新基准其他人所做的提交。基本上,如果没有您的批准,那就超出了限制:您无法将其作为基准,因为它不是您的。
请注意,这确实是关于其他人的历史,而不是关于其他人的代码。如果他们以电子邮件补丁程序的形式向您发送了东西,并且您使用“ git am -s”应用了它,那么这就是他们的代码,但这是
您的历史记录。
因此,即使您未编写代码,只要提交本身是您的私有代码,您就可以对其进行“ git rebase”操作。
对该规则的次要说明:在某些公共站点上发布历史后,其他人可能会使用它,因此现在显然不再是您的私人历史了。
因此,次要澄清的事实是,这不仅涉及“您的提交”,还涉及它对您的树是私有的,并且您尚未将其推出并宣布。
...
现在,“干净”部分更加微妙,尽管第一个规则非常明显且容易:
保持历史记录可读
有些人通过首先解决问题,而不犯错误来做到这一点。但这非常罕见,对于我们其他人,在解决问题时,我们使用“ git rebase”等。
因此,“ git rebase”没有错。但这是对的,只有它是您自己的私人git树。
不要暴露你的废话。
这意味着:如果您仍处于“ git rebase”阶段,则不要将其推出。如果尚未准备好,您可以发送补丁,或使用私人git树(仅作为“补丁系列替代品”),而您不会将其告知公众。
(强调我的)
结论
最后,OP让一些开发人员执行此操作:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
这里有两个问题:
- 开发人员致力于掌握。立即将其锁定。真的,这是最大的问题。
- 开发人员在应该使用功能分支时会不断使用
git stash
和git pull
掌握。
使用git stash
-尤其是在拉动之前- 并没有错,但是git stash
当Git中有更好的工作流程时,以这种方式使用是一种反模式。
他们使用git stash
红鲱鱼。这不是问题。致力于掌握是问题所在。