Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 我应该为单个提交创建分支吗?_Git_Git Branch - Fatal编程技术网

Git 我应该为单个提交创建分支吗?

Git 我应该为单个提交创建分支吗?,git,git-branch,Git,Git Branch,我不熟悉Git和分支。在我们的团队中,我们有很多网站需要简单的维护,比如添加一个新页面、修复一些链接等等。提交通常包含所有请求的功能。我不确定我们是否应该创建一个分支,或者我们是否可以向master提交?毕竟,提交是被命名的,并且清楚地表明我们已经做了什么。我觉得分支实际上为这些简单的任务创造了更多的复杂性。还是我弄错了?分支确实创造了更多的复杂性,但同时它们也给了你更多的力量。一旦开始分支,您就可以轻松地将它们洗牌,从一个分支中进行更改,而不是从另一个分支中进行更改,依此类推。 对于简单的场景

我不熟悉Git和分支。在我们的团队中,我们有很多网站需要简单的维护,比如添加一个新页面、修复一些链接等等。提交通常包含所有请求的功能。我不确定我们是否应该创建一个分支,或者我们是否可以向master提交?毕竟,提交是被命名的,并且清楚地表明我们已经做了什么。我觉得分支实际上为这些简单的任务创造了更多的复杂性。还是我弄错了?

分支确实创造了更多的复杂性,但同时它们也给了你更多的力量。一旦开始分支,您就可以轻松地将它们洗牌,从一个分支中进行更改,而不是从另一个分支中进行更改,依此类推。 对于简单的场景,只在主分支上工作就足够了,当然它与svn的使用非常相似。 您必须找到自己的方式进入git,这最适合您的需要

作为一个粗略的指南:

提交存在以更新分支的状态,分支作为代码库的备选视图存在

若您的更改可以被视为在主分支的时间内向前移动,那个么您应该只使用提交。如果你要做的事情是主分支的另一个现实,你应该做一个不同的分支

在这种情况下,如果我了解您的情况,我会猜您真的在更新代码库的状态,所以我会提交您的更改


在这方面,Git类似于任何SCM。Git与分支的不同之处在于,分支非常容易创建,也有点容易合并。这意味着一个常见的工作流是将master分支到新功能的正在进行的工作中,然后进行编辑。当您满意时,您可以将您的分支合并到master中。这只是对直接提交的一个改进——你正在创建一个不稳定主控的替代现实,对其进行改进,然后将其合并回真正的主控——但净效果是一样的:你在替代现实中的提交最终在主控中着陆,就好像你一直在那里一样。所有这些狭条排版的最终目标是,您的提交在变化的时间中显示出一种线性行进。

我可以建议您看看Git流吗


有人说应该尽可能避免分支,但我认为git flow可以为人们同时处理不同功能的环境提供一个很好的解决方案。

git的一个优点是它适应了许多不同的工作方式

可以为每个更改创建分支,也可以根本不创建分支。 您可以使用开发人员之间共享的远程分支,也可以仅使用本地分支。 您可以合并分支并使分支保持可见,也可以重设基础并快进合并,这样历史记录就不会显示一条平行线。 我们在这里告诉你的任何事情都只是个人喜好的问题。我个人的偏好是总是为任何类型的变更创建一个本地分支机构。那是因为:

我没有启用ff,如果一个或一系列更改具有关联的合并提交,则很容易撤销这些更改。 很容易避免几个不同的更改混淆。我可能处于一个非紧急变化的中间,当一个紧急的人遇到。您可以使用git stash保存更改,但我发现单独的分支比较容易混淆。通常,我会在检查我的工作时发送一条“正在工作”的提交消息。然后,当我返回到分支时,我执行git reset HEAD~1来撤消最后一次提交[但保留更改]并继续工作。 拥有一个分支鼓励我创建更小的提交更少的更改,这使得以后更容易正确地合并它们。
<>这是一些考虑始终创建分支的原因。试一下,看看它是否适合你,然后把它作为一种新技术保留下来,或者如果你不喜欢它就放弃它。

以下是我的工作方式。您还可以看到Martin Fowler和其他人的一些好评论。好的讨论:

如果您想对发布的内容进行一些控制,那么这可能对您很适用。但事实上,您的功能很小,您可能与这种类型的工作流有关

每个特征的分支

主要原因:快速、灵活、高质量和自信的开发/部署/测试等。这让业务非常愉快

以点的形式,无组织且粗糙:

特征很小

每个功能的老式分支意味着分支大且寿命长,以避免必须集成,因为这是一种痛苦。这是一个恶性循环,因为该功能将与其他功能或主线越来越不同。特性应该尽可能原子化,您的开发过程应该遵循开闭原则。功能应该很小

无情地融合

它们应该被集成到集成分支中,几乎与您对它们的承诺一样频繁。这会立即提供反馈。你有一些类似于CI runni的东西 关闭集成分支,告知您的更改是否对其他工作没有负面影响。这将为您提供基于主干的集成的即时反馈,同时保持您的工作的组织性和可塑性

不要进行反向合并

或者至少要避开它们。反向合并是指您希望使用来自集成分支的内容来帮助您完成功能的工作。这是一种你没有独立故事的味道。一个合理的中间立场是采摘樱桃。成功提交不会在将来合并时引起问题

让一个特性分支充满提交,只实现特性应该做的事情,将使使用它更加灵活

从一开始就参与QA

这甚至不再是一个有争议的问题。我们都知道紧密反馈循环有多么重要。不应该有一个有QA员工的QA部门。QA应该是在不同或相同的人在不同时间佩戴的帽子

了解你的验收标准是什么,以及你将如何从一开始就证明这一点,这对于很多事情都是不可或缺的——包括每个功能团都有一个成功的分支

一个合适的DSL和一种普遍存在的语言see领域驱动设计是这个问题的核心。目前,StoryTeller是与产品所有者、回归/规范测试和行为驱动设计反馈进行最佳沟通的工具。它提供了其他工具无法提供的一件事,那就是与编写验收测试的人员进行沟通,以了解系统能够在技术造成的最小摩擦的情况下做什么。您只需单击链接、填写文本框并从下拉列表中选择即可选择要执行的操作。对于一个工具如何用它的正则表达式和英语解析功能来解释你的自由格式文本,没有人猜测

分享你的辛勤工作

合并时会有冲突。当工作由多个人完成时,这是生活中的一个事实。当您经常从功能集成到集成分支时,应该记住您解决的冲突。这是由git的Reerre完成的,但可以在其他系统中进行模拟,而无需太多努力。关键是建立一种将这些自动解决冲突共享给团队其他成员的方法

现在,任何试图集成该功能并且存在冲突的人都不必解决它。不需要开发人员来构建。如果需要,这是一个手动共享。我应该在大约一周内出版剧本,在幕后完成这项工作。如果您想自己做,请查看存储库中的.git/rr缓存文件夹。所有开发人员之间的简单同步是所需的最低限度

取出功能比放入功能更强大

这听起来可能违反直觉。但是在迭代结束时,您认为已经完成的特性可能无法正常工作,因为在整个构建上进行的最后一点测试使发布成为不可能。不管怎样,任何人都应该能够使用该功能并发布

因此,诀窍是不要将该特性从构建中删除。您在生成时忽略了问题功能。如果有时间,您可以在下一次迭代中集成该功能。发布构建应该是无痛的

不要在集成分支之外创建要测试的构建。创建一个单独的分支,该分支可以无情地重置并标记释放候选对象。将此分支重置为迭代的开始提交,并合并所有您知道有效的功能

没有冲突。还记得Reere之类的吗?如果您遵循这里的实践,任何人都应该能够做到这一点。这就是为什么需要分享艰苦的工作

关键是我们扔掉了所有以前的合并,必须重新进行。但记住我们的冲突解决方案,这现在是一件小事。如果有疑问,我们并没有真的把它们扔掉,它们仍然可以参考或使用。Git的pick axe功能使您在不知道从何处查找某些代码更改变得非常容易

巨大的重构

你的工作尽可能有条理。无论您选择在集成分支、发布候选分支上的某个时间点执行此操作,还是为其启动一个功能分支,您都有一种跟踪该工作的方法,并可以在必要时将其作为合并、重定基础或手动修补应用到另一个点

你可能遇到的任何困难都会因为你无情地分享你的冲突解决方案并不断地融合而得到缓解。正确的每分支功能依赖于持续不断的集成

切换开关是一种技巧

也有例外。你是一家大公司。您需要为一小部分早期采用者用户启用一项功能。现在,这是一个对业务非常重要的显式功能。那是我们都想去的地方,但我们大多数人都不想去

不得不做建筑设计 因为你不能有效地组织你的工作而发生的变化是一个简单明了的过程。有些团队还不够成熟,这可能是一个暂时可行的解决方案

这是Git流的改进

大多数这种工作方式都是从名为Git Flow的优秀文章开始的,这是一种成功的分支策略。这个过程的重要补充是,从一个公共点开始迭代中的所有特性。这将是你最后一次发布的内容。这使我们认识到,为了以最有效的方式向业务交付,功能必须表现出粒度、原子性和灵活性

另一个关键区别是没有反向合并到功能中。否则,您将无法在以后的迭代中排除此功能

如果你用旧工具,那就不好了

没有基于快照的历史记录会造成伤害,因为分支实际上是在复制另一个分支,这会很慢。没有分支起源的基础将使合并变得困难,因为您没有一个基础来比较开发的各个方面是如何变化的。拥有一个只支持连接的工具来支持您的工作,以便与每个人一起工作,还有许多其他问题


希望这有帮助

看到最初的SVN,但一般的想法也适用于GitThank,那是我以前读过的同一个网站,让我思考这个问题。