如何理解git checkout

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何理解git checkout相关的知识,希望对你有一定的参考价值。

首先需要知道工作区(working diretory)和暂存区(Stage)这两个概念。工作区的该概念不仅包含你实际操作、更改的文件还应当包括当前修改但未add存入暂存区的文件变化信息,暂存区的作用则是临时存储文件的变化信息,在git add file操作之后,暂存区中将记录file文件上的修改信息。暂存区的存在更细化了时间节点,要知道commit的往往是有重大改变的版本或者是在一次修改工作整体完成之后才使用commit。而在这之间需要保存的修改,自然需要一个缓存区暂时存放。
廖雪峰的git教程中在“撤销修改”部分中,提到了几种情景和相应的git checkout与git reset命令。通过我的分析,在这个更直接地分析这两个命令的含义。
git checkout -- file;撤销对工作区修改;这个命令是以最新的存储时间节点(add和commit)为参照,覆盖工作区对应文件file;这个命令改变的是工作区
git reset HEAD -- file;清空add命令向暂存区提交的关于file文件的修改(Ustage);这个命令仅改变暂存区,并不改变工作区,这意味着在无任何其他操作的情况下,工作区中的实际文件同该命令运行之前无任何变化
参考技术A check一下database,然后take out一个版本到你的工作区,这样你的工作区就被仓库的内容给覆盖掉了。是这样吧...

为啥 git developer 为命令 git checkout 选择了 checkout 这个词?

【中文标题】为啥 git developer 为命令 git checkout 选择了 checkout 这个词?【英文标题】:Why did git developer choose the word checkout for the command git checkout?为什么 git developer 为命令 git checkout 选择了 checkout 这个词? 【发布时间】:2021-12-06 20:55:54 【问题描述】:

我试图理解为什么 git 开发人员为命令“git checkout”选择“checkout”这个词。将结帐一词翻译成葡萄牙语(我的母语)并没有阐明“结帐”一词的含义。虽然我了解该命令对我的 git 项目的影响,但如果该命令是 git abrakadabra,对我来说听起来是一样的。

【问题讨论】:

@meagar 这不是基于意见的,版本控制条款有明确的历史记录。它源于 1982 年的 rcs corcs ci。签入和签出修订版,就像一本书和一个图书馆。 【参考方案1】:

实际上,你需要在使用 git 时使用 git checkout,因为这个命令会告诉你你现在在哪个分支上

试试:

git checkout

输出:

Your branch is up to date with 'origin/Master by example'

如果这对你有帮助,请告诉我

【讨论】:

【参考方案2】:

签出文件的想法并非起源于 Git。

在英语中(至少),当你从图书馆借一本书时,你被称为“check the book out”:你从图书馆取了这本书,并承诺稍后归还。当您拥有这本书时,其他人就无法使用这本书,因为图书馆不再提供它。

其他源代码控制系统的工作方式类似。签出文件意味着只有您可以编辑该文件。任何其他尝试签出文件的人都必须等到您重新签入才能对其进行编辑。

这种类型的独占访问不适用于 Git(作为分布式源代码控制系统),但保留该术语来描述从存储库中选择一个分支来填充工作目录的想法(实际上,检查许多不同的一次编辑所有文件,直到您通过检查另一个分支将它们“放回去”)。

【讨论】:

AFAIK 版本控制系统的第一次使用是 1982 年的 rcsrcs co(签出)和 rcs ci(签入,已转向“提交”)。跨度> 【参考方案3】:

我将从我的原型书中复制一些内容。不过,该术语并非特定于 Git(如 chepner already said)。

因此,[版本控制系统或] VCS 充当源文件的数据库,以某种方式 检索特定版本的文件。这个数据库被称为repository。当您添加源文件的更新版本时,数据库会将更新的源存储在存储库中。文件的每个版本也称为修订版,因此如果您修复拼写错误并将更新后的文件输入到存储库中,您现在拥有该文件的另一个修订版。

用作动词,to version表示置于 VCS 的控制之下。用作名词时,version 表示取自 VCS 的特定版本(一个文件或一组文件)。名词形式通常带有附加修饰语,如短语kanga.c的旧版本或roo.c的2.1版。如果没有列出特定文件,我们通常指的是所有内容,或者至少是最近讨论的所有内容:2.1 版(存储库中的所有内容,或我们正在讨论的特定文件和/或目录) . revision 这个词总是一个名词,但在其他方面与 version 含义相同。

另一个动词,to check in,意思是存储到VCS中。如您所料,如果我们可以签入,我们也可以签出,意思是从VCS中提取。一些 VCS 添加了动词 to update,它们可以用来区分提取旧版本(您签出)和升级到最新版本和(我们希望)最好的(您更新)。 Mercurial 使用 update 作为 checkout 的纯同义词。

签入有时用连字符(签入),或写成一个词,签入。这些可以避免歧义:我将签入roo.c(查看代码以查看是否有小袋鼠进入)vs. 我将签入roo.c(存储新修订)。 Check out 同样经常写成一个词,checkout,或连字符,但动词形式仍然是 check out,读起来比结帐

较新的 VCS 添加了更多的名词和动词词:

提交签入的含义大致相同,但我们稍后会看到一些技术差异。作为名词,a commit 也指一个版本,但特别是一个以 commit 的动词形式存储的版本。 克隆基本上是一个花哨的术语,用于复制整个存储库,通常是通过计算机网络从不同的机器上复制,例如,从网站。作为名词,克隆是通过克隆制作的存储库。 To fork 在功能上与克隆相同,但通常使用 不同的意图。因此,名词形式 a fork 与 clone 相同,但那些制作 fork 的人可能打算让他们的工作在很少或没有重新同步的情况下发散(可能永远或可能在有限的时间内) ,和/或让其他人通过他们的分叉而不是原始版本进行协作。

解决Schwern's comment 关于rcs corcs ci,值得注意的是一些历史项目:

RCS 的结帐动词默认情况下 锁定(版本存储)文件:它在工作树中为您提供了一个只读文件。你必须使用co -l 来获得一个锁,它为你提供了一个可以更新的读/写文件。

RCS 的 coci 过期 SCCS 的结帐/签入。但是,在sccs 中,我们有两个单独的提取动词:get 表示获取只读副本edit 表示锁定文件并获取读/写副本时间>。有关详细信息,请参阅例如 the Oracle documentation。 “签入”命令拼写为delta

我认为,RCS 是第一个使用沿用至今的术语的版本控制系统。它的动词保留在 CVS(并发版本系统)和 Subversion(“CVS 做得更好”)中,并从那里传播到所有现代版本控制系统(请参阅 Wikipedia 以获得相当大的表)。现代 SCCS 是早期 Unix SCCS 的重新实现,它本身可能最多松散地基于早于它的 IBM SCCS。

【讨论】:

以上是关于如何理解git checkout的主要内容,如果未能解决你的问题,请参考以下文章

再谈git和github-深入理解

理解 Git

【Git原理】深入理解git add和git commit命令

Git每天1分钟系列——3分钟理解Git

如何使用Git

git内部原理