Git使用的术语

好像我必须学会使用git。 这可能是一件好事(TM)。 不过,阅读在线指南和手册,我无法理解术语。 一切都是根据自己或其他不明原因的术语来定义的(做一个“man git”,你明白我的意思)。

那么,还有更多类似DAG的术语定义结构,包括以下的一些(全部来自git手册页!)。 也许用文件系统作为出发点,而不是假设读者熟悉svn(我不知道)。

  • 回购
  • 知识库
  • 一个混帐
  • “混帐”
  • 指数
  • 克隆
  • 承诺
  • 上游
  • 标签
  • 档案
  • 补丁
  • 服从
  • 变更
  • 档案
  • 目的
  • 子模块
  • 的Refspec
  • 历史

虽然我可以find一些解释,他们通常是在另一方面。 还有一些其他的术语,我知道从其他上下文(如UNIX差异)。 不过其他一些我以为我知道…

我已经知道有一些存储库(类似于gits?和/或trees?upstream?),您可以将其复制(克隆?分支?)以将文件物理地存储到硬盘上。 那么有分支(类似于变更?),标签和提交(类似于补丁?),但是它们的区别不明确。 什么文件做什么修改? 什么使我的文件保持在本地,什么可能(天堂禁止)提交我的代码到互联网?

什么是推荐的工作方式,涉及分支机构,标签和提交 – 因此可以轻松地在各个版本之间进行交换,以及从公共可用的gits中导入更新。

// T,咬他的舌头来控制他的挫败感

这是一个试图完成你的词汇表(从我的头顶,试图用我自己的话):

  • 仓库 :这是你的对象数据库是你的历史和configuration存储。 可能包含几个分支。 它通常也包含一个工作树。

  • 一个混帐,“混帐”:从来没有听说过,对不起。 “git”可能描述了软件本身,但我不确定

  • 索引,暂存区域:这是工作树和存储库之间的“caching”。 您可以将更改添加到索引,并逐步构build您的下一个提交。 当你的索引内容是你喜欢的,你可以从它创build一个提交。 也用于在失败合并期间保留信息(您的方,他们的方和当前状态)

  • 克隆:存储库的一个克隆(“只是另一个存储库”)或这样做的行为(“克隆存储库(创build一个新的克隆)”)

  • 提交:在某个特定时间的项目状态。 包含一个指向它的父提交的指针(在合并的情况下:多个父指针)和一个指向此时的目录结构的指针。

  • 分支:不同的发展路线。 git中的分支只是一个指向提交的“标签”。 您可以通过父指针获取完整的历史logging。 默认情况下分支只在您的存储库本地。

  • 树:基本上是一个目录。 这只是一个文件(blob)和子目录(树)的列表。 (如果使用子模块,该列表还可能包含提交,但是这是一个高级主题)

  • 上游:在克隆一个仓库之后,你经常把这个“原始”仓库称为“上游”。 在混帐它的origin

  • 头:一个分支的顶级提交(提交标签指向)

  • HEAD:描述当前签出的提交的符号名称。 通常是最顶层的提交

  • 版本:可能与提交相同。 也可能意味着你的项目的发布版本。

  • 标记:提交给你的一个提交(或树,或blob)的描述性名称。 也可以包含一个消息(例如changelog)。 标签可以用GPG进行encryption签名。

  • 归档:一个简单的档案(.tar,.zip),没有什么特别的和git。

  • 补丁:一个提交导出为文本格式。 可以通过电子邮件发送并由其他用户应用。 包含原始的作者,提交消息和文件的差异

  • 提交:不知道。 提交补丁到一个项目可能?

  • changeset: “commit”的同义词

  • 存储: Git允许你“存储”更改。 这给你一个干净的工作树,没有任何改变。 之后他们可以被“popup”被带回来。 如果您需要暂时处理不相关的更改(例如,时间关键的错误修复)

  • 对象:可以是committreeblobtag 。 一个对象已经关联了它被引用的SHA1哈希值(提交的id为deadbeaf ,树decaf )。 共享相同对象的所有存储库之间的散列值相同。 它还可以提高存储库的完整性:在不更改所有子提交的散列的情况下,您不能更改以前的提交。

  • (module,)子模块:包含在另一个存储库(例如外部库)中的存储库。 先进的东西。

  • revspec: revspec(或revparseexpression式)通过所谓的扩展SHA1语法(例如HEADdeadbeaf^! master~4^2origin/master..HEADdeadbeaf^! ,…)描述某个git对象或一组提交)

  • refspec: refspec是描述在取或推操作期间在远程和本地引用之间完成的映射的模式

  • 历史:在提交返回第一次提交之前描述所有的祖先提交。


你没有提到的东西,但可能是很好的知道:

你所做的一切都是你的仓库的本地(或者由git init或者git clone git://url.com/another/repo.git )。 在git中只有一些与其他仓库(又名interwebz)交互的命令,包括clonefetchpullpush

推拉用于同步存储库。 从另一个存储库中fetch es对象,并将它们与当前分支合并。 Push用于进行更改并将其push送到另一个存储库。 你不能推单提交或更改,你只能推一个提交包括其完整的历史。

一个存储库可以包含多个分支,但不需要。 git中的默认分支叫做master 。 你可以创build尽可能多的分支,合并与git是一块蛋糕。 分支是本地的,直到你运行git push origin <branch>

一个提交描述了一个完整的项目状态。 这些状态可以相互比较,产生一个“差异”( git diff origin/master master =查看origin/mastermaster之间的差异)

Git在准备提交时非常强大。 这里的关键要素是“指数”(或“中转区”)。 您可以将单个更改添加到索引(使用git add ),直到您认为索引看起来不错。 git commit激活了你的文本编辑器,你需要提供一个提交信息(为什么以及如何做出这个改变); input你的提交信息之后,git将创build一个新的提交 – 包含索引的内容 – 在前一个提交的顶层(父指针是前一个提交的SHA1)。

Git附带的文档正是你在找什么。

 $ git help glossary 

在学习如何使用git时,我发现这本(免费)书非常有用: http : //progit.org/ 。 这本书也以印刷forms存在。

我认为学习git的最快捷方式可能是拿起一本书或教程来教给你基本的概念和术语。

另一个学习Git的好资源是Edgecase的Git Immersion 。 试图通过手册页来学习Git可能是非常困难的,有一个短暂的,陡峭的学习曲线,必须先克服。 首先需要介绍DCVS(分布式版本控制系统)的概念。

按@fulhack推荐的Progit也是非常好的。

我也可以强烈推荐Think Like Git 。 这里的rebase的解释是值得的黄金重量。

Git Parable是我理解Git的最好方式

想象一下,你有一台没有任何东西的电脑,只有一个文本编辑器和一些文件系统命令。 现在想象你已经决定在这个系统上写一个大型的软件程序。 由于您是一名负责任的软件开发人员,因此您决定需要发明某种方法来跟踪软件的版本,以便检索以前更改或删除的代码。 以下是关于如何devise一个这样的版本控制系统(VCS)的故事以及这些deviseselect背后的推理。

我想你可能会喜欢这篇文章: 计算机科学家的Git

理解使用git的另一个重要方面是工作stream程。 阅读这个美妙的博客文章: Git分支模型