第1章 Git基础



1.1 问题

你的论文,从开题开始,直到答辩通过期间,会被导师不断打回修改,你就会不断地拷贝复制之前的论文,再进行修改,得到新的论文版本,如此往复就会产生各种版本的论文。

第1章 Git基础_暂存区


这就是手动进行论文的版本管理,这种版本管理的方式非常普遍,因为它简单。但是这种方式也是很容易出错的,你也根本记不住哪个版本对应什么样的修改


1.2 版本控制

版本控制是一个软件系统,这个软件专门用来记录对一个或多个文件在什么时间做了什么样的修改,如此我们就可以通过版本控制软件来召出任何一个修改的版本。


版本控制可以分为3类:

1. 本地版本控制

2. 集中版本控制

3. 分布式版本控制


1.2.1 本地版本控制

本地版本控制软件的出现,会让你想要编辑的文件,只会出现一份,而该文件的多个历史版本会由本地版本控制软件帮你保留起来。如此,对于用户而言,就不会看到多个版本的文件了。

第1章 Git基础_版本控制_02


本地版本控制的缺点是:不适合于多人协作编辑一个文件


1.2.2 集中式版本控制

为了满足多人协作编辑一个文件的需求,又出现了集中式版本控制软件。集中式版本控制的特点是,所有文件的所有版本都在一个单独的中央服务器上,客户端会从该服务器上“检出(check out)”文件。这种方式曾今应用了很久

第1章 Git基础_git_03


集中式版本控制的致命缺点是:如果中央服务器宕机、掉线的话,则所有工作就不能再继续了。


1.3.4 分布式版本控制

在分布式版本控制中,客户端不是仅仅从服务器“检出”文件的最新版本,而是把服务器中的所有文件、所有历史版本,都做了镜像备份。如此一来,就算中央服务数据丢失了,任何一个客户端中都有完整的文件和历史记录,可以随时恢复文件到服务器中,如下图所示:

第1章 Git基础_git_04


分布式版本控制与集中式版本控制的区别是:

1. 集中式版本控制的每个客户端同一时刻只存有一个版本,文件的所有历史版本只存放于中央服务器中,如果中央服务器挂了,则所有工作都不能再继续了

2. 分布式版本控制中,每个客户端都存放了所有文件所有历史版本。如果服务器数据丢失了,可以从任何一个客户端中恢复数据到服务器

3. 在不能联网的情况下,集中式版本控制是无法继续工作的,而分布式版本管理不会受到断网的影响



1.4 Git的诞生小历史

1. Linus创建了开源的linux

2. 世界各地的志愿者把源代码发给Linus,然后由Linus本人手工整合

3. linux壮大了,于是Linus选择了版本控制系统BitKeeper

4. BitKeeper授权Linux社区免费使用

5. Linux社区有人试图破解BitKeeper,BitKeeper怒了,收回使用权

6. Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!

7. 一个月之内,Linux系统的源码已经由Git管理了!



1.5 Git是什么

Git是一个免费开源的分布式版本控制系统。



1.6 Git的特点

Git与其他版本控制软件的主要区别,是存储各个版本的方式。其他的版本控制软件存放的都是文件和对文件的修改,如下图所示

第1章 Git基础_git_05



Git并没有这样做。Git中存放的每一个版本,都是一个所有文件的快照。使用Git时,每当你进行版本提交的时,Git都会把提交那一刻的所有文件(完整内容)的一个快照存放到版本库中。为了提高效率,如果一个文件与上一个版本相比没有任何变化的话,Git不会把该文件再存储一份,而是存放一个指向上一个版本的指针。这就是所谓的快照流(stream of snapshots),如下图所示,虚线框表示存放的是指针:

第1章 Git基础_暂存区_06



正所谓不破不立,Git从各个方面重新定义了版本控制系统,而这一点恰恰是其他版本控制软件没有做到的,它们总是从上一代复制思路。当我们学习到“分支”的时候,会再次感受到Git这种存储数据方式的威力的!



1.7 几乎所有操作都是在本地的

在使用集中式版本控制系统时,你的电脑必须能联网。当你要提交代码时,需要网络把数据提交给中央服务器。当你要浏览历史版本时,需要通过网络向中央服务器发送请求,最终中央服务器再通过网络把历史版本列表发送给你的机器。所以一旦没有了网络,集中式版本控制系统就无法再使用了。


而Git不需要网络也能工作,因为每一个Git客户端都拥有所有文件和所有历史版本!比如,你要浏览项目的历史版本时,Git不需要从外界服务器获取,Git会直接从你本地计算机中获取历史版本。


这也意味着,在没有网络的情况下(当你坐飞机时),你也可以把代码提交到本地,当有网络的时候(下飞机了),再把本地的数据提交到远程服务器。




1.8 安装Git

目前,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。我们主要学习在windows中如何使用git。


下载git

https://www.git-scm.com/download/win

第1章 Git基础_git_07



双击git安装包,看到以下界面,直接点击next即可

第1章 Git基础_版本控制_08



选择一个安装目录,然后点击下一步

第1章 Git基础_git_09



后续安装过程,一路下一步即可,直到安装!

第1章 Git基础_暂存区_10



至此,git安装完毕! 若在桌面上的右键菜单中,可以看到如下选项,则说明git安装成功!

第1章 Git基础_git_11



Git安装完成后的第一件事,就是为git设置你的用户名和邮箱地址,这一步很重要!因为使用Git每次进行提交的时候都会使用到这两个信息!毕竟Git是分布式版本控制系统,所以,每个机器提交时都必须自报家门

git config --global user.name "gao"

git config --global user.email "64918763@qq.com"


第1章 Git基础_暂存区_12



设置好之后,可以使用以下命令来查看

git config --list


第1章 Git基础_版本控制_13



加上--show-origin可以看到配置对应的文件:

git config --list --show-origin


第1章 Git基础_git_14



你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良的群众,其次,真的有冒充的也是有办法可查的。


帮助命令,通过帮助命令我们可以看到一个命令的用法

git 命令名 -h



1.9 Hello World

让我们通过一个Hello World示例快速快速体会一下git的作用

第1章 Git基础_暂存区_15



一个典型的git操作如下:

1. 编写工作区中的文件

2. 把工作区中的修改加入暂存区

3. 把暂存区中的修改提交到版本库



步骤1,创建一个文件夹,名叫:learngit

第1章 Git基础_版本控制_16



步骤2,进入该文件夹,打开右键菜单,点击“Git Bash ”

第1章 Git基础_暂存区_17



步骤3,键入 git init

第1章 Git基础_版本控制_18


此时,在learngit文件夹中会出现一个“.git”文件夹,该“.git”文件夹所在的目录就是工作区


步骤4,在文件夹中创建一个文件:hello.txt

第1章 Git基础_暂存区_19



步骤5,查看文件的状态

第1章 Git基础_git_20


因为 hello.txt 在 Untracked files 之下,所以 hello.txt 这个文件是还没有被 git 追踪的,说白了就是该文件并没有被加入暂存区,也没有在最新一次的提交中出现过


步骤6,为了让 git 能够追踪(管理) hello.txt 文件,我们需要使用 git add 命令

第1章 Git基础_版本控制_21



步骤7,查看文件的状态

第1章 Git基础_暂存区_22


因为 hello.txt 的在 Changes to be committed 之下,所以 hello.txt 文件的状态为 Staged,表示该文件已经被加入到暂存区了,处于暂存区中的文件将会在下次提交时,被提交到版本库中。

注意 git add 命令后面也可以跟一个目录的名字,此时 git add 会把该目录下的所有文件都加入到暂存区中,比如 git add . 就是把当前目录中的所有文件都加入到暂存区中


步骤,8,将暂存区中的修改提交到版本库

第1章 Git基础_暂存区_23


注意,提交时,必须编写本次的提交信息,例子中是使用 -m 来指定提交信息的。并且提交之后,暂存区中的修改就被清空了(工作区中的文件还在)。可以想象,在版本库中已经有一个版本了:

第1章 Git基础_版本控制_24



步骤9,查看文件的状态

第1章 Git基础_git_25


以上这个信息表示,你的工作区是“干净”的。换句话说,就是工作区中的所有文件与版本库中最新版本中的所有文件内容是一致的。此时工作区中的所有文件的状态都是 Unmodified


步骤10,查看提交日志

第1章 Git基础_git_26



步骤11,再创建一个文件:foo.txt,将foo.txt加入暂存区,然后提交版本

第1章 Git基础_git_27



可以想象,在版本库中目前有2个版本:

第1章 Git基础_暂存区_28



步骤12,查看提交历史记录

第1章 Git基础_暂存区_29



步骤13,回退

第1章 Git基础_暂存区_30



步骤14,以此类推,我们可以通过git命令不断地向版本库中提交新的版本:

第1章 Git基础_版本控制_31



以下是更详细的版本库模型:

第1章 Git基础_git_32




步骤15,修改hello.txt的内容

第1章 Git基础_版本控制_33



步骤16,查看文件的状态

第1章 Git基础_git_34


我们发现 hello.txt 在 Changes not staged for commit 之下,这表示一个已经被 git 追踪的文件在工作区中被修改了,并且这个修改还没有被加入到暂存区,此时 hello.txt 的状态为 modified


步骤17,再次运行 git add,把对 hello.txt 文件的修改加入到暂存区

第1章 Git基础_暂存区_35



步骤18,查看文件的状态

第1章 Git基础_版本控制_36


对 hello.txt 的修改已经被存入暂存区了,并且会在下次提交时,被提交到版本库中


步骤19,更复杂的情况我们在后面在学习,目前先把这个暂存区中的修改提交了,完成我们的 Hello World 例子

第1章 Git基础_git_37





1.10 复盘 Hello World

1. Git 基本命令

Git 命令

说明

git add

将工作区中的修改加入暂存区

git commit

将暂存区中的修改加入到版本库

git status

查看文件的状态(工作区与head指向的提交进行比对)

git log

查看历史提交记录

git reset --hard 版本号

回退到指定的版本(移动head指针)

git reflog

查看head指针移动的流水记录


2. 文件状态模型图

第1章 Git基础_git_38


Untracked:文件还未被Git追踪,也就是没有被Git管理,比如刚刚创建出来的文件就处于这个状态

Staged:处于暂存区中的修改,就是Staged状态

Unmodifed:工作区中的文件与版本库中当前版本库(head所指向的那个版本)中内容一致,就处于该状态

Modified:原本处于Unmodifed状态的文件,被修改了,就进入Modified状态


以上,只有Untracked状态是没有被Git管理的,其他3个状态虽然各不一样,但是都算作被git管理了


通过这个Hello World,我们知道了工作区、暂存区、版本库、提交、版本回退、文件的状态这些概念,后续章节将详细学习git的方方面面


3. Git三大区域:

a. 工作区(Working Directory)简单来说,工作区就是“.git”隐藏文件夹所在的目录

b. 暂存区(Staging Area),处于暂存区中的修改,将会在下次提交命令(git commit -m "")执行时,被加入到版本库中

c. 版本库(Repository),存放用户提交的各个版本

第1章 Git基础_版本控制_39


问题是:

a. 要暂存区干嘛?避免过多的提交。把多个相关的修改绑定在一次提交中。

b. 版本库在哪里? 就在.git中的objects。


4. 典型的Git操作如下:

a. 你修改了工作区中的文件

b. 你把修改加入暂存区

c. 你进行了提交,把当前项目中所有文件的快照存入版本库中