是否每个git commit都会使项目处于工作状态?


36

我很好奇目前流行的最佳实践是什么。应该强制执行git commit,以使项目处于工作状态(正确构建,所有测试通过等),还是提交损坏的代码可以吗?

例如,如果您放弃此要求,则可以更灵活地进行提交(即使应用程序未处于工作状态,也可以将它们用作逻辑块)。但是,如果您实施它,则可以稍后灵活选择任何给定的提交...

Answers:


50

我通常遵循以下规则:

  • 每个合并master分支机构必须使项目处于工作状态;
  • 每次合并到主线develop分支都应使项目处于工作状态(并且必须至少构建);
  • 对方个人犯有解释为何做出改变的一个主要目标,什么是它,和它有什么影响部分项目。所有其他目标(例如使项目保持工作状态)都是可选的。

1
我们在办公室里存放了同样的郁金香,这很好。不,这并不局限于混帐,但与任何类似工具的工作原理(水银,SVN,等等。)
deadalnix

40

使用您本地存储库的副本进行开发时可以使用的任何内容。

我定期提交损坏的代码,当我准备将代码提供给其他开发人员时,我使用了一项很棒的功能:

git rebase -i HEAD~4

这使我可以将可能已损坏的中间文件(本例中为4个)压缩为一个良好的提交。将为您提供一个编辑器,使您可以选择如何压缩这些提交。通常,我将第一个提交标记为“ pick”提交,并将其他提交标记为“ squash”。

然后,我可以推送一个原子提交,或者如果我的新功能真的准备就绪,那么我可以做的就是使用'git cvsexportcommit'将我的工作纳入现有的CVS回购中。


3
我对这个答案的智慧提出质疑,因为它所依据的rebase是一个颇有争议的观点:您不可撒谎:git改变了基调,修改,压扁和其他谎言
Sled 2013年

8
@ArtB:但是在这种情况下,memetech只是在自欺欺人(爱荷华州不会改写公共历史),这在很大程度上没有争议。
约尔格W¯¯米塔格

4
@ArtB文章指的是已发布的提交。答案是指未发布的提交。
2014年

2
@WayneConrad“一个好的经验法则是,您不应该重写已经发布到世界各地的东西的历史记录。这将限制这些重写工具在本地使用,以便在推动它们之前先对其进行“修复”。” 摘自最后一段。
安德鲁说莫妮卡(Monica)恢复职权

8
@ArtB-我怀疑相信您在互联网上阅读的所有内容并且在不理解为什么(或为什么不这样做)的情况下做(或不做)您在互联网上阅读的所有内容的明智性。
mattnz

6

版本控制的两个主要好处是,它使开发人员可以恢复其工作的先前版本,并且可以使开发人员同时尝试不同的,可能相互冲突的更改。版本控制使开发人员可以自由尝试可能失败的想法。

应当鼓励开发人员定期分支并提交他们的工作,无论是否建立。拒绝允许分支或损坏的提交,将束缚您的开发人员,并严重滥用您的工具。

也就是说,要求始终建立对某些分支的提交是一种极好的实践。许多组织走得更远,完全禁止开发人员向某些分支机构承诺。例如,可能要求开发人员将其工作合并回主开发分支,但可能只允许主要开发人员将这些更改从开发合并到生产分支。


2

我们通常采用两种方法。在我的盒子上的本地存储库中,我提交所有我想要的东西。当需要推送到团队的中央存储库时,我首先进行一个交互式的基础调整,然后将提交内容模制成逻辑包。通常每个故事提交一次,并在评论中包含故事(或缺陷)标识(我们是一家看板商店)。

然后在我们的中央再现系统上,我们让詹金斯(Jenkins)倾听,并且开始构建和所有测试。如果有任何失败,我们通常允许人们尝试通过另一次提交来修复构建。如果看起来不好,则可以轻松地还原错误的提交。


1

由于git commit只会影响您自己的存储库副本,因此,每次提交后,项目都无需处于工作状态。继续并在需要保存所做工作时提交。一个好的经验法则是,当您可以描述在提交消息中所做的更改时,提交是适当的。

git push会影响其他用户。开发人员应自行决定应执行的策略。将不起作用的代码推送到主分支上大概是不可以的,但是将不起作用的代码推送到一个单独的分支上也是可以的(只要没有其他人会尝试从该分支上进行构建)。


1

我们在工作中使用git flow,而且我们还会提交未完成或损坏的代码-因为它仅落在针对该特定问题的本地或远程分支中。仅当任务完成后,它才会合并到development分支(代表流模型中的当前工作副本)。这样,我们还可以在代码上进行协作(一些同事在另一个城市,包括项目负责人)并互相帮助。

但是,这取决于您和您的同事的想法。就个人而言,我认为分支提交是可以的,因为您可能需要具有更大重构或类似内容的更改历史记录。


1

归根结底,这取决于您和与您一起工作或与之共事的人,因为git不施加任何规则。

我的做法是避免任何有意使系统严重恶化的提交。每个提交都应该重构或实现某些要求。如果我做出错误的提交并在推动它之前发现它,那么我将进行修改或调整基准以将其从历史记录中删除。

我认为这使得读取请求请求中的git日志更加容易,因为每个提交都应独立存在,作为重构或某些要求的实现。添加将在不久的将来变为现实的无效代码被视为重构。这些是我的“逻辑块”。

您仍然可以灵活地调整提交的结构。例如,您可以预先编写测试,但在第一次提交中将它们标记为已跳过,这样您的测试套件就不会报告失败,然后在实现完成后取消跳过它们。


0

假设您正在使用分支和良好的提交消息,则只要您的团队同意这是一个良好的工作习惯,就可以在分支上提交带有明确说明的提交消息的“中断”代码,这将是很好的。

您还可以在本地克隆git存储库,因此您很可能只拥有一个本地分支,其中本地提交不会在执行过程中提交到“断”代码的原始位置。然后,当它们全部正常工作时,您可以将其合并到master或其他某个分支中,并使用各种“中断”提交删除您的工作分支。

对我而言,这是与您的团队达成共识的全部条件;有些团队甚至在分支机构也不会接受破损的代码,而其他团队则会接受。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.