签入和签出有什么区别?


14

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

与此不同的是,这些学生对这些SCM概念感到困惑(反过来,他们也理解它们)。

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


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

Answers:


8

要向任何人解释某些内容,请尝试将其与他们(希望)已熟悉的内容进行比较。

这就是为什么我只回答这样的问题:

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

  • 非常第一你做的(当你到达)的事情是checkin
  • 非常最后你做的(当你离开)的事情是checkout

当您想对软件组件进行更改时,也可以采用类似的SCM概念...除此之外,还可以采用其他方法

  • 非常第一你做的(当你开始)的事情是checkout(或把它想借用它)。
  • 非常最后你做的(当你完成)的事情是checkin(或把它想给它回来)。

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


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

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

6

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

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

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


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

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

4

对于集中式系统,请将其视为技术库。(可能是这种假想库如何发挥作用的想象力……)

如果您是文档的作者,则可以checkout将库复制,进行更改,然后check it back in将其返回给库以供全世界查看。

如果图书馆拥有数字副本,并且我checkout有一个文档,另一个人还有checks out一个文档,我们都进行更改,那么将会出现问题(合并冲突),这可能很难解决,这可能会成为一个问题。那么最初的“修复”是排他性checkout功能...


当然,对于大型项目的关键合并冲突问题的几率降低(人会使用的系统的不同部分),这样checkout/ checkin不需要几乎一样多。而且由于设计上的分布式系统在某种程度上需要良好的合并功能以及许多其他好处,因此该概念在git和其他DVCS中并不存在


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

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

2

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

  • 结账越来越改变从本地或远程仓库(进入本地工作目录)。
  • 是把变回的本地或远程存储库(从本地工作目录)。

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

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

1
  • 检出是修改存储库中对象分支的排他锁。
  • 签入是互斥锁的释放。

根据分支的最小单位,有两种源控制系统。

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

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

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

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


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

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

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

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