序言
Git 是一个开源的 分布式版本控制系统
,可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说,掌握 Git 的使用是必要的。
在这个系列中,将详细的介绍 Git 的使用和原理,话不多说,让我们开始吧。
1. 安装 Git
1.1 Linux --- Centos
首先你可以使用指令来查看是否已安装 Git
:
cpp
git
若未安装,则会显示信息:
cpp
-bash: git: command not found
可使用指令安装 Git
:
cpp
sudo yum -y install git
1.2 Linux --- Ubuntu
同样的,你可以使用指令来查看是否已安装 Git
:
cpp
git
若未安装,则会显示信息:
cpp
Command 'git' not found, but can be installed with:
sudo apt install git
可使用指令安装 Git
:
cpp
sudo apt install git
1.3 Windows
Windows 系统下,大家首先可以点击 Git 官网下载链接 下载 git
。在安装时会有许多额外的选项,对初学者的我们来说,一路点击 next
使用默认选项就要够啦。
现在,怎么使用呢?首先,随便点击一个文件夹,然后点击 查看更多选项
,之后,如果弹出的选项中包含如下图像就说明成功安装了!
2. 初始化本地仓库
创建一个本地的仓库,本质就是创建一个 进行版本控制的文件目录
,要对文件进行版本控制,就必须先创建仓库。
2.1 创建本地仓库
先进入到你想要进行版本管理的文件夹当中,使用指令 git init
,即可创建一个本地仓库:
这里文件夹中多了一个名为 .git
的文件说明创建成功了!
2.2 初始化用户名和邮箱
之后便是配置用户信息,你需要配置你的用户名:
cpp
git config [--global] user.name "Your_Name"
还需要配置你的邮箱:
cpp
git config [--global] user.email "Your_Email"
在这里的 [--global]
代表是一个可选项,如果加上则代表 这台机器所有的 Git 仓库
都会使用该消息配置。
你可以使用指令来查看你所配置的信息:
cpp
git config -l
如果你想要删除相应的信息:
cpp
git config unset [--global] user.name // 删除用户名
git config unset [--global] user.email // 删除邮箱
3. 相关操作以及区域概念
首先我们需要理解 工作区,暂存区,版本库
的概念:
工作区
:当我们增删改文件时,所处在的目录。暂存区
:存放在.git
目录下的index
文件中,提供了在提交之前对更改进行组织和准备的能力
。版本库
:⼯作区有⼀个隐藏⽬录.git
,它不算⼯作区,⽽是Git
的版本库。这个版本库⾥⾯的所有⽂件都可以被Git
管理起来,每个⽂件的修改、删除都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"。
这些概念现在大家看来会十分摸不着头脑,但是随着我们后面逐渐的深入,大家再来看就会有自己的理解了,但是现在大家请记住 真正进行版本管理的地方是版本库!
3.1 添加文件
我们可以使用指令将一个或多个文件从工作区存入暂存区:
cpp
git add [file1] [file2] [file3]... // 将指定文件添加到暂存区
git add . // 将工作区所有文件添加到暂存区
之后,我们可以使用指令将文件从暂存区存入到版本库中:
cpp
git commmit -m "Your_Msg" // 在这里,需要描述你的提交细节,帮助其他人看到更好的理解
在完成这两步之后,会显示信息:
一个文件被改变,插入一行内容。
3.2 删除文件
如果我们想要删除一个版本库中的文件,首先你需要使用指令将该修改写入暂存区中:
cpp
git rm [file]
之后将删除操作提交到版本库,完成更新:
cpp
git commmit -m "Your_Msg"
3.3 修改文件
首先我对我的文件对多写入了一行内容,先介绍一个命令可以查看你仓库的状态(那些文件被修改后还没有添加提交):
cpp
git status
输入该指令后,我们可以看到:
他告诉我们 readme
这个文件被修改了,我们可以使用指令来查看工作区和暂存区的区别:
cpp
git diff [file]
这里输出的格式可能大家会觉得很奇怪:
这里的 -
代表的是暂存区中的内容,+
代表的是工作区中的内容(最新的),所以
@@ -1 +1, 2 @@
代表的是:
- 旧内容是第一行
- 新内容是第一行开始到第二行
之后将修改的文件上传的版本库的操作和添加文件一摸一样。
3.4 查看日志信息
我们可以通过指令来查看我们的历史提交记录:
cpp
git log
可以看到这里记录所有提交的详细信息,并且每一次提交都会分配一个 commit id
,每一次提交都代表一个新的版本,所以这里可以理解为这是一个版本号
。
你也可以添加选项让更为优雅的输出相应的信息:
cpp
git log --pretty=oneline
3.5 .git 文件
在经过了上述一系列操作之后,我们再查看这个神奇的 .git 文件
,我们使用指令 tree .git/
以树状的形式查看目录:
我们介绍其中比较重要的几个组成部分:
-
index
:这就暂存区,我们add
的文件都存在于此处 -
HEAD
:指向当前正在工作的分支
,默认指向master
(多分支时进一步介绍):那
master
又指向的是什么呢?使用cat
指令查看一下:
一串很长的不知道是什么的序列,不知道大家还记得我们在前面讲到过一个概念
commit_id
,这串序列就是commit_id
,我们使用git log
指令打印一下提交记录,查看是否存在这样一个commit_id
:
不仅找到了还是第一个(最新那个),不难推断 ---
master 保存的就是当前最新 的 commit id
。 -
objects
:为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏git add
命令时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于.git/objects
⽬录。
4. 版本回退
4.1 回退指令
在开始讲解回退之前,我们想了解一个重要的指令:
cpp
git reset [--soft | --mixed | --hard] [HEAD]
回退 本质是 将版本库中的内容进⾏回退
,⼯作区或暂存区是否回退由命令参数决定。
现在我们先介绍前一个选项:
• --mixed
为默认选项,使⽤时可以不⽤带该参数。该参数 将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
• --soft
参数对于 ⼯作区和暂存区的内容都不变
,只是将版本库回退到某个指定版本。
• --hard
参数 将暂存区与⼯作区都退回到指定版本
。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重 !!!
在这里向大家举个栗子:
现在我们介绍第二个参数,该参数代表我们需要回退的版本,默认 HEAD
是当前版本:
HEAD^
代表上一个版本,HEAD^^
代表上两个版本,以此类推commit id
代表的就是一个版本号,可使用commit id
回退到指定版本,使用git log / git reflog
查看commit id
。
4.2 回退场景
1. 只是修改工作区中的代码
我完成了第一版代码,并且已经上传到版本库中了。现在我想要在第一版的基础上进行改善,但是经过改造之后原本可以正常运行的代码成功的歇菜了。
现在我想要将我工作区的代码回退到版本一,方案一:最笨的方法就是手动删除当然极其不推荐。
方案二:使用指令 git checkout -- [file]
将工作区的代码更新为最新提交到暂存区的文件
2. 修改的代码添加到暂存区
现在我不小心将我的代码也添加到了暂存区中,这又改怎么回退到版本一呢?
使用指令 git reset --hard HEAD
,就可以将你的工作区和暂存区便回来啦!
3. 修改的代码提交到版本库
这个就直接使用我们的指令 git reset --hard HEAD^
,解决起来还是比较简单。
4. 回退的本质
在 Git 内部当中,是怎么实现版本回退的呢,请看下图:
我们在前面介绍过 master 保存的就是当前最新的 commit id(版本)
,改变当前的版本,也就是改变 master
的指向。
5. 总结
在这篇文章中我们介绍了 Git 的版本管理以及其背后的部分原理,希望大家有所收获!