GIT学习笔记

一、GIT的前世今生

GIT是VCS(Version Control System,版本控制系统)中的一代新秀,由于其开源性、分布式,收到广大的开发者(尤其是开源开发者)的喜爱。

在VCS发明前,修改文件是件很麻烦的事,比如写毕业论文,这里修改了一下,那里修改了一下,之前删除掉得段落,又想用怎么办?只有另存为别的文件名。到最后,你完全想不起来自己到底改了几个地方,原来的论文到底长什么样子了。

这个问题对广大程序猿更是头疼,由于程序是迭代开发的,而且是多人协作。我们在开发中,希望知道一个类是谁写的、为什么要这样写、经过了些什么修改,才能帮助我们正确的开发,否则,改错了,问题就大了。

1. SCCS

1972年的时候,贝尔实验室的程序员们快被这个问题烦死了,他们写出了史上第一个版本控制系统SCCS(Source Code Control System,源代码控制系统)。SCCS 好用是好用,但有几个问题。首先,当你对文件作出多次、大量修改后,它的速度明显变慢了——对啊,它要从原文件开始依次应用修改嘛。然后,它内置在 AT&T 生产的系统中,不能跨平台啊,广大 Windows 用户很不开心啊。

2. RCS

Water 是一个教计算机的大学教授,学校里的电脑上有 AT&T 的系统,可是到家就没辙了,老爷子很不爽啊,这叫人家在家怎么刻苦呢?1982年,他一气之下,写出了改变历史的第二个被广泛应用的 VCS,取名 Revision Control System,也就是大家熟知的 RCS。

3. CVS

RCS已经解决了单个文件的问题,但是项目是复杂的、多个文件相关联的,又产生了新的问题,CVS应时而生。CVS是革命性的成果,它不但支持了对整个项目进行监控,并且首次提出了仓库(Repository)的概念。但还是有它的局限性,它监控的对象是文件,而不是目录:在项目目录下再创建目录,这个子目录里面的文件并不会被监控;添加一个新文件,这个新文件也不会被监控。

4. SVN

到了21世纪,一个跨时代的 VCS 出现了—— Subversion。它不但支持监控整个目录,而且首次支持了监控非文本文件。这两个特性使它在 2001 年在全球范围内取代了 CVS,并且一直流行到今天。没错,上一份工作的公司用的就是SVN,也是我接触到的第一个版本控制系统,又一台服务器作主机,从主机检出代码,修改,然后提交到主机同一管理。
同时代还有另一个 VCS —— BitKeeper,也很牛,他和SVN不同的是:1、分布式管理,2、商业软件。在当初可是比SVN还出名,因为大名鼎鼎的 Linux Kernel 就存放在其免费的社区版本上!

5. GIT

2005年4月,BitMover(拥有 BitKeeper 的那家公司)突然宣布,停止 BitKeeper 的社区版本,你们这群不想交钱就用我们软件人都玩蛋去!好嘛,改变了人类历史的 Linux 就这样无家可归了。
Linux 之父 Linus 看着自己的儿子被别人赶出了家门,愤怒值立刻飙升。他环绕四周看了看,觉得 SVN 什么的简直是屎,决不能允许亲儿子流落至此。两斤啤酒下肚,他冲到电脑前三天三夜不眠不休,于是GIT诞生。好吧,这里有点夸张,没有这么快。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。而之前的老牌代码托管商如SourceForge逐渐衰败。


二、集中式与分布式版本控制的区别

从上面可以看到,现代VCS分为集中式管理、分布式管理。

1.集中式管理(代表:SVN)

版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

缺点:

  1. 服务器出现问题会对整个系统造成影响
    如果主机出现故障,那在这段时间之内,谁也不能提交代码、更新代码。
  2. 必须要联网才能工作
    如果在家中,连接不到服务器,你是没办法提交代码的,只能持续进行开发,而在这个过程中的问题,很难把控。
  3. 由于本地没有代码库,操作不够方便
    比如一个重要的bug要立即放下手里的工作,需要创建个分支进行bug修复开发,SVN需要去申请创建分支的权限,开发完后合并分支也很痛苦

优点:

  1. 集中式管理,权限好控制
    可以配置各个路劲、各个文件的权限,有的公司的文件安全等级高的,选择集中式管理吧
  2. 入门简单
    好吧,相对于分布式管理,这确实也是一个优点

2.分布式管理(代表:GIT)

分布式版本控制 (DVCS) 是一种不需要中心服务器的管理文件版本的方法,但是它也可以使用中心服务器。更改可以被合并到 DVCS 的任何其他用户的系统中,因此可以实现非常灵活的工作流。

优点:

  1. 由于没有中心服务器,安全性高。
    各个每个clone都是完整的库,哪怕多个人的电脑坏了,只要有个版本库还存在,也不会丢失代码;
  2. 不需要联网即可工作。
    在本地操作自己的代码库,完全不受网络影响。只是在需要与别的库同步的时候才需要网络。
  3. 它比集中的版本控制更灵活,因为它除了支持传统的(集中式)工作流,还支持其他各种工作流;
    尤其是分支管理,实在是太爽了:自由创建分支、合并快,加上stash功能,随时可以处理突然加进来的工作。

缺点:

  1. 由于是分布式的,每个人都有完整的备份,权限控制就不好搞了。当然,它就是为了开源项目而生的,权限控制不是它的风格。
  2. 上手还是比较有难度的。因为开放性高,库在本地,可以各种操作。我丢过一次代码,第一次与别人合并代码搞了好久(之前用SVN习惯了,思维没改变过来)

三、工作区、暂存区、版本区的区别

由于之前用的是SVN,集中式的系统,和GIT分布式的有很大差别,就自己的理解来说说工作区、暂存区、版本区的却别。

1、工作区

就是我们进行文件操的区域,可以看到的一个个文件,就处于工作区。
我们在工作区修改、添加、删除文件,这些操作此时是未被GIT跟踪的,如果在这个阶段数据丢失了,是找不回来的!
所以,在工作区内的文件要不定期的添加到缓存区。

2、缓存区

工作区的文件可以添加到这个区域,一旦添加到这个区域,就被GIT跟踪了,那就担心数据丢失了。
通过 git add 将修改后的文件添加到缓存区。
需要注意的是,git跟踪的是修改,不是文件,举例说明:

  1. 在工作区创建文件 a.txt,写入数据 hello world!
  2. git status,看到提示:
 $ git  status
 On branch master
 Untracked files:
   (use "git add <file>..." to include in what will be committed)
 
    a.txt
 
 nothing added to commit but untracked files present (use "git add" to track)

此时文件未被跟踪,还在工作区

  1. git add a.txt,添加到缓存区
  2. git status:
 $ git status
 On branch master
 Changes to be committed:
   (use "git reset HEAD <file>..." to unstage)
 
    new file:   a.txt

此时,a.txt添加到了缓存区,已被跟踪

  1. 此时,再次修改a.txt,添加新行 i like git!
  2. git status:
 $ git status
 On branch master
 Your branch is up-to-date with 'origin/master'.
 Changes to be committed:
   (use "git reset HEAD <file>..." to unstage)
 
    new file:   a.txt
 
 Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 
    modified:   a.txt

此时看到a.txt被修改,还在工作区!
为什么呢?a.txt我们之前已经加到缓存区了呀?
这是因为git跟踪的是修改,不是文件。
这样来理解:第一次针对a.txt的修改已经添加到缓存区了,第二次针对a.txt的修改还在工作区。
所以记得每次修改了文件,一定要再次 git add 文件名,然后再提交。

3、版本区

也叫版本库,存储所有版本的区域,缓存区的修改数据,提交后将存储到此区域。
继续上面的操作:

 $ git commit -m 'add file: a.txt'
 [master c5e0e58] add file: a.txt
  1 file changed, 3 insertions(+)
  create mode 100644 a.txt

通过命令 git commit 将所有加入缓存区的数据一次性提交到版本区。
注意参数 -m “”,是添加提交的备注信息,备注好这次提交作了哪些修改,对我们以后跟踪修改、别的伙伴理解我们的操作很有帮助。
数据进入版本区,就相当于是归档了,以后想查找文件里每一次的修改变更,都能查找到了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • Git教程 一、Git简介 1.1. Git的诞生1.2.集中式的vs分布式 二、安装Git 三、创建版本库 四、...
    曹渊说创业阅读 926评论 0 2
  • 简单的记录一下如何上传代码到Github上 上传本地代码到GitHub 第一步:建立git仓库 进入到一个目录里 ...
    weizujie阅读 575评论 0 1
  • ----------------- Git 学习 ------------------ Git 简介 Git...
    Junting阅读 2,226评论 0 3
  • git学习笔记 声明 本文是本人学习Git过程中所做的笔记,以便日后查阅,文中多有错漏之处,不建议用作学习材料,文...
    sayonara_yoyo阅读 672评论 0 1
  • 故事梗概: 农夫露宿时听到老头的讲诉:他过去杀过人,渡河时在梦中被他认为的冥河上的摆渡人渡往了地狱,他坚信这些年都...
    aerodreamer阅读 443评论 6 3