[git] git 的基本认知
版本管理 ( 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 的基本认知的更多相关文章
- 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 ...
- [git]git 分支
什么动作,关键看你想完成什么 1. 添加新的远程分支: git push origin current_local_branch:new_remote_branch 2. 删除远程分支(冒号前必须要有 ...
- Git -> Can't start Git: git.exe
问题描述 导入别人的PyCharm项目后提示:Can't start Git:git.exe 解决办法 Git就是个类似插件,在Git的官网上注册个账号然后每次编译就会自动把程序上传到网上备份.可以方 ...
- GIt -- git push 远程分支老是需要重新输入公钥密码问题处理?
步骤: 先查看远程有哪些分支 删除远程分支,重新关联远程分支 最后再git push 到远程分支 git remote -v git remote rm RedisNote git remote a ...
- [git] git怎样fork一个repo
描述 我定制了一下strongswan的工程.然后想把我自己的定制变成一个repo push到远端git.tong.com与大家分享. 这个时候,应该怎么做? 如果你用过github的话.那么你可以理 ...
- [skill][git] git 常用操作记录
傻瓜入门: step by step : https://try.github.io/levels/1/challenges/1 一本书: https://git-scm.com/book/en/v2 ...
- [git]git project仓库迁移
转自:https://segmentfault.com/q/1010000000124379 如果你想从别的 Git 托管服务那里复制一份源代码到新的 Git 托管服务器上的话,可以通过以下步骤来操作 ...
- can't start Git: git.exe
can't start Git: git.exe :不能启动Git 这是因为Git的可执行文件的路径不正确,需要手动设置,. 找到设置Git的窗口 然后修改一下路径就行了 点击OK就可以了.
- IDEA 中 使用 git(Git)
GitLab GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.安装方法是参考GitLab在GitHub上的Wiki页面. Git Git( ...
随机推荐
- c#静态成员和静态类
说起静态类,你可能会联想到实例类.这两者并不难区分,前者(静态类)只在内存中创建一个,而后者(实例类)则是每次实例化后,就会再内存创建一份.今天来简单聊一下静态类的理解. 代码情景: class Pr ...
- What's DB2 模式?
近期负责一个银行方面的项目,需要用到DB2实现多数据库版本切换.初步接触DB2,对于它的管理工具(IBM DATA STUDIO)虽然与ORACLE\MSSQL大同小异,但还是有些东西不一样的.比如什 ...
- winfrom面向对象1
1:面向对象的技术概论 要学习好面向对象,我们应该从三个问题入手: 1.什么是面向对象? 2.为什么要面向对象? 3.该怎么面向对象? 对象的定义是人们要进行研究的任何事物,从最简单的整数到复杂的飞机 ...
- jQuery 遍历过滤
缩写搜索元素的范围 三个最基本的过滤方法是:first(), last() 和 eq(),它们允许您基于其在一组元素中的位置来选择一个特定的元素. 其他过滤方法,比如 filter() 和 not() ...
- C#程序:如何创建xml文件以及xml文件的增、删、改、查
其实今天的这篇博文 ,是对请几天发表的博文的一个总结,只是想把xml文件的增删改查结合起来,这样更容易让初学的朋友理解,废话也不多说了,开始吧! 下面是我把我在vs环境下写的代码ctrl+V然后ctr ...
- React Native:使用 JavaScript 构建原生应用 详细剖析
数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...
- Type 类型
修改 type 类型 UPDATE wd_order2 SET info = array_append(info, row(2,100001, now() )::info ) WHERE id_ ...
- <meta http-equiv="pragma" content="no-cache"/>-备
<meta http-equiv="pragma" content="no-cache"/> 网页中常常看见有这样的标记,他们是清浏览器缓存用的啊, ...
- Tomcat启动分析(Tomcat7.0)
1)bin目录下的bootstrap.jar中的main方法启动Tomcat org.apache.catalina.startup.Bootstrap类下的main方法 可以看到Bootstrap类 ...
- ASP.NET MVC 学习
项目结构