本文正在参加「金石方案 . 瓜分6万现金大奖」

文章首发于公众号:程序员读书;欢迎重视,能够榜首时间收到文章更新哦!

前言

关于程序员来说,Git应该是每天都要打交道的东西吧,但许多时候咱们都只是停留在git addgit pushgit pull等简略指令的运用上,又或者只是运用GUI东西(如Sourcetree等)点击操作罢了,对Git并没有什么全面的了解,碰到问题可能需求不断上网查询。

因而,为了更好地运用Git,也为了让更全面地理解Git,就将对Git的学习总结为**《 Git简明教程》**,便利日后随时查阅,也希望对其他人有所帮助!

Git是什么?

Git是一个分布式版别操控体系,而SVNCVS等则为集中式版别操控体系

分布式与集中式的差异

集中式版别操控体系的特点是需求长途服务器,假如无法衔接长途服务器,咱们所做的改动就无法提交,如下图所示:

一文讲清Git的基础知识|Git简明教程

而在分布式版别操控体系中,每个端都保存着库房完好的信息,不用联网也能够查询到一切的改动历史、在本地进行commit、checkout等操作,仅当你需求将改动推送到长途库房,才需求网络,如下图所示:

一文讲清Git的基础知识|Git简明教程

Git有哪些特性

Git有以下几个特性:

本地操作

大部分操作都在本地进行,不需求连网,本地保存着库房的完好信息,假如长途库房损坏,随时能够用本地库房进行数据恢复。

一个根据文件快照文件体系

Git与其他版别操控体系的其他不同之处在于Git对待数据的方式,Git就像一个小型的文件体系,在咱们每次提交,对整个文件体系做一个快照。

一文讲清Git的基础知识|Git简明教程

保证数据完好性

Git 中一切的数据在存储前运用哈希算法核算一个哈希值,只需内容一改动,哈希值就会发生,这样能够保证任何数据的改动都能够被Git发觉,从而维护数据的完好性。

高效分支办理

一般的版别操控体系都支撑分支办理,但是这些体系创立分支便是把整个体系仿制一份罢了,这关于大型项目来说,就很费时间了,而Git则完全不同,Git的分支是十分轻量级的,在Git中,分支的创立、删除、兼并都十分快速,有时只是移动一个指针罢了。

一文讲清Git的基础知识|Git简明教程

装备Git

刚开始运用Git时,需求装备一下Git环境,榜首件事便是装备你的用户名和邮件地址,这儿的用户名和邮箱地址会写入到你之后的每一次提交傍边:

git config --global user.name "test"
git config --global user.email "test@example.com"

上面运用git config指令时,咱们运用--global选项,表明该装备对一切的库房都有用,实际上Git的装备有三个级别,对应的指令选项为--global--system--local,其中--local优先级最高,--system优化级最低。

–system

表明对体系上一切用户的一切库房都有用,对应的修正会保存在/etc/gitconfig文件中,由所以体系级别的装备,因而需求办理员权限才干操作。

git config --system user.name "test"
git config --system user.name "test@example.com"

–global

表明对当时用户的一切库房都有用,对应装备会保存在~/.gitcofnig或者~/.config/git/config文件中。

git config --global user.name "test"
git config --global user.name "test@example.com"

–local

对当时库房有用,对应的装备会保存在项目的.git/config文件傍边。

git config --local user.name "test"
git config --local user.name "test@example.com"

能够运用以下指令检查不同级别装备文件的方位及相关装备:

git config --list --show-origin

Git根本操作流程

  1. 生成或者克隆一个库房

  2. 在作业区中修正文件。

  3. 将你想要下次提交的更改选择性地暂存,这样只会将更改的部分增加到暂存区。

  4. 提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。

  5. 将提交推送到长途库房。

这儿有几个概念是咱们学习Git必需求厘清的概念,即:库房(Repository)作业区(workspace)暂存区(Index,也称为索引)长途库房(Remote),它们之间的关系如下图所示:

一文讲清Git的基础知识|Git简明教程

怎么生成Git库房

Git创立库房有两种方式:

  • 在本地初始化
  • 克隆现已存在的长途库房

本地初始化

mkdir demo
cd demo
git int

或者不进入目录,直接对某个目录进行初始化:

git init demo

履行完上面的指令之后,咱们便在demo目录中初始化了一个库房,这时候Git默认帮咱们创立一个称号为master或者main的分支。

克隆现已存在的长途库房

除了初始化空库房之外,有时候咱们需求参加一些现已进行的项目,这样的项目现已有存在的库房了,这时候咱们能够选用克隆的方式把长途库房同步到咱们本地目录,如:

git clone https://github.com/xxx/xxx

默认情况下,会把长途版别库的称号作为克隆到本地目录的称号,咱们也能够自定义本地目录的称号,如:

git clone https://github.com/xxx/xxx demo

克隆后,默认也是进入一个master或者main的主分支,该分支会相关到咱们克隆的长途服务器上的同名分支,咱们也能够指定要克隆长途服务器的哪个分支:

git clone -b develop https://githbu.com/xxx/xxx demo

分支是Git中十分重要的内容,也是Git精华之所在,咱们以后的文章再详细讲解!

差异作业区与库房

经过上述过程后,咱们在demo目录中生成了一个库房,这儿有一点要注意的是,许多初学者往往把demo看作是库房,其实demo目录下的.git才是库房,而demo目录则是作业区。

作业区是咱们操作文件的当地,咱们增加、修正或删除文件都是在demo目录中进行的,而终究提交的数据是保存到.git目录中的,所以.git目录才是库房,这个目录保留着整个库房的一切信息。

差异作业区与暂存区

SVN或CVS的运用习惯是直接提交所修正的内容,而Git并不是这样的,在Git中,当咱们在作业区对文件作出修正后,并不能直接提交,而是需求将文件增加到暂存区(Index或Stage),

将文件增加到暂存区

git add指令用于将文件增加到暂存区:

echo hello world >> README.md
git add README.md

除了一个一个地增加之外,git add 指令也支撑将全部修正一次性增加到暂存区,如:

git add --all
//或者
git add .

将文件从暂存区中吊销

关于增加到暂存区的文件,也能够履行吊销操作,比方咱们想将上面增加到暂存区的文件撤回作业区,能够这样做:

git restore --staged README.md

怎么提交

把要提交的文件增加到暂存区后,假如想提交到库房中,可运用git commit指令:

git commit

履行上面的指令后,会弹出一个vim修改器窗口,咱们能够在这个窗口修改提交阐明,修改完成后保存退出就完成了一次提交了。

当然,也能够在git commit指令跟上-m选项来附带阐明文字,这样能够直接提交:

git commit -m '提交阐明'

尽管运用暂存区,能够让咱们更好的选择自己要提交的修正,但这样多一个过程总是很烦人,所以Git支撑在git add指令后跟上一个-a选项,这样能够直接越过暂存区,直接将当时作业的修正提交到库房中:

git commit -a -m "提交阐明"

不过,要注意的是,未盯梢的文件并不会直接被提交,仍是需求增加到暂存区的。

Git库房文件的状况

从上面的操作中,咱们能够看到,一个文件从创立到提交,阅历了几个状况的变化,如下图所示:

一文讲清Git的基础知识|Git简明教程

总结如下:

  • 刚创立的文件状况为Untracked,表明该文件还未被纳入Git的版别操控中。
  • git add指令会文件增加到暂存区,此时文件的状况为Staged
  • 文件在暂存区被commit之后,状况则为Unmodified
  • Unmodified状况的文件被修正后则状况变为Modified
  • git rm指令会把文件从Unmodified变成Untracked

长途库房

到目前为止,咱们的一切操作仍是在本地进行的,当咱们想把与库房与他人共享,或者参加他人的项目时,这时候就需求衔接长途库房了。

长途库房,并不一定阐明该库房一定要在互联网中的另一台服务器上,长途库房也能够是你本机的另一个库房

检查长途库房

假如想检查当时库房相关到哪个长途库房,能够运用下面的指令:

git remote -v

假如咱们运用git clone指令克隆一个长途版别库,Git会帮咱们将该长途库房命名为origin

增加长途库房

也能够自己增加当时库房相关的长途库房,比方下面咱们增加一个称号为foo的库房:

git remote add foo https://www.github.com/xxx/xxx

向长途库房推送

运用git push指令能够将本地的提交推送到长途库房:

git push

履行上面指令的话,会推送当时一切分支,推送到长途库房中同名的分支下,当然咱们也能够推送到指定的分支,比方咱们指定推送到foodevelop分支上:

git push foo develop

同步长途库房

假如他人向长途版别库推送了改动,而咱们想同步到本地的库房,能够运用git fetch将长途库房的最新改动抓取回来:

git fetch

相同,也能够指定抓取哪个分支:

git fetch foo develop

但是,履行git fetch后也只是把他人推送到长途库房的改动拉回来罢了,却并不会把改动兼并到咱们当时作业区,所以咱们还需求自己手动履行兼并指令:

git merge

上面的指令没有指定兼并哪个长途库房分支,所以会默认兼并当时分支所盯梢的长途分支,也能够指定兼并哪个分支:

git merge foo develop

假如觉得履行git fetchgit merge比较麻烦的话,也能够运用git pull指令,这个指令在抓取长途库房数据后,会主动履行兼并:

git pull foo develop

小结

在这篇文章中,咱们首要讲清楚了以下几个知识点:

  • Git是什么?有哪些特性?
  • 分布式版别操控体系与集中式版别操控体系的差异?
  • 怎么装备本机的Git环境?
  • Git的根本操作流程,学习了Git的根本指令。