Git从入门到学会 Git简介 创建版本库 文件状态 版本回退 工作区和暂存区 管理修改 撤销修改 删除文件 远程仓库

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

Git是什么?

Git和SVN一样都是一种高效的管理代码的系统。

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

第一步,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

$ mkdir text
$ cd text/

第二步,通过git init命令把这个目录变成Git可以管理的仓库:

$ git init
Initialized empty Git repository in F:/text/.git/

瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

把文件添加到版本库

为了能够更好地利用Git,我们就需要把我们自己的代码放到Git仓库中,让Git仓库更好的进行管理,我们既可以直接在我们新建好的仓库中直接生成代码文件,也可以把我们写好的代码文件拖动到这个我们新建的Git仓库中,然而此时只是单单的把我们的代码放到了Git仓库中的工作区中,而非真正的交由Git进行管理,所以我们还需要进行下面几步。

$ vim readme.txt      #新建一个文件

第一步,用命令git add告诉Git,把文件添加到暂存区:

$ git add readme.txt

第二步,用命令git commit告诉Git,把文件提交到仓库:

$ git commit -m "creat new project"

简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

小结

现在总结一下今天学的两点内容:

初始化一个Git仓库,使用git init命令。

添加文件到Git仓库,分两步:

  • 第一步,使用命令git add <file>,注意,可反复多次使用,添加多个文件;

  • 第二步,使用命令git commit,完成。

文件状态

git status命令可以让我们时刻掌握仓库当前的状态

1、代码未add前,在工作区的状态

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

2、代码经过add,把文件添加到暂存区以后

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

3、用命令git commit告诉Git,把文件提交到仓库以后

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

虽然Git告诉我们readme.txt被修改了(没有add以及commit以前,只是简单的修改了代码),但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

版本回退

版本回退是在你编写代码的过程中,由于出现了某种错误,而需要返回上一个版本的情况。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

我们每次commit都会生成一个新的版本,在实际工作中,我们脑子里不可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史录

1、在Git中,我们用git log命令查看:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

2、git log命令显示从最近到最远的提交日志,我们可以看到3次提交, 如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

需要友情提示的是,你看到的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

那么到底版本回退该怎么做呢?首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

1>版本回退,就可以使用git reset命令(我们也可以取ID号的前几位,而不必都写上):

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

2>版本回退,我们也可以利用HEAD~x(上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。)

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

--hard参数的意义就是可以让你看到当前的版本回退的位置

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

3、还有一个问题就是如果你已经实现了版本的回退,然而我发现并不是我代码的问题,我回退错了,我不想回退了,或者是我Git已经关闭了,找不到新版本的commit id怎么办?

Git提供了一个命令git reflog用来记录你的每一次命令:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

这样我就可以通过找到新版本的commit id,进行反回退

小结

现在总结一下:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

工作区和暂存区

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

管理修改

 Git管理的是修改,而不是文件

下面我们就用实例来证明,首先我们先修改一个文件,修改完以后我们用add把文件加到暂存区中,然后在继续修改此文件,然后再用commit进行提交,然后利用status来查看

第一次修改 -----> git add ------> 第二次修改 ----> git commit---->status

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

我们可以看到怎么第二次的修改没有被提交,为什么呢?

你看,我们前面讲了,Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

那怎么提交第二次修改呢?你可以继续git addgit commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

小结

现在,你又理解了Git是如何跟踪修改的,每次修改,如果不add到暂存区,那就不会加入到commit中。

撤销修改

1、如果当你修改了代码,然后又发现修改错误以后,想撤销前面的操作的时候该怎么办呢?

既然错误发现得很及时,就可以很容易地纠正它。你可以删掉最后一行,手动把文件恢复到上一个版本的状态。如果用git status查看一下:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

你可以发现,Git会告诉你,git checkout -- file可以丢弃工作区的修改:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

2、如果当你修改了代码,已经add到暂存区而没有进行commit操作的时候,想撤销前面的操作的时候该怎么办呢?

Git同样告诉我们,用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

然后再通过第一种的情况来想撤销前面的操作

小结

又到了小结时间。

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

现在,文件就从版本库中被删除了。

另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

远程仓库

 这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

本地Git仓库和GitHub仓库之间的传输有俩种方式,一种是HTTPS,另一种是HHS

1、如果你选择的事HTTPS的数据传输方式的话,无需任何复杂的操作,直接利用git clone + 仓库地址,就能把远程仓库中的代码下载到本地

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

2、如果你使用HHS方式传输的话,就需要涉及到秘钥的问题了

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen.exe   #后面的选项直接回车就可以

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

这样就在就在你的用户目录下生成一个.SSH文件夹,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

点“Add Key”,你就应该看到已经添加的Key,然后你就可以通过HHS的方式进行文件的上传和下载了。

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

创建远程仓库

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

创建好的仓库

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

目前,在GitHub上的这个oldboy_website仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。

$ git remote add origin git@github.com:triaquae/oldboy_website.git #添加远程仓库
$ git push -u origin master #推到远程
 
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes   #第一次推会出现,写yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
Counting objects: 20, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (20/20), 1.76 KiB | 0 bytes/s, done.
Total 20 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To git@github.com:triaquae/oldboy_website.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin. 

注意:如果这里报如下错误,先删除远程 Git 仓库----->$ git remote rm origin,再添加远程 Git 仓库

Git从入门到学会
Git简介
创建版本库
文件状态
版本回退
工作区和暂存区
管理修改
撤销修改
删除文件
远程仓库

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

从现在起,只要本地作了提交,就可以通过命令:

$ git push origin master