我几乎每天都阅读SO,大多数都有关于源代码控制的帖子。我有几个问题。我将以SVN为例。
1)有一个团队(小型,大型的剂量问题)。在早上,每个人都会检查代码以开始工作。中午A人提交,而B人仍在工作。 B人提交时会发生什么? B人将如何知道有更新的文件?
2)我假设第一个问题的答案是“运行一个告诉你的更新命令”,好的,所以B人发现他们整个上午一直在工作的文件发生了变化。当他们看到udpated文件时,似乎人A已经重新编写该文件以获得更好的性能。 B人做什么?好像整天都浪费时间。或者,如果他们提交了他们的版本,那么浪费了人A的时间?
3)什么是分支机构?
谢谢,如果有人知道一个非专业人士的术语pdf或解释它的东西会很棒。
答案 0 :(得分:5)
1&& 2)
SVN :当B尝试提交时,会出现错误消息,说明他没有最新版本的代码。他需要做一个svn update
并将A人所做的改变与他自己的改变合并。见How to Resolve SVN conflicts。
GIT :因为您拥有自己的本地存储库,所以您可以自由提交。当您将更改(git push
)推送到必须合并的远程存储库时。见Resolving Merge Conflicts in GIT
答案 1 :(得分:5)
1)假设有一个中央存储库(SVN和CVS的情况,但不一定是Git,Bazaar,Mercurial等),并且A人提交(然后推送提交,它只传输差异并且将消息提交到中央存储库),B人员应该手动更新它的副本。
2)在这种情况下,是的,有人会浪费时间。 SCM系统(源代码管理)无法通过组织问题来解决团队问题。这当然是极端的情况。大多数情况下,每次提交只会有微小的差异(这里的次要定义是任何特定文件不应该被完全或部分重写),如果这些修改没有触及B正在处理的部分, SCM软件将能够将这些提交合并到一个工作文件中。
这里的另一种情况是两个人改变同一文件的相同区域(比如一个函数)。当发生此类冲突时,SCM软件将帮助您选择要使用的更改,或者甚至让您同时使用这两种更改。
3)分支是提交历史记录行:
feature-> /R-S-T
master-> A-B-C-D-E-F
bugfix-> \J-K-L-M
此处,feature
,master
和bugfix
是分支,字母是特定提交。对于分支master
,最新提交(每个文件的最新版本)为F
。另一方面,分支feature
的最新提交是T
和,它仅包含来自分支{{1}的提交A
和B
}。提交master
,C
,D
和E
中所做的任何更改都不会包含在该特定分支中。它可以改写为:
F
现在,分支对于将工作流划分为不同的隔离区非常重要,并将工作重点放在特定部分上。想象一下分支feature-> A-B-R-S-T
master-> A-B-C-D-E-F
bugfix-> A-B-C-J-K-L-M
是稳定代码所在的位置,并想象我们正在分支master
上实现一个尚未准备好发布的新功能。现在想象插件系统已经改变,重要的错误修正被提交到feature
分支,并且,因为我正在实现的功能依赖于插件系统,我需要转移这些提交(master
通过C
)分支F
。为此,您可以向SCM软件发出feature
(我在这里使用Git作为指南)命令,以便:
rebase
所以现在你已经完成了分支feature-> /R-S-T
master-> A-B-C-D-E-F
bugfix-> \J-K-L-M
的所有工作。要将提交feature
,R
和S
转移到T
,请发出master
命令:
merge
这是分支基础。你可以对分支机构做很多其他很酷的事情。希望不会太长并且有所帮助:P
答案 2 :(得分:2)
作为补充说明,如果您计划完全重写文件,那么让团队成员了解相同的功能通常是有礼貌的,以避免累积合并的痛苦。
答案 3 :(得分:1)
答案 4 :(得分:1)
1& 2取决于您使用的源代码控制,但必须执行某种合并。分支是从主干(主版本)分叉的代码版本。
答案 5 :(得分:1)
答案 6 :(得分:0)
我会说,经常提交。在每次提交之前,请更新。
我建议阅读本文档,它很好地解释了集中式和分散式(更好的)版本控制系统的不同工作流程:http://wiki.bazaar.canonical.com/Workflows
答案 7 :(得分:0)
嗯,对于Git,您基本上将整个项目从“主”分支复制到您自己的个人分支中,您可以在其中修改和提交对您自己的个人分支的更改,如果您认为它很好,您可以将您的个人分支合并到主人。
答案 8 :(得分:0)
我在下面说的对svn有效,因为git或mercurial事情略有不同(我会说更容易)。
1)在提交 -ing之前,B人员应该在他自己的本地副本中更新和合并更改(她也可以检查是否有变化)。如果他只是尝试提交,她会收到一条消息,说明他的本地svn副本已过期。
2)B人遇到麻烦,因为合并并不容易(SVN不会自动管理,冲突)...如果真的太难B会有再想一想她的变化。
这个问题确实没有解决方案。某些版本控制系统允许某种锁定,但它会引发其他问题(文件可能长时间保持锁定状态,并且锁定器旁边的任何人都可以在其间工作,即使对于容易合并的chages也是如此)。只需经常做出小改动,并与其他程序员(通过真实会议,IRC,电子邮件或任何其他方式)交谈,以避免这种情况发生。
3)分支对于分布式版本控制系统非常有用。它存在于svn中的致残版本中。只是你在另一个目录中复制当前repo的当前目录,这两个目录每个都有自己的生命周期(比如说只有一个用于修复错误,另一个用于新功能和进化)并且在某些时候你尝试合并两个repos之间的更改,比如尝试在新功能分支中移植bugfix,或者在旧功能分支中移植新分支的一些新功能。
答案 9 :(得分:0)
2)此时,B必须将A所做的更改与他自己的更改合并。如果他们已经处理了文件中代码的不同部分,则源代码控制工具通常可以自动执行此操作。如果他们的变化重叠,它可能会成为一项非常可恶的任务,但这种情况很少发生。
3)分支就像是存储库的一部分的副本,您可以在其中与主要开发线分开工作(提交更改) - 这可用于各种目的,例如:当你有旧的版本,你想提供错误修正,而不强迫用户更新到当前版本(大多数大型软件项目都这样做)。
答案 10 :(得分:0)
我想你需要了解更多关于SCM的工具。您怀疑的这种操作在开发环境中非常常见。以下是关于SVN和Git书籍的建议:
好读: - )
答案 11 :(得分:0)
在SVN中,B会在B尝试更新他的副本或办理登机手续时知道A的变化。在GIT中,他会发现他何时尝试将更改提取到他的本地存储库或将其更改推送到主。 (实际上,我不知道GIT,所以我要继续我所知道的Mercurial。)
在这种情况下,无论您做什么,无论您使用何种版本控制,都会遇到问题。锁定VCS的唯一优点是它会让A或B知道另一个正在使用该程序,但这可以通过其他方式完成。正确的做法是让每个人都意识到发生了很大的变化,并从那里进行协调。但实际上,这并不经常发生。大多数情况下,如果A和B正在处理文件,他们的更改将轻松正确地合并。
分支是一个不同的“最新版本”,因此不是每个人都必须始终在同一行代码开发上工作。
分支的一个用途是开发一个需要很长时间的功能或其他东西,而不会在部分提交时弄乱主线。
另一个是维护发布版本。而不是向客户发送最新版本(可能不完全有效,并且可能包含客户尚未支付的功能)来修复错误,修复发布分支上的错误并将其发送出去。它对客户的破坏性要小得多。 (只要确保头版本上的错误也已修复。)
答案 12 :(得分:0)
我不能推荐足够的Eric Sink Source Control HOWTO。 它将为您提供所寻求的答案,并为您提供一般的源控制。