GIT 分支 - 我们可以只靠一个 master 生存吗?
GIT branching - can we survive with just a master?
我是 GIT 的新手,我正在寻找在我们的 4 个环境中管理源代码的方法,在致力于错误修复和新开发的分布式开发团队之间,同时保持它尽可能精简和直接可能的。我们有两个冲刺团队在处理相同的源代码。
话虽如此,跨环境只有一个 master 分支,这样我们就不必处理不同分支之间的合并代码,会有什么问题吗?我没有看到很多只有一个大师的示例模型,因此不确定结果如何。
谢谢。
分支名称的数量在很大程度上是无关紧要的。无论您有多少分支名称,您都必须处理合并代码——合并只是并行工作的副产品,其中 A 处理代码(在 A 的存储库副本中),而 B 也处理代码(在 B 的存储库副本中)。在某个时候,某人——A、B、第三者或所有这些人的集合——然后必须一起工作以合并完成的工作由 A 和 B.
如果您为并行工作的每一位提供分支名称,这种组合实际上 更容易 ,因为否则您拥有的名称是原始的 Git 哈希 ID,它出现完全随机,完全不适合人类交流。不要害怕分支名称:它们很有帮助。
can there be any issues with having only one master branch across environments so that we dont have to deal with merging code between different branches
您可以只使用一个分支,但这不会阻止合并的发生——至少当有不止一个开发人员贡献代码时。事实上,当每个人都在同一个分支上工作时,你会发现自己 更频繁地 合并,比如 master
,因为每次你想要 push
,你首先必须整合上游变化。每当你说 git pull
让同事的贡献进入你的工作分支时,git 实际上是在做一个 fetch
然后是一个 merge
.
但是,如果每个开发人员(或正在处理的功能)至少有一个分支,那么每个开发人员都会推送到 his/her 自己的分支并决定何时合并。这往往比在你不准备的时候被迫合并要方便得多。
Git非常擅长合并。你不必害怕它。
总结:是的,你可以只使用master
,但这不会让你的生活更轻松,我不推荐它
Having said that, can there be any issues with having only one master branch across environments so that we dont have to deal with merging code between different branches? I have not seen many example models with just one master, hence not sure how it will turn out.
您对此了解不多,因为它抛弃了 Git 的优势之一,廉价的分支和轻松的合并。你仍然会合并,因为 push
和 pull
将不得不将你的本地主控与远程主控合并,但是随着每个人在他们想要的时候推拉到 master
每个人的工作都会全部混合在一起 master
会变得一团糟。
但你走在正确的轨道上。您不想避免分支,而是想 避免长 运行 分支 。没有 develop
或 qa
分支。将 master
作为您的单个长 运行 分支是一个很好的工作流程。
诀窍是永远不要直接提交给master。相反,您总是想在 短暂的 "feature branches" 中工作,然后合并到 master
。功能分支,顾名思义,是针对单个明确指定的功能(或错误)的。该功能的所有工作和 QA 都发生在功能分支上。一旦完成,它将合并到 master
。 master
可以直接投入生产,或者您可以标记特定版本。
这使 master
始终处于良好的状态,可以进行处理和释放。它使正在进行的工作与 master
清楚地分开,避免错误地将损坏的代码放入 master
。它减慢了 master
更改的频率,使每个人都更容易协调。它允许您同时处理许多功能,同时将它们清楚地分开。
保持简单并避免复杂合并的诀窍是使用 rebase
.
始终将您的分支保持在最新的 master
上
基本工作流程如下所示...
- 使您的
master
保持最新:git checkout master; git pull --rebase
- 为您的功能制作并签出功能分支:
git checkout -b issue/#123
- 编辑、工作并提交到您的功能分支。
- 定期与
master
保持同步。
- 让您的
master
保持最新。
- 在
master
的基础上重写您的作品:git checkout issue/#123; git rebase master
- 当您的工作完成、测试、通过 QA 等时...
- 让您的
master
保持最新。
- 在
master
的基础上重写您的作品。
- 上次测试你的分支。这将与合并后的代码完全相同,因为没有要合并的内容。
- 合并到
master
。这合并没有任何改变,你已经是最新的,但它对历史很重要:git checkout master; git merge --no-ff issue/#123
- 删除你的功能分支:
git branch -d issue/#123
- 转到 1
请注意,更新是通过 rebase
完成的。这避免了一堆 "bookkeeping" 合并混淆了历史。相反,使用 rebase
你假装你的分支一直都是在最新的 master
上写的。我建议您在 .gitconfig
中进行设置
[pull]
rebase = preserve
然后 git pull
总是作为变基完成,但会保留分支。这是完全安全的。
最后真正的合并是用 --no-ff
完成的(没有快进)以保证合并完成,所以分支保留在历史中。合并提交也是一个写分支内容的地方,并为它解决的问题提供 link。
结果是如下所示的历史记录:
J - K - L [issue/#123]
/
A ---------- E ---------- I [master]
\ / \ /
B - C - D F - G - H
这是两个已完成的功能 B - C - D
和 F - G - H
,以及一个开放的功能分支 J - K - L
。出于考古目的,分支仍然存在 "feature bubbles",因此未来的开发人员知道 B - C - D 是作为一个单元完成的,并且可以参考合并提交 E 以获取更多信息。尽管所有的分支历史都是线性的; git log
将以正确的顺序报告提交。
这比简单地提交给 master
需要做更多的工作,但它会产生一个干净、简单的历史记录,高质量 master
作为您工作的基础,并避免开发人员相互冲突.版本控制是一种工具,就像您的编辑器或 shell,要有效地使用它需要一些努力。
我是 GIT 的新手,我正在寻找在我们的 4 个环境中管理源代码的方法,在致力于错误修复和新开发的分布式开发团队之间,同时保持它尽可能精简和直接可能的。我们有两个冲刺团队在处理相同的源代码。
话虽如此,跨环境只有一个 master 分支,这样我们就不必处理不同分支之间的合并代码,会有什么问题吗?我没有看到很多只有一个大师的示例模型,因此不确定结果如何。
谢谢。
分支名称的数量在很大程度上是无关紧要的。无论您有多少分支名称,您都必须处理合并代码——合并只是并行工作的副产品,其中 A 处理代码(在 A 的存储库副本中),而 B 也处理代码(在 B 的存储库副本中)。在某个时候,某人——A、B、第三者或所有这些人的集合——然后必须一起工作以合并完成的工作由 A 和 B.
如果您为并行工作的每一位提供分支名称,这种组合实际上 更容易 ,因为否则您拥有的名称是原始的 Git 哈希 ID,它出现完全随机,完全不适合人类交流。不要害怕分支名称:它们很有帮助。
can there be any issues with having only one master branch across environments so that we dont have to deal with merging code between different branches
您可以只使用一个分支,但这不会阻止合并的发生——至少当有不止一个开发人员贡献代码时。事实上,当每个人都在同一个分支上工作时,你会发现自己 更频繁地 合并,比如 master
,因为每次你想要 push
,你首先必须整合上游变化。每当你说 git pull
让同事的贡献进入你的工作分支时,git 实际上是在做一个 fetch
然后是一个 merge
.
但是,如果每个开发人员(或正在处理的功能)至少有一个分支,那么每个开发人员都会推送到 his/her 自己的分支并决定何时合并。这往往比在你不准备的时候被迫合并要方便得多。
Git非常擅长合并。你不必害怕它。
总结:是的,你可以只使用master
,但这不会让你的生活更轻松,我不推荐它
Having said that, can there be any issues with having only one master branch across environments so that we dont have to deal with merging code between different branches? I have not seen many example models with just one master, hence not sure how it will turn out.
您对此了解不多,因为它抛弃了 Git 的优势之一,廉价的分支和轻松的合并。你仍然会合并,因为 push
和 pull
将不得不将你的本地主控与远程主控合并,但是随着每个人在他们想要的时候推拉到 master
每个人的工作都会全部混合在一起 master
会变得一团糟。
但你走在正确的轨道上。您不想避免分支,而是想 避免长 运行 分支 。没有 develop
或 qa
分支。将 master
作为您的单个长 运行 分支是一个很好的工作流程。
诀窍是永远不要直接提交给master。相反,您总是想在 短暂的 "feature branches" 中工作,然后合并到 master
。功能分支,顾名思义,是针对单个明确指定的功能(或错误)的。该功能的所有工作和 QA 都发生在功能分支上。一旦完成,它将合并到 master
。 master
可以直接投入生产,或者您可以标记特定版本。
这使 master
始终处于良好的状态,可以进行处理和释放。它使正在进行的工作与 master
清楚地分开,避免错误地将损坏的代码放入 master
。它减慢了 master
更改的频率,使每个人都更容易协调。它允许您同时处理许多功能,同时将它们清楚地分开。
保持简单并避免复杂合并的诀窍是使用 rebase
.
master
上
基本工作流程如下所示...
- 使您的
master
保持最新:git checkout master; git pull --rebase
- 为您的功能制作并签出功能分支:
git checkout -b issue/#123
- 编辑、工作并提交到您的功能分支。
- 定期与
master
保持同步。- 让您的
master
保持最新。 - 在
master
的基础上重写您的作品:git checkout issue/#123; git rebase master
- 让您的
- 当您的工作完成、测试、通过 QA 等时...
- 让您的
master
保持最新。 - 在
master
的基础上重写您的作品。 - 上次测试你的分支。这将与合并后的代码完全相同,因为没有要合并的内容。
- 合并到
master
。这合并没有任何改变,你已经是最新的,但它对历史很重要:git checkout master; git merge --no-ff issue/#123
- 让您的
- 删除你的功能分支:
git branch -d issue/#123
- 转到 1
请注意,更新是通过 rebase
完成的。这避免了一堆 "bookkeeping" 合并混淆了历史。相反,使用 rebase
你假装你的分支一直都是在最新的 master
上写的。我建议您在 .gitconfig
[pull]
rebase = preserve
然后 git pull
总是作为变基完成,但会保留分支。这是完全安全的。
最后真正的合并是用 --no-ff
完成的(没有快进)以保证合并完成,所以分支保留在历史中。合并提交也是一个写分支内容的地方,并为它解决的问题提供 link。
结果是如下所示的历史记录:
J - K - L [issue/#123]
/
A ---------- E ---------- I [master]
\ / \ /
B - C - D F - G - H
这是两个已完成的功能 B - C - D
和 F - G - H
,以及一个开放的功能分支 J - K - L
。出于考古目的,分支仍然存在 "feature bubbles",因此未来的开发人员知道 B - C - D 是作为一个单元完成的,并且可以参考合并提交 E 以获取更多信息。尽管所有的分支历史都是线性的; git log
将以正确的顺序报告提交。
这比简单地提交给 master
需要做更多的工作,但它会产生一个干净、简单的历史记录,高质量 master
作为您工作的基础,并避免开发人员相互冲突.版本控制是一种工具,就像您的编辑器或 shell,要有效地使用它需要一些努力。