当向不熟悉软件配置管理的学生讲授SCM课程时,碰巧会出现“ What's the difference between checkin and checkout?”之类的问题。

它的一种变化是,这些学生对这些SCM概念感到困惑(他们反过来理解它们。)

那么,您可以用什么样的隐喻向此类受众解释这一至关重要的SCM概念呢?

评论

结帐=锁;签到=解锁;您需要排他锁来在执行操作的分支上编辑有问题的对象。

#1 楼

要向任何人解释某些内容,请尝试将其与他们(希望)已经熟悉的内容进行比较。
所以这就是为什么我只回答这样的问题:

将其视为到达住宿地点(酒店,度假村等):

(到达时)要做的第一件事就是checkin
(当您到达时)做的最后一件事情请参阅checkout

要对软件组件应用更改时,也适用类似的SCM概念...只是它以相反的方式应用:

您要做的第一件事(当您开始时)是checkout(或想像是借来的)。
您要做的最后一件事(当您完成时)是checkin(或想像把它还给别人) 。


注意:这适用于集中式系统(例如大型机环境中使用的系统...)。在git之类的系统中,“ checkout”概念的含义完全不同(这也是IMO的原因,在这两个系统中几乎没有混淆这两个概念的原因。)

评论


也许代码更像是一本图书馆书籍,而不是旅馆房间?

– Toby Speight
17 Mar 2 '17 at 10:24

这是一个非常幼稚的外行答案。我已经在源代码控制系统的内部工作了十年,因此我为您的问题添加了更深入的答案。

–吉里·克劳达(Jiri Klouda)
18/09/12在20:49

#2 楼

重要的是要注意,根据SCM系统的类型,术语“签入”和“签出”具有不同的含义。

TFVC,Subversion和Clearcase之类的集中式系统使用“排他”检出。这就像Pierre的书借用比喻,其中只有一个用户可以一次检出一个文件。

git之类的分布式系统具有“ checkout”命令,但这意味着完全不同。使用本地存储库时,git checkout用于在分支之间切换。

评论


关于分布式系统的要点Dave!实际上,这也是为什么我一开始(当我第一次了解GIT时)就非常困惑的原因。为了不使您的答案无效(通过适应我的问题),我对自己的答案进行了细化,以使其更加清晰。

– Pierre.Vriens♦
17年1月1日在18:24

我应该澄清一下:git checkout用于从存储库中签出对象。那可以是一个分支,也可以是一个文件。

–戴夫·斯沃斯基(Dave Swersky)
18年4月28日在19:51

#3 楼

对于集中式系统,请将其视为技术库。 (可能只是这种假想库的功能的想象力...)

如果您是文档的作者,则可以checkout库副本,进行更改,然后将其返回给库如果全世界都可以看到。

如果图书馆有数字副本,而我check it back in是一个文档,别人也checkout是一个文档,这可能会成为一个问题,我们都会进行更改,否则会发生冲突(合并冲突),可能难以解决。当最初的“修复”是专有的checks out功能时...


当然,对于大型项目,严重的合并冲突问题的发生率会降低(人们将从事不同的工作系统零件),因此几乎不需要checkout / checkout。而且由于设计上的分布式系统在某种程度上需要良好的合并功能以及许多其他好处,因此该概念在git和其他DVCS中并不存在

评论


那是另一种看待它的方式。尽管以我的经验,我认为添加“冲突”和“合并”之类的东西(如果他们甚至对结帐和签到还不满意)并不是一个好主意。

– Pierre.Vriens♦
17年1月1日在18:40

公平,我添加它是因为我能想到的主要原因是存在签出/签入的主要原因。如果您不知道该概念实际上有什么用处,则感觉要掌握一个概念特别困难。

–胸腺嘧啶
17 Mar 2 '17 at 21:06

#4 楼

以SCM存储库为主要主题,然后,




结帐从本地或远程存储库(到本地工作目录)中获取更改。

checkin会将更改放回本地或远程存储库(从本地工作目录)。


评论


谢谢这个答案。这确实是一种解释它的方式,尽管我仍然想知道您是否可以想到某种“隐喻”(就像我的问题一样)。例如。向您要教的人解释它,甚至不知道本地或远程存储库的真正含义。

– Pierre.Vriens♦
18年9月12日在21:17

的确,如果他们对存储库的内容一无所知,那么尝试进行检入和检出将毫无意义。现在,对于一般的源代码控制隐喻,您可以将其与财务会计/簿记进行比较。它从根本上跟踪资产价值的变化。您可以记录单个的单个更改或更改的组(例如“从A到B的旅行”,而不是出租车票+公交车票+火车票+ ...),但不要记录太大的组(例如“星期一的所有费用”)。同样,存储库会跟踪源代码更改(单个组还是不太大的组)。

–喜剧
18年9月12日在21:49

#5 楼




检出是修改存储库中对象分支的排他锁。

检入是排他锁的释放。



有两种源控制系统,具体取决于分支的最小单位。

1)每个存储库分支(CVS,SVN,GIT,Perforce 、。) ..等)

在分支整个存储库的产品中,签出通常会创建或启用对整个存储库的本地分支(副本)的修改。在那些产品中,检入经常不被使用,并成为提交操作的一部分,它一次签出远程分支,应用本地补丁并在单个操作中签入远程分支。您无需签入本地分支机构,因为它已被永久签出。 (注意:在GIT中,您不提交到远程分支,而是将本地提交推送到它。严格的语法差异。)

2)每个对象分支(ClearCase,AccuRev,Oracle ADE)

在分支单个对象(例如目录,文件等)的产品中。签入和签入的概念适用于每个分支的每个对象。您将锁定对象以通过签出对其进行修改,并通过签入将其释放。在那些产品中,您通常在私有分支上工作,在该分支上锁不会阻止任何人工作,并且在将本地分支合并到共享分支时,对象也会在shard分支(主分支,主分支,功能分支等)上签出。 )解决合并冲突,并在共享分支上签入对象。这允许多个人同时“提交”到共享分支,只要他们不修改相同的对象即可。

评论


嘿Jiri,谢谢您的回答。对于您提到的那两种,我会同意。但是,在大型机领域的SCM工具中(我的经验是源自于此),人们并没有考虑“锁定”……您能想到一种为答案添加第三种方法的方法吗?

– Pierre.Vriens♦
18年9月12日在21:13

您能举一个不属于这两类产品的例子吗?我可以告诉您它是否适合2个,如果确实有3个,则可以添加第三个。签出和签入是分支上的操作,赋予并释放对其进行修改的权利。因此,对于这个问题,自然而然地划分产品分支(整个存储库或单个对象)是很自然的。我不知道两者之间有什么关系吗? Perforce和Subgit中的子树分支本质上是第一类。锁只是“专有权”的不同名称。

–吉里·克劳达(Jiri Klouda)
18-09-12在22:47

顺便说一句,前面提到的库隐喻确实是一个很好的隐喻。结帐时,您将获得该书的专有权利。您将其带回家并随心所欲地处理它。阅读它,甚至在空白处乱写笔记,在您将书签出的同时,没有人可以修改这本书。例如删除其某些页面或突出显示某些行。当您检入该书时,人们可以在图书馆看书,那里的图书馆员的警惕性不允许任何修改(故意破坏)或将其带回家。它确实将对这本书的更改序列化。

–吉里·克劳达(Jiri Klouda)
18年9月12日在22:58

为了继续类推,在库的不同分支中,同一本书可能在那里进行了不同的修改,或者完全不变或根本没有变化。其他人可以同时将其检出(即,每个分支都检出)。现在,原始作者正在研究第二版,可以说是一个高级分支。他可以阅读多个分支的注释,将它们合并在一起,签出主分支并签入第二版。图书馆的每个分支机构都将通过购买第二版来刷新其副本。他们可以丢弃第一个版本,也可以将仍然有用的笔记从页边距复制到新版本。

–吉里·克劳达(Jiri Klouda)
18/09/13在9:23