Git 基本介绍和学习
在正式学习 Git 之前,我们有必要的了解以下知识:
将软件发出的数据转移成数据处理的指令,并提交给 CPU 及电脑中的其他电子组件处理,Kernel 是现代操作系统最基本的部分。
一种为众多应用程序提供安全访问计算机硬件的软件,这种访问是有限的,并且由 Kernel 决定一个程序在什么时候对某部分硬件操作多长时间。
严格地说:内核并不是计算机系统中必要的组成部分。有些程序可以直接地被调入计算机中执行;
这样的设计,说明了设计者不希望提供任何硬件抽象和操作系统的支持;它常见于早期计算机系统的设计中。
但随着电脑技术的发展,最终,一些辅助性程序,例如程序加载器和调试器,被设计到机器内核当中,或者写入在只读记忆体里。
这些变化发生时,操作系统内核的概念就渐渐明晰起来了!
更多参见:参见:Wiki
Shell 俗称:“壳”,用来和 Kernel (内核)区分。
Shell 是指:为使用者提供操作界面的应用程序(软件)。
对于大多数情况来说,Shell 这个词是指:在 OS(Operation System)中,为访问 Kernel 所提供的一种服务程序,以后如果不特别注明,则 Shell 指的就是命令行式 Shell。
不过,Shell 也可用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的界面(GUI),与之相对的是:Kernel,Kernel 不提供和用户的交互功能。
因此,Shell 通常分为两类:
命令行式 Shell 有:bash / sh / ksh / csh / zsh(Unix/linux 系统)等。
最为人熟知的命令行 Shell,应该就是 Windows 的 CMD 界面。
传统意义上,Shell 指的是命令行式 Shell,而不是图形用户界面 Shell,以后如果不特别注明,则 Shell 指的就是命令行式 Shell。
Shell 是操作系统的最外层,它管理用户与操作系统之间的交互,为用户提供访问 OS Kernel 的方法。
用户可以通过交互式方法(键盘输入等)和 OS 之间进行通讯,也可以通过非交互式方法和 OS 之间进行通讯。
交互式 Shell:等待用户输入命令,再执行输入的命令。
非交互式 Shell:Shell 不与用户进行交互,而是读取存放在文件中的命令,再去执行这些命令,当文件中的命令被执行完比,则 Shell也就终止了。
非交互式使用的是 Shell Script 方法和 OS 之间进行通讯。
Shell Script:放在文件中的一串 Shell 和操作系统命令,它们可以被复用。本质上,Shell Script 是命令行的命令简单的组合到一个文件里面,通过执行该文件去访问 OS。
图形用户界面 Shell:GUI Shell,如最广泛的:Window Explorer(MicroSoft Windows 系列操作系统),
还有:Linux Shell,其中 linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的 CDE、GNOME、KDE、 XFCE。
Git:一组命令行实用程序 或者说 一个开源的分布式版本控制系统(由命令行组成)。
Bash:Bourne-Again-Shell 的缩写,一个命令行界面,一个命令处理器,同时也是一个 Shell(大多数系统,如:Linux/Mac OS X 默认的 Shell),所以它能接收用户的输入且也能从文件(被称为 Script)从读取命令并执行。
Bash 是一个 Unix Shell 和 命令行语言,并且它是 Linux(Ubuntu 等)和 OS X 上的默认 Shell。
Git Bash: 顾名思义,一个 Git 的 Shell(用 Bash 作为 Shell 来用于 Git),适用于 MicroSoft Windows 环境的应用程序,它为 Git 命令行提供一个仿真层,用来作为用户和 OS Kernel 的交互方法;用外行术语来说:任何运行在 Linux 终端设备上的 Git 都被称之为 Git Bash。
如果要在 Windows 上使用 Bash(命令行),需要下载一个名为 Git Bash 的程序,而 Git Bash 则允许我们在 Windows 环境下轻松访问 Bash 以及一个叫做 Git 的工具。
即:Git Bash 能让开发者使用 Bash 去执行所有 Git 的功能,这和 CMD、GUI 是一样的,只不过的方法不同。
Git CMD 就像带有 git
命令的常规 Windows 命令提示符(CMD)一样,它使开发者可以通过命令行(CMD)使用所有 Git 功能。
Git CMD 相当于 Linux 中的 bad-ass 终端,当开发者在 Windows 上安装 Git 并习惯于使用命令行(CMD)时,就会使用 Git CMD 运行 Git 命令。
Git GUI 是能让开发使用使用图形用户界面(GUI)去执行 Git 的功能,本质上是针对不喜欢“黑屏”(又称 CMD)编码的用户。
如:开发者要提交一些更改从本地仓库到暂存队列,则使用 Git GUI 需要单击某个按钮提交更改,而使用 Git CMD 则需要使用命令:‘git commit -m’
我建议新手应该学习并使用 Git Bash 去使用 Git 的所有功能,除非一些特殊情况的开发者应该使用 Git CMD。
我始终不建议开发者一上来就使用 Git GUI,它会让你无法弄清 Git 的优点以及其中的思想,让你变得呆滞。
Git 类似于绝大多数的 VCS(Version Control System),但是 Git 在对信息的存储和认知方式上和绝大多数 VCS 有很大差异,理解这些差异将有助与避免使用Git 中的困惑。
Git 对待数据的(存储/读取)方法是:Git 像是把数据看作是对小型文件系统的一系列快照。
在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。
为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流。
而其他大部分 VCS 以文件变更列表的方式存储信息,这类系统*(CVS、Subversion、Perforce、Bazaar 等等)* 将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异 (它们通常称作 基于差异(delta-based) 的版本控制)。
Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。 稍后我们在Git 分支讨论 Git 分支管理时,将探究这种方式对待数据所能获得的益处。
Git 中所有的数据在存储前计算校验和,然后以校验和来引用。
这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件,Git 就能发现。
Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来,所以每一个校验和可以认为是一个 Git Repository 的版本(一个 git commit 后保存的一个快照)或者说是一个 Repository 文件
SHA-1 哈希看起来是这样:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上,Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
所以你在 Git Bash 中输入 git log 查看 Git 的提交历史,通常只能查看到这串以 40 位二进制替代文件名的引用。
Git 有三种状态,你的文件可能处于其中之一:
已提交(committed)
已提交表示数据已经安全地保存在本地数据库中。
已修改(modified)
已修改表示修改了文件,但还没保存到数据库中。
已暂存(staged)
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
如果 Git 目录中保存着特定版本的文件,就属于 已提交 状态。
如果文件已修改并放入暂存区,就属于 已暂存 状态。
如果自上次检出后,文件作了修改但还没有放到暂存区域,就是 已修改 状态
在 Git 基础(或详见:Basic use to Git) 一章,你会进一步了解这些状态的细节, 并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。
Git 项目的三个阶段,可以对应 Git 的已追踪文件存在的三种状态:
在工作目录中修改文件(已修改),在暂存区中放入文件(已暂存),在 Git 目录中存放已提交的项目版本快照(已提交)。
Git 目录
存放所有已提交的版本(每次提交都会为 Repository 生成快照)
暂存区
存放所有放入暂存区(git add)但未提交的文件。
工作区
当前所在的 Git Repository 中的某个项目版本。
Git 目录:Git 用来保存项目的元数据和对象数据库的地方。即: .git directory(Repository)
,用来存在项目的所有版本。这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
暂存区:一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。
工作区:项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。不妨想想,默认情况下,使用 Git Bash 时(或任何一个 Git Shell),开发者一直处于最新的提交中,也就是最新的版本中。
…未完待续