学习资料是以《Pro Git》(官网下载的书籍电子版)为主,同时,以网络搜索为辅
第一章、开始学习GIT
本章将介绍如何开始使用Git。我们将首先解释一些关于版本控制工具的背景知识,然后继续讨论如何让Git在您的系统上运行,最后是如何设置它以开始工作。在本章的结尾,您应该理解为什么存在Git,为什么应该使用它,并且应该全部设置为这样做。
1、关于版本控制
什么是“版本控制”,你为什么要关心呢?版本控制是一个系统,它记录文件或一组文件的变化,以便以后回滚到特定的版本。例如,在这本书中,您将使用软件源代码作为受版本控制的文件,尽管实际上您可以使用计算机上几乎任何类型的文件做到这点。
如果你是一个图形或网页设计师,并且想要保留一个图像或布局的每个版本(你肯定想要的),使用一个版本控制系统(VCS)是一个非常明智的。它允许您将选定的文件还原为以前的状态,将整个项目还原为以前的状态,比较随时间的变化,查看谁最后修改了可能导致问题的东西,谁在何时引入了问题,等等。使用VCS通常意味着如果你搞砸或丢失文件,你可以很容易地恢复。此外,你可以用很少的开销得到所有这些。
1.1、本地版本控制系统
许多人选择的版本控制方法是将文件复制到另一个目录中(如果它们很聪明的话,可能是一个带有时间戳的目录)。这种方法很常见,因为它非常简单,但它也非常容易出错。它很容易忘记你在哪个目录,不小心写了错误的文件或复制你无意中的文件。
为了处理这个问题,程序员很久以前就开发了本地vcs,它有一个简单的数据库,将所有对文件的更改都保存在修订控制之下。
最流行的VCS工具之一是一个名为RCS的系统,它在今天仍然分布在许多计算机上。RCS的工作原理是在磁盘上保持补丁集(即文件之间的差异)的特殊格式;然后,它可以通过添加所有补丁,在任何时间点重新创建任何文件的样子。
1.2、集中式版本控制系统
人们遇到的下一个主要问题是,他们需要在其他系统上与开发人员协作。为了解决这个问题,我们开发了集中式版本控制系统(CVCSs)。这些系统(如CVS、子版本和Perforce)有一个包含所有版本控制文件的服务器,以及许多从该中心位置签出文件的客户端。多年来,这一直是版本控制的标准。
这种设置提供了许多优点,特别是比本地vcs更好。例如,每个人都在一定程度上知道这个项目上的其他人在做什么。管理员对谁可以做什么有细粒度的控制,而且管理CVCS比处理每个客户端上的本地数据库要容易得多。
然而,这种设置也有一些严重的缺点。最明显的是集中式服务器所代表的单点故障。如果该服务器宕机了一个小时,那么在这个小时内,根本没有人可以协作或保存他们正在进行的任何版本化更改。如果中央数据库所在的硬盘损坏,并且没有保留正确的备份,那么您将完全丢失所有内容——项目的整个历史,除了人们在本地机器上使用的单个快照。本地vcs也面临着同样的问题——每当您将该项目的整个历史放在一个地方时,您就有可能失去一切的风险。
1.3、分布式版本控制系统
这就是分布式版本控制系统(DVCS)的作用。在DVCS(如Git、Mercurial或Darcs)中,客户端不只是查看文件的最新快照;相反,它们完全镜像了存储库,包括它的完整历史。因此,如果任何服务器死亡,并且这些系统通过该服务器进行协作,则可以将任何客户端存储库复制到服务器以恢复它。每个克隆都是所有数据的完整备份。
此外,这些系统中有许多可以很好地处理几个可以使用的远程存储库,因此您可以在同一项目中,以不同的方式同时与不同的人群进行协作。这允许您设置在集中式系统中不可能设置的几种类型的工作流,例如分层模型。
2、Git的简短历史
就像生活中许多伟大的事情一样,Git以一些创造性的破坏和激烈的争论开始。
Linux内核是一个范围相当大的开源软件项目。在Linux内核维护的早期(1991-2002),对软件的更改作为补丁和归档的文件传递。2002年,Linux内核项目开始使用一种名为BitKeeper的专有DVCS。
2005年,开发Linux内核的社区和开发BitKeeper的商业公司之间的关系破裂,该工具的免费状态被撤销。这促使Linux开发社区(特别是Linux的创造者Linus Torvalds)根据他们在使用BitKeeper时学到的一些经验教训开发他们自己的工具。新系统的一些目标如下:
-
高效
-
设计简单
-
对非线性发展的有力支持(数千个并行分支)
-
完全分布式地
-
能够高效地处理像Linux内核这样的大型项目(速度和数据大小)
自2005年诞生以来,Git已经进化和成熟,易于使用,但仍保留了这些最初的品质。它的速度惊人地快,对于大型项目非常高效,而且它有一个令人难以置信的非线性开发分支系统(参见Git branching)。
3、Git基础
那么,简而言之,Git是什么呢?这是一个需要掌握重要的部分,因为如果您了解Git是什么以及它如何工作的基本原理,那么有效地使用Git对您来说可能会容易得多。当您学习Git时,试着清除您可能知道的关于其他vcs的事情,如CVS、Subversion或Perforce——这样做将帮助您在使用该工具时避免微妙的混淆。尽管Git的用户界面与其他VCSs相当相似,但Git以一种非常不同的方式存储和思考信息,理解这些差异将帮助您避免在使用它时感到困惑。
3.1、直接记录快照,而非差异比较
Git和其他VCS(包括Subversion 和friends)之间的主要区别是Git对其数据的思考方式。从概念上讲,大多数其他系统将信息存储为基于文件的更改列表。这些其他系统(CVS, Subversion, Perforce,等)将它们存储的信息视为一组文件,以及随着时间的推移对每个文件所做的更改(这通常被描述为基于增量的版本控制)。
Git不会以这种方式考虑或存储其数据。相反,Git认为它的数据更像是一个微型文件系统的一系列快照。使用Git,每次提交或保存项目状态时,Git基本上都会拍摄出当时所有文件的样子,并存储对该快照的引用。为了有效地,如果文件没有更改,Git不会再次存储文件,只是一个到之前已经存储的相同文件的链接。Git认为它的数据更像是一个快照流。
这是Git和几乎所有其他vcs之间的一个重要区别。这使得Git重新考虑了大多数其他系统从上一代复制的版本控制的几乎所有方面。这使得Git更像是一个迷你文件系统,上面有一些令人难以置信的强大工具,而不是简单的VCS。当我们在Git Branching章节中介绍Git分支时,我们将探讨您通过以这种方式考虑您的数据所获得的一些好处。
3.2、近乎所有操作都是本地执行
几乎每一项操作都是本地化的
Git中的大多数操作只需要本地文件和资源来操作——通常不需要来自您网络上的另一台计算机的信息。如果你习惯了CVCS,大多数操作都有网络延迟开销,Git的这方面会让你认为速度之神赋予了Git超自然的能力。因为您的本地磁盘上有项目的整个历史,所以大多数操作似乎几乎是即时的。
例如,要浏览项目的历史记录,Git不需要到服务器去获取历史记录并为您显示它——它只是直接从您的本地数据库读取它。这意味着您几乎可以立即看到项目的历史记录。如果你想看到当前版本的文件和一个月前文件之间的变化,Git可以查找一个月前的文件,做一个本地差异计算,而不是要求远程服务器或把一个旧版本的文件从远程服务器做本地。
这也意味着,如果你离线或脱离VPN,你几乎做不到什么。如果你上了飞机或火车,想做一点工作,你可以愉快地承诺(给你当地的副本,记得吗?)直到你到达一个网络连接来上传。如果你回家后不能让你的VPN客户端正常工作,你仍然可以工作。在许多其他系统中,这样做要么是不可能的,要么是痛苦的。例如,在Perforce中,当您未连接到服务器时,您做不了什么;在“子版本”和CVS中,您可以编辑文件,但不能向数据库提交更改(因为数据库处于脱机状态)。这看起来可能不是什么大事,但你可能会惊讶于它能带来多么大的不同。
3.3、Git 保证完整性
Git的完整性
Git中的所有内容在存储之前都是校验和的,然后由该校验和引用。这意味着在没有Git知道的情况下,不可能更改任何文件或目录的内容。该功能内置在Git中,是其理念不可或缺的一部分。如果Git无法检测到信息,您不能在传输过程中丢失信息或导致文件损坏。
Git用于这个校验和的机制称为SHA-1哈列。这是一个由40个字符组成的字符串,由十六进制字符(0-9和a-f)组成,并根据Git中的文件或目录结构的内容进行计算。SHA-1散列是这样的:
24b9da6552252987aa493b52f8696cd6d3b00373
您将在Git中到处看到这些哈希值,因为它经常使用这些值。实际上,Git不是通过文件名在其数据库中存储所有内容,而是通过其内容的哈希值。
3.4、Git 一般只添加数据
Git通常只添加数据
当您在Git中执行操作时,几乎所有的操作都只将数据添加到Git数据库中。很难让系统做任何不可去做的事情,或者让它以任何方式擦除数据。与任何VCS一样,您可能会丢失或打乱尚未提交的更改,但在将快照提交到Git之后,就很难丢失,特别是当您定期将数据库推送到另一个存储库时。
这使得使用Git成为一种乐趣,因为我们知道我们可以进行实验,而没有严重搞砸事情的危险。要更深入地了解Git如何存储其数据以及如何恢复似乎丢失的数据,请参见“Undoing Things”。
3.5、三种状态
1)、三种状态
现在要注意——如果你想让你剩下的学习过程顺利进行,这是关于Git要记住的主要事情。Git有三个主要状态,您的文件可以位于:已修改(modified)、已暂存(staged)和已提交(committed):
-
已修改(modified):表示修改了文件,但是还没保存到git数据库中
-
已暂存(staged):表示对一个文件的当前版本做了标记,使之包含在下次提交的快照中
-
已提交(committed):表示数据已经安全的保存在本地数据库中
2)、这将引入Git项目的三个工作区域的概念:
工作目录(the working tree)、暂存区(the staging area)和the Git directory
工作目录:是对项目的某个版本独立提取出来的内容。这些内容是从Git仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改的;
暂存区:是一个文件,保存了下次将提交的文件列表信息;暂存区一般在Git仓库目录中。有时被称为“索引”
Git仓库目录:是Git用来保存项目的元数据和对象数据库的地方。
3)、基本的Git工作流程是这样的:
a、在工作目录中修改文件;
b、暂存文件,将文件的快照放入暂存区域
c、提交更新,找到暂存区域的文件,将快照永久性存储到Git仓库目录中。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已
暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
4、命令行
Git 有多种使用方式。 你可以使用原生的命令行模式,也可以使用 GUI 模式,这些 GUI 软件也能提供多种功能。 在该文中,我们将使用命令行模式。 这是因为首先,只有在命令行模式下你才能执行 Git 的所有命令,而大多数的 GUI 软件只实现了 Git 所有功能的一个子集以降低操作难度。 如果你学会了在命令行下如何操作,那么你在操作 GUI 软件时应该也不会遇到什么困难,但是,反之则不成立。 此外,由于每个人的想法与侧重点不同,不同的人常常会安装不同的 GUI 软件,但所有人一定会有命令行工具。假如你是 Mac 用户,我们希望你懂得如何使用终端(Terminal);假如你是 Windows 用户,我们希望你懂得如何使用命令窗口(Command Prompt)或 PowerShell。 如果你尚未掌握以上技能,我们建议你先停下来快速学习一下。
5、安装Git
在开始使用Git之前,您必须使其在计算机上可用。即使已经安装,更新到最新版本可能是一个好主意。您可以将它作为一个包安装,也可以通过其他安装程序安装,或者下载源代码并自己编译它。
注意:
这本书是用Git版本2写的。由于Git在保持向后兼容性方面非常出色,所以任何最近的版本都应该工作得很好。尽管我们使用的大多数命令即使在古代版本的Git中也可以工作,但其中一些命令可能不会工作,或者可能略有不同。
如果您想通过二进制安装程序在Linux上安装基本的Git工具,那么您通常可以通过发行版附带的软件包管理工具来安装。如果您使用Fedora(或任何密切相关的基于rpm的发行版,如RHEL或CentOS),您可以使用dnf:
$ sudo dnf install git-all
如果你使用的是基于debian的发行版,比如Ubuntu,请尝试apt:
$ sudo apt install git-all
有关更多选项,在Git网站https://git-scm.com/download/linux上有安装在几种不同Unix发行版上的说明
5.1、在windows上安装
还有一些方法可以在Windows上安装Git。最官方的版本可以在Git网站上下载。只要去https://git-scm.com/download/win,下载就会自动开始。请注意,这是一个叫做Git的项目,它与Git本身独立的;有关更多信息,请访问https://gitforwindows.org。
要获得自动安装,您可以使用Git Chocolatey package。请注意,Chocolatey package是由社区维护的。
注意:对于 Windows 用户,安装后如果希望在全局的 cmd 中使用 Git,需要把 git.exe 加入 PATH 环境变量中,或在 Git Bash 中使用 Git。
5.2、源码包安装
有些人可能会发现从源代码安装Git很有用,因为您将获得最新的版本。二进制安装程序往往有点落后,尽管随着Git近年来的成熟,这一点造成的影响并不大。
如果您确实想从源代码安装Git,那么您需要有以下Git所依赖的库:autotools、curl、zlib、openssl、expat和libiconv。例如,如果您使用的系统具有dnf(如Fedora)或apt-get(如基于debian的系统),您可以使用以下命令之一来安装编译和安装Git二进制文件的最小依赖项:
# RHEL/centos类系统中
# step 1 :git的依赖库
sudo dnf install dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel
# step 2 :为能够添加各种格式文档(doc\html\info),安装如下相关包
# 注:必须启动 the EPEL repository来下载docbook2X包
sudo dnf install asciidoc xmlto docbook2X
# step 3:安装getopt软件包
sudo dnf install getopt
# step 4:创建相关软链接
sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi
# step 5:下载源码包,并上传到RHEL相关的系统上
# 获取源码包地址:
# 1、https://www.kernel.org/pub/software/scm/git
# 2、https://github.com/git/git/tags
# step 6:编译安装GIT
# 举例说明:
$ tar -zvxf git-2.8.0.tar.gz
$ cd git-2.8.0
$ make configure
$ ./configure --prefix=/usr
$ make all doc info
$ sudo make install install-doc install-html install-info
# step 7:安装成功后,更新git
$ git clone https://git.kernel.org/pub/scm/git/git.git
# 查看Git版本
git --version
6、Git的配置文件
已在系统上安装好了Git,可以通过Git的配置文件来定制本地的Git环境,如:设置Git外观和行为。每台计算机上只需配置一次,程序升级时会保留配置信息。修改配置一般可以使用 git config 工具
A、在Linux系统环境下,Git的配置文件一般有3种级别:
-
/etc/gitconfig文件:系统级别配置文件,它包含系统上每一个用户及他们仓库的通用配置。在使用 git config命令时,添加 --system 参数时,会从该文件读写配置变量。
-
~/.gitconfig 或者 ~/.gitconfig/git/config 文件:用户级别,一般只针对当前用户有效。在使用 git config 命令时,添加 --global 参数时,会读写该配置文件。
-
.git/config文件:仓库级别针对该仓库的配置文件。
说明:每个级别配置文件会覆盖上一级别的配置,仓库级别 --> 当前用户级别 --> 系统级别
B、在windows系统中,也可以在控制台中使用 git config 命令来修改配置;Git配置级别有3种,分别存放在不同的配置文件中:
-
仓库级别(当前仓库有效):local 级别,优先级最高
-
配置文件存放位置:保存在当前仓库(指定创建git仓库的文件夹)下面的 .git\config 文件中,通常.git文件夹是隐藏的,要在文件管理器的文件夹选项中打开显示隐藏文件夹才可以看到。
-
级别最高,若用户级或系统级的配置中出现同一配置项,仓库级优先有效。
-
-
用户级别(当前用户有效):global级别,优先级次之
-
配置文件默认存放位置:当前系统用户的主目录(C:\Users目录下,以用户名命令的文件夹)下的.gitconfig文件。举例:window系统的用户名为Administrator,则用户级配置文件位置: C:\Users\Administrator\.gitconfig文件,该文件在使用“git config --global” 命令配置相关配置后生成
-
可以修改该配置文件位置:在桌面或开始菜单中的“我的电脑”或“计算机”图标上鼠标右键,点“属性”,然后点“高级系统设置”,然后点“环境变量”,在用户变量里找一下有没有“Home”变量,在尾部追加一个你希望更改到的新文件夹的地址(追加时在前面要加一个英文分号)
-
-
系统级别(系统全局有效):system级别,优先级最低
-
配置文件默认存放位置:在Git安装目录下 \etc\gitconfig 文件;举例:若Git安装目录为:D:\ProgramFiles\Git,则系统级别配置文件为:D:\ProgramFiles\Git\etc\gitconfig文件;
-
该配置对本系统内所有的用户和仓库有效,但是如果用户级别或仓库级别有同等配置,会被覆盖。
-
使用“git config --system”命令时,配置会被写入到系统配置文件中。
-
6.1、查看、编辑配置
# 查看Git的所有配置:控制台输入以下命令
git config --list
# 查看所有的配置以及它们所在的文件:控制台输入以下命令
git config --list --show-origin
# 查看仓库级别的配置:在控制台中先用 cd 命令进入仓库文件夹后,输入以下命令
git config --local -l
# 查看用户级别的配置:控制台输入以下命令
git config --global -l
# 查看系统级别的配置:控制台输入以下命令
git config --system -l
# 编辑配置文件:2种方式
# 方式一:找到配置文件直接编辑后保存即可
# 方式二:控制台输入命令( -e参数,调用Git默认使用的文本编辑器)
git config --local -e # 编辑仓库级别配置文件
git config --global -e # 编辑用户级别配置文件
git config --system -e # 编辑系统级别配置文件
6.2、配置用户信息
当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改
# 举例
# 配置用户名,配置项保存在用户级配置文件中
git config --global user.name "John Doe"
# 配置Email地址,配置项保存在用户级配置文件中
git config --global user.email johndoe@example.com
6.3、配置文本编辑器
用户信息已经设置完毕后,可以配置默认文本编辑器了,当 Git 需要你输入信息时会调用它。
# 举例:
# 配置vim编辑器:core.editor
git config --global core.editor "vim"
# 配置notepad++(编辑器运行程序以本地电脑安装位置为准)
git config --global core.editor "'D:/ProgramFiles/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
# 其他编辑器配置方法的链接:https://git-scm.com/book/zh/v2/ch00/ch_core_editor
7、获取帮助
若你使用 Git 时需要获取帮助,有三种方法可以找到 Git 命令的使用手册:
git help <verb>
git <verb> --help
man git-<verb>
# 举例:查看config命令的帮助
git help config
第二章 Git基础
1、获取Git仓库
获取Git仓库有2种方式,方式一是在现有项目或目录下导入所有文件到Git中;方式二是从一个服务器中克隆一个现有的Git仓库。
-
在现有目录中初始化仓库
# 举例说明新建一个Git仓库的相关步骤 # step1: 新建文件夹(mkdir) mkdit git_test # step2:进入该文件夹(cd) cd git_test # step3: 初始化Git仓库 git init # step4: 检查仓库状态 git status # 注意:新建完仓库后,每操作一步,可以使用 git status 命令来检查下仓库状态 # 在包含项目文件的目录使用Git作为版本控制系统时 # step1:进入该项目目录 # step2:在该项目目录下,初始化一个git仓库: git init # step3:将该目录下的所有文件交由git管理 git add * git commit -m 'initial project version'
在本地初始化一个Git仓库,重要命令:git init命令。该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
-