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”被带回来。 如果您需要暂时处理不相关的更改(例如,时间关键的错误修复)
-
对象:可以是
commit
,tree
,blob
,tag
。 一个对象已经关联了它被引用的SHA1哈希值(提交的id为deadbeaf
,树decaf
)。 共享相同对象的所有存储库之间的散列值相同。 它还可以提高存储库的完整性:在不更改所有子提交的散列的情况下,您不能更改以前的提交。 -
(module,)子模块:包含在另一个存储库(例如外部库)中的存储库。 先进的东西。
-
revspec: revspec(或revparseexpression式)通过所谓的扩展SHA1语法(例如
HEAD
,deadbeaf^!
master~4^2
,origin/master..HEAD
,deadbeaf^!
,…)描述某个git对象或一组提交) -
refspec: refspec是描述在取或推操作期间在远程和本地引用之间完成的映射的模式
-
历史:在提交返回第一次提交之前描述所有的祖先提交。
你没有提到的东西,但可能是很好的知道:
你所做的一切都是你的仓库的本地(或者由git init
或者git clone git://url.com/another/repo.git
)。 在git中只有一些与其他仓库(又名interwebz)交互的命令,包括clone
, fetch
, pull
, push
。
推拉用于同步存储库。 从另一个存储库中fetch
es对象,并将它们与当前分支合并。 Push用于进行更改并将其push
送到另一个存储库。 你不能推单提交或更改,你只能推一个提交包括其完整的历史。
一个存储库可以包含多个分支,但不需要。 git中的默认分支叫做master
。 你可以创build尽可能多的分支,合并与git是一块蛋糕。 分支是本地的,直到你运行git push origin <branch>
。
一个提交描述了一个完整的项目状态。 这些状态可以相互比较,产生一个“差异”( git diff origin/master master
=查看origin/master
和master
之间的差异)
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分支模型