本文正在参加「金石方案 . 瓜分6万现金大奖」
文章首发于公众号:程序员读书;欢迎重视,能够榜首时间收到文章更新哦!
前言
关于程序员来说,Git
应该是每天都要打交道的东西吧,但许多时候咱们都只是停留在git add
、git push
、git pull
等简略指令的运用上,又或者只是运用GUI
东西(如Sourcetree
等)点击操作罢了,对Git并没有什么全面的了解,碰到问题可能需求不断上网查询。
因而,为了更好地运用Git,也为了让更全面地理解Git,就将对Git
的学习总结为**《 Git简明教程》**,便利日后随时查阅,也希望对其他人有所帮助!
Git是什么?
Git
是一个分布式版别操控体系,而SVN
、CVS
等则为集中式版别操控体系。
分布式与集中式的差异
集中式版别操控体系的特点是需求长途服务器,假如无法衔接长途服务器,咱们所做的改动就无法提交,如下图所示:
而在分布式版别操控体系中,每个端都保存着库房完好的信息,不用联网也能够查询到一切的改动历史、在本地进行commit、checkout等操作,仅当你需求将改动推送到长途库房,才需求网络,如下图所示:
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根本操作流程
-
生成或者克隆一个库房
-
在作业区中修正文件。
-
将你想要下次提交的更改选择性地暂存,这样只会将更改的部分增加到暂存区。
-
提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
-
将提交推送到长途库房。
这儿有几个概念是咱们学习Git必需求厘清的概念,即:库房(Repository)
、作业区(workspace)
、暂存区(Index,也称为索引)
、长途库房(Remote)
,它们之间的关系如下图所示:
怎么生成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库房文件的状况
从上面的操作中,咱们能够看到,一个文件从创立到提交,阅历了几个状况的变化,如下图所示:
总结如下:
- 刚创立的文件状况为
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
履行上面指令的话,会推送当时一切分支,推送到长途库房中同名的分支下,当然咱们也能够推送到指定的分支,比方咱们指定推送到foo
的develop
分支上:
git push foo develop
同步长途库房
假如他人向长途版别库推送了改动,而咱们想同步到本地的库房,能够运用git fetch
将长途库房的最新改动抓取回来:
git fetch
相同,也能够指定抓取哪个分支:
git fetch foo develop
但是,履行git fetch
后也只是把他人推送到长途库房的改动拉回来罢了,却并不会把改动兼并到咱们当时作业区,所以咱们还需求自己手动履行兼并指令:
git merge
上面的指令没有指定兼并哪个长途库房分支,所以会默认兼并当时分支所盯梢的长途分支,也能够指定兼并哪个分支:
git merge foo develop
假如觉得履行git fetch
和git merge
比较麻烦的话,也能够运用git pull
指令,这个指令在抓取长途库房数据后,会主动履行兼并:
git pull foo develop
小结
在这篇文章中,咱们首要讲清楚了以下几个知识点:
- Git是什么?有哪些特性?
- 分布式版别操控体系与集中式版别操控体系的差异?
- 怎么装备本机的Git环境?
- Git的根本操作流程,学习了Git的根本指令。