版本管理 ( Version Control )

版本管理系统是一个记录文件变更的系统,让你在一段时间后可以恢复指定版本的文件。版本管理系统大致可分为三类:独立的本地版本管理系统、中心化版本管理系统、分布式版本管理系统。

本地版本管理系统

最简单的方式,就是手动备份文件,实现文件版本管理的效果。以前一个相对流行的工具是 RCS ,逻辑关系如下图

中心化版本管理系统( Centralized Version Control System )

例如 CVS, subversion, perforce 等,有一个服务器包含了所有版本的文件,同时多个客户端从那个远程的服务器中拷贝出文件。这个场景下的拷贝动作,叫做签出( Checkout )。很多年来,这种方式是版本管理的标准方案。

中心化的最大缺点是单点故障。当中心的版本控制服务器处于事故状态,一段时间内不可使用,则这段时间内无法基于版本控制的合作。如果版本服务器的硬盘坏掉,并且没有及时的备份,则所有历史数据都无法找回。历史修改记录对于项目而言,非常重要。

分布式版本控制系统( Distributed Version Control System )

在分布式版本控制系统中,客户端不仅仅签出最新版本的文件,也拷贝了整个版本库信息。如果版本服务器挂掉了,任何一个客户端的版本库信息都可以用来恢复版本服务器,因为所有变更记录都在版本库中。每次 clone 都是把整个库全部完整地拷贝出来。Git 是分布式版本管理系统。

Git 是由 Linux kernel 开发社区开发,被用于管理 Linux kernel 项目开发。有如下几个特征

  • 快速
  • 简洁设计
  • 善于支出非线性开发(如几百个平行进行的开发分支)
  • 完全分布式
  • 可以支出大型项目,例如 Linux kernel .

Git 和其他版本管理工具的比较

在学习 Git 时候,尽量把其他版本控制系统的概念忘记掉,例如 subversion, perforce 等。这样有助于你理解 Git 。虽然 Git 和其他版本管理工具有类似的用户接口,但是Git 和其他版本管理工具的哲学不一样。

Git 基于整个项目快照,而不是单个文件差异

大多数版本控制系统,如 subversion,把信息存储为一个基于文件的变更列表。

Git 把信息存储为一系列的整个系统快照。每次在 Git 中有提交或修改,整个项目在那一瞬间会被记录下来,并保留对那一瞬的引用。

这是 git 和其他版本工具一个非常重要的差异。

Git 基本基本是本地操作

Git 的绝大部分操作是只用到本地的文件或资源,因为本地有项目完整的历史记录。需要查看项目历史时, Git 无需去到服务器获取历史信息,而是直接从本地数据库读取,这样响应速度很快。即使断网或 VPN 不稳地的情况下, 仍然可以继续工作。

当你在家里但 VPN 无法正常使用时,你仍然可以使用 Git 的大部分功能。这个特性非常适合在家办公、远程办公的开发工作。如果用的是 subversion ,虽然你可以修改文件,但是无法提交修改记录,因为 subversion 数据库没有连上。

Git 上面的所有东西都会被 check-sum, 并被这个 check-sum 引用。check-sum 是对文件内容进行 SHA-1加密后的哈希值,是一个40位的十六进制(0-9 以及 a-f)字符串。例如

24b9da6552252987aa493b52f8696cd6d3b00373

实际上, Git 存储文件,都是基于文件内容的哈希值,而不是基于文件名。

Git 管理下的文件状态

加入到 Git 管理体系的文件有三个状态 : commited, modified, staged。在下面的图例中

  • 工作目录 ( Working Directory ) 项目从 git 仓库中签出后存储的位置,用于存储 committed 或者 modified 状态的文件。
  • Staging Area 是一个文件,记录着下一次 commit 时会提交的内容,用于存储 staged 状态的文件。有些图形用户界面工具称这个区域为 index , 如 egit。
  • git 仓库 ( .git Repository ) 是 git 存储数据的地方,存储的是 committed 状态下的文件。这个 Git 最重要的目录。

Git 的基本工作流

修改文件 --> stage 文件 --> 提交

学习时推荐使用命令行

命令行支持 git 所有的命令,如果你熟悉 git 命令行,你可以很快熟悉 GUI 操作。反之,不一定成立。关于图形用户界面,通过对 github desktop, egit, git GUI 三个工具的使用,觉得 egit 显示的分支最为清晰,这个对 git 来说比较重要,此外 egit 还同时能显示其他的有用信息,推荐使用。

遇到不懂的命令时,可以使用下面的命令,了解如何使用 git.

git help <verb>

参考资料

Chapters 1, Getting Started, git-scm

[git] git 的基本认知的更多相关文章

  1. error setting certificate verify locations: CAfile: E:/git/Git/mingw64/ssl/certs/ca-bundle.crt

    一.问题: 当git clone项目时报 error setting certificate verify locations: CAfile: E:/git/Git/mingw64/ssl/cert ...

  2. [git]git 分支

    什么动作,关键看你想完成什么 1. 添加新的远程分支: git push origin current_local_branch:new_remote_branch 2. 删除远程分支(冒号前必须要有 ...

  3. Git -> Can't start Git: git.exe

    问题描述 导入别人的PyCharm项目后提示:Can't start Git:git.exe 解决办法 Git就是个类似插件,在Git的官网上注册个账号然后每次编译就会自动把程序上传到网上备份.可以方 ...

  4. GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?

     步骤: 先查看远程有哪些分支 删除远程分支,重新关联远程分支 最后再git push 到远程分支 git remote -v git remote rm RedisNote git remote a ...

  5. [git] git怎样fork一个repo

    描述 我定制了一下strongswan的工程.然后想把我自己的定制变成一个repo push到远端git.tong.com与大家分享. 这个时候,应该怎么做? 如果你用过github的话.那么你可以理 ...

  6. [skill][git] git 常用操作记录

    傻瓜入门: step by step : https://try.github.io/levels/1/challenges/1 一本书: https://git-scm.com/book/en/v2 ...

  7. [git]git project仓库迁移

    转自:https://segmentfault.com/q/1010000000124379 如果你想从别的 Git 托管服务那里复制一份源代码到新的 Git 托管服务器上的话,可以通过以下步骤来操作 ...

  8. can't start Git: git.exe

    can't start Git: git.exe :不能启动Git 这是因为Git的可执行文件的路径不正确,需要手动设置,. 找到设置Git的窗口 然后修改一下路径就行了 点击OK就可以了.

  9. IDEA 中 使用 git(Git)

    GitLab GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.安装方法是参考GitLab在GitHub上的Wiki页面. Git Git( ...

随机推荐

  1. 系统设计 - 使用面向 iOS 的本机插件扩展

    本文转自:http://www.cnblogs.com/zhwl/archive/2013/07/26/3217155.html 本文细致探讨了 Xcode(以 iOS 设备为目标)中的 PhoneG ...

  2. libctemplate——C语言模块引擎简介及使用

    前言 由先声明此libctemplate不是Google那个ctemplate.这个库是用C语言实现的,只有一个实现文件和一个头文件.Gooogl的ctemplate是C++实现的,和线程还扯上了关系 ...

  3. SVM(支持向量机)算法

    第一步.初步了解SVM 1.0.什么是支持向量机SVM 要明白什么是SVM,便得从分类说起. 分类作为数据挖掘领域中一项非常重要的任务,它的目的是学会一个分类函数或分类模型(或者叫做分类器),而支持向 ...

  4. 中文翻译:pjsip教程(三)之ICE stream transport的使用

    1:pjsip教程(一)之PJNATH简介 2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment简介 3:pjsip教程(三)之ICE ...

  5. Mindjet MindManager 2012 从模板创建出现“Runtime Error pure virtual function call” 解决方法

    我的Mindjet MindManager 2012 Pro也就是MindManager10 在应用模板之后总会显示 Microsoft Visual C++ Runtime Library Runt ...

  6. Android开源项目(转载)

    第一部分 界面 ImageView.ProgressBar及其他如Dialog.Toast.EditText.TableView.Activity Animation等等. 一.ListView an ...

  7. __name__ == '__main__'的作用

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个 ...

  8. linux下VI编辑器的使用

    一.VI编辑器简述       VI 编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界面,使它成了效率很高的文本编辑器.尽管在Linux上也有很多图形界面的编辑器可 ...

  9. Ipv6_Only-b

    网上好多关于ipv6的资料,说半天ipv6是什么,怎么建立测试环境,,,可是没有看到具体的操作和解决的方案,这里,为大家提供一种方案,希望给大家带来帮助吧. 总的来说有三个方面需要进行检查和修改: 1 ...

  10. 拦截QT关闭窗口的CloseEvent

    QDialog类下有一个虚函数 void QDialog::closeEvent (  QCloseEvent   *  e   )  [virtual protected] 通过实现closeEve ...