Git 完整概念的基本学习

前言

Git 基本介绍和学习
在正式学习 Git 之前,我们有必要的了解以下知识:

  1. Kernel
  2. Shell
  3. Git Bash

Kernel

将软件发出的数据转移成数据处理的指令,并提交给 CPU 及电脑中的其他电子组件处理,Kernel 是现代操作系统最基本的部分。

一种为众多应用程序提供安全访问计算机硬件的软件,这种访问是有限的,并且由 Kernel 决定一个程序在什么时候对某部分硬件操作多长时间。

严格地说:内核并不是计算机系统中必要的组成部分。有些程序可以直接地被调入计算机中执行;

这样的设计,说明了设计者不希望提供任何硬件抽象和操作系统的支持;它常见于早期计算机系统的设计中。

但随着电脑技术的发展,最终,一些辅助性程序,例如程序加载器和调试器,被设计到机器内核当中,或者写入在只读记忆体里。

这些变化发生时,操作系统内核的概念就渐渐明晰起来了!

更多参见:参见:Wiki

Shell-Wiki-Baidu

基本概念

Shell 俗称:“壳”,用来和 Kernel (内核)区分。

Shell 是指:为使用者提供操作界面的应用程序(软件)。

对于大多数情况来说,Shell 这个词是指:在 OS(Operation System)中,为访问 Kernel 所提供的一种服务程序,以后如果不特别注明,则 Shell 指的就是命令行式 Shell。

不过,Shell 也可用于泛指所有为用户提供操作界面的程序,也就是程序和用户交互的界面(GUI),与之相对的是:Kernel,Kernel 不提供和用户的交互功能。

因此,Shell 通常分为两类:

  1. 命令行与图形界面,命令行 Shell 提供一个命令行界面(CLI)
  2. 图形用户界面(GUI)

图释

Git 完整概念的基本学习_第1张图片

命令行式 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

图形用户界面 Shell:GUI Shell,如最广泛的:Window Explorer(MicroSoft Windows 系列操作系统),

还有:Linux Shell,其中 linux shell 包括 X window manager (BlackBox和FluxBox),以及功能更强大的 CDE、GNOME、KDE、 XFCE。

Git Bash/CMD/GUI

What’s the Git Bash?

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 是一样的,只不过的方法不同。

What’s the Git CMD?

Git CMD 就像带有 git 命令的常规 Windows 命令提示符(CMD)一样,它使开发者可以通过命令行(CMD)使用所有 Git 功能。

Git CMD 相当于 Linux 中的 bad-ass 终端,当开发者在 Windows 上安装 Git 并习惯于使用命令行(CMD)时,就会使用 Git CMD 运行 Git 命令。

What’s the Git GUI?

Git GUI 是能让开发使用使用图形用户界面(GUI)去执行 Git 的功能,本质上是针对不喜欢“黑屏”(又称 CMD)编码的用户。

如:开发者要提交一些更改从本地仓库到暂存队列,则使用 Git GUI 需要单击某个按钮提交更改,而使用 Git CMD 则需要使用命令:‘git commit -m’

使用 Git Bash/CMD/GUI?

我建议新手应该学习并使用 Git Bash 去使用 Git 的所有功能,除非一些特殊情况的开发者应该使用 Git CMD。

我始终不建议开发者一上来就使用 Git GUI,它会让你无法弄清 Git 的优点以及其中的思想,让你变得呆滞。

What is the Git?

Git 类似于绝大多数的 VCS(Version Control System),但是 Git 在对信息的存储和认知方式上和绝大多数 VCS 有很大差异,理解这些差异将有助与避免使用Git 中的困惑。

直接记录快照,而非差异比较

Git 对待数据的(存储/读取)方法是:Git 像是把数据看作是对小型文件系统的一系列快照。

在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。

为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流

而其他大部分 VCS 以文件变更列表的方式存储信息,这类系统*(CVS、Subversion、Perforce、Bazaar 等等)* 将它们存储的信息看作是一组基本文件和每个文件随时间逐步累积的差异 (它们通常称作 基于差异(delta-based) 的版本控制)

Git 完整概念的基本学习_第2张图片
(其他 VCS 的对待数据方式)

Git 完整概念的基本学习_第3张图片
(Git 对待数据的方式)

Git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。 稍后我们在Git 分支讨论 Git 分支管理时,将探究这种方式对待数据所能获得的益处。

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 一般只添加数据

Git 的已追踪文件只存在三种状态

Git 有三种状态,你的文件可能处于其中之一:

  1. 已提交(committed)

    已提交表示数据已经安全地保存在本地数据库中。

  2. 已修改(modified)

    已修改表示修改了文件,但还没保存到数据库中。

  3. 已暂存(staged)

    已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

如果 Git 目录中保存着特定版本的文件,就属于 已提交 状态。

如果文件已修改并放入暂存区,就属于 已暂存 状态。

如果自上次检出后,文件作了修改但还没有放到暂存区域,就是 已修改 状态

在 Git 基础(或详见:Basic use to Git) 一章,你会进一步了解这些状态的细节, 并学会如何根据文件状态实施后续操作,以及怎样跳过暂存直接提交。

Git 项目的三个阶段

Git 项目的三个阶段,可以对应 Git 的已追踪文件存在的三种状态:

在工作目录中修改文件(已修改),在暂存区中放入文件(已暂存),在 Git 目录中存放已提交的项目版本快照(已提交)。

  1. Git 目录

    存放所有已提交的版本(每次提交都会为 Repository 生成快照)

  2. 暂存区

    存放所有放入暂存区(git add)但未提交的文件。

  3. 工作区

    当前所在的 Git Repository 中的某个项目版本。

Git 目录:Git 用来保存项目的元数据和对象数据库的地方。即: .git directory(Repository),用来存在项目的所有版本。这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。

暂存区:一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。

工作区:项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。不妨想想,默认情况下,使用 Git Bash 时(或任何一个 Git Shell),开发者一直处于最新的提交中,也就是最新的版本中。

Git 完整概念的基本学习_第4张图片
(Git 项目的三个阶段)

Git 常用术语

  1. 仓库(Repository)
    受版本控制的所有文件修订历史的共享数据库
  2. 工作空间(Workspace)
    本地硬盘或 Unix 用户帐户上编辑的文件副本
  3. 工作树/区(Working tree)
    工作区中包含了仓库的工作文件。您可以修改的内容和提交更改作为新的提交到仓库。
  4. 暂存区(Staging area)
    暂存区是工作区用来提交更改(commit)前可以暂存工作区的变化。
  5. Git 完整概念的基本学习_第5张图片
  6. 索引(Index)
    索引是暂存区的另一种术语。
  7. 签入(Checkin)
    将新版本复制回仓库
  8. 签出(Checkout)
    从仓库中将文件的最新修订版本复制到工作空间
  9. 提交(Commit)
    对各自文件的工作副本做了更改,并将这些更改提交到仓库
  10. 冲突(Conflict)
    多人对同一文件的工作副本进行更改,并将这些更改提交到仓库
  11. 合并(Merge)
    将某分支上的更改联接到此主干或同为主干的另一个分支
  12. 分支(Branch)
    从主线上分离开的副本,默认分支叫master
  13. 锁(Lock)
    获得修改文件的专有权限。
  14. 头(HEAD)
    头是一个象征性的参考,最常用以指向当前选择的分支。
  15. 修订(Revision)
    表示代码的一个版本状态。Git通过用SHA1 hash算法表示的ID来标识不同的版本。
  16. 标记/标签(Tags)
    标记指的是某个分支某个特定时间点的状态。通过标记,可以很方便的切换到标记时的状态。

Basic use to Git

…未完待续

你可能感兴趣的:(Git,git)