Git

一.git简介

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

关于版本控制系统:

版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.有了它你就可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等

二.安装

在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。

Git 各平台安装包下载地址为:http://git-scm.com/downloads

Linux 平台上安装

Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。

在有 yum 的系统上(比如 Fedora)或者有 apt-get 的系统上(比如 Debian 体系),可以用下面的命令安装:

各 Linux 系统可以使用其安装包管理工具(apt-get、yum 等)进行安装:

Debian/Ubuntu

Debian/Ubuntu Git 安装命令为:

$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

$ apt-get install git

$ git --version
git version 1.8.1.2

Centos/RedHat

如果你使用的系统是 Centos/RedHat 安装命令为:

$ yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

$ yum -y install git-core

$ git --version
git version 1.7.1

源码安装

我们也可以在官网下载源码包来安装,最新源码包下载地址:https://git-scm.com/download

安装指定系统的依赖包:

# Centos/RedHat
$ yum install curl-devel expat-devel gettext-devel \
  openssl-devel zlib-devel

# Debian/Ubuntu
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
  libz-dev libssl-dev

解压安装下载的源码包:

$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install

Windows 平台上安装

在 Windows 平台上安装 Git 同样轻松,有个叫做 msysGit 的项目提供了安装包,可以到 GitHub 的页面上下载 exe 安装文件并运行:

安装包下载地址:https://gitforwindows.org/

官网慢,可以用国内的镜像:https://npm.taobao.org/mirrors/git-for-windows/。

三.创建版本库

我们先来理解下 Git 工作区、暂存区和版本库概念:

  • **工作区:**就是你在电脑里能看到的目录。
  • **暂存区:**英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

1.创建一个目录作或者选择一个有内容的目录为工作区

2.使用当前目录作为Git仓库,我们只需使它初始化

git init

Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。

在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。

补充:

使用指定目录作为Git仓库

git init newtest

初始化后,会在 newtest 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。

image-20210924093150441

3.把文件添加到版本库

这里我在工作区里添加一个文本文件作为演示:

image-20210924092324274

一个文件放到Git仓库只要三步( 把大象当冰箱 ):

(1)把文件放到工作区或者新建文件,保证文件是在工作区目录下或子目录下

(2)用git add命令把文件添加到暂存区 : git add read.txt

image-20210924093310094

(3)用git commit命令用把文件提交到仓库

git commit -m "第一次提交"  # -m后面输入的是本次提交的说明(message)

image-20210924094110000

提交后发现和git add一样没有任何反应,在linux中没有反应是最好的反应

四.版本回退

git log命令:查看历史提交记录

假如说我修改read.txt文件,添加一行文字测试修改

image-20210924095910028

使用git log命令查看提交记录

image-20210924100229414

如果提交次数很多,可以使用git log --pretty=oneline查看提交记录

image-20210924100811619

说明:

提交记录里面那一大串字符``(20b123....)commit id`(版本号)

版本回退:

使用命令git reset回退版本:

说明:

在Git中,用HEAD表示当前版本,也就是最新的提交20b123....,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

git reset --hard HEAD^

image-20210924101641245

打开之前添加的文字修改,发现回退到第一次提交的版本

image-20210924101455734

用命令git log查看版本历史,我们如果想再回到最新版本(添加文字修改过的那个版本)怎么办:

git reset --hard 20b123

id没必要写全,前几位就可以了,Git会自动去找

image-20210924102240066

问题来了,假如说,我关机了,或者关掉git了,ID不知道怎么办.在git中,总有后悔药可以吃:

使用命令git reflog查看命令历史

image-20210924102704700

知道了id不是想怎么玩就怎么玩!

五.查看仓库当前的状态

命令git status查看仓库当前的状态,显示有变更的文件

我在工作区中再添加一个文件

image-20210924103641139

使用命令:

git status

image-20210924103754374

me.txt文件没有被添加,所以它的状态是Untracked

那现在来添加一下,再查看:

image-20210924104244925

提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的(working tree clean)

六.添加远程仓库--Github

首先你需要你个Github账户,再者你要创建一个仓库,注册账户就不说了,闭上眼注册就行了,我们来说一下创建仓库吧

image-20210924105758719

接着确定就行了....

创建好的效果如图:

image-20210924105931868

接着,我们从这里找到github仓库的地址

image-20210924110355453

执行命令:

git remote add origin https://github.com/code-anime/test.git

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的

下一步,就可以把本地库的所有内容推送到远程库上:

git push -u origin master

执行完毕后我们可以看到github上远程仓库内容和本地的内容一样.

image-20210924152157440

注意:

执行途中可能遇到的问题:

(1)SSH错误

由于你的本地 Git 仓库和 GitHub 仓库之间的传输是通过SSH加密的,所以我们需要配置验证信息:

使用以下命令生成 SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

后面的 your_email@youremail.com 改为你在 Github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。

成功的话会在 ~/ 下生成 .ssh 文件夹,进去,打开 id_rsa.pub,复制里面的 key

$ ssh-keygen -t rsa -C "2272166487@qq.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tianqixin/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase):    # 直接回车
Enter same passphrase again:                   # 直接回车
Your identification has been saved in /Users/tianqixin/.ssh/id_rsa.
Your public key has been saved in /Users/tianqixin/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:MDKVidPTDXIQoJwoqUmI4LBAsg5XByBlrOEzkxrwARI 429240967@qq.com
The key's randomart image is:
+---[RSA 3072]----+
|E*+.+=**oo       |
|%Oo+oo=o. .      |
|%**.o.o.         |
|OO.  o o         |
|+o+     S        |
|.                |
|                 |
|                 |
|                 |
+----[SHA256]-----+

回到 github 上,进入 Account => Settings(账户配置)。

48840BF0-992F-4CCC-A388-15CB74819D88

左边选择 SSH and GPG keys,然后点击 New SSH key 按钮,title 设置标题,可以随便填,粘贴在你电脑上生成的 key。

img

img

添加成功后界面如下所示

img

为了验证是否成功,输入以下命令:

$ ssh -T git@github.com
The authenticity of host 'github.com (52.74.223.119)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes                   # 输入 yes
Warning: Permanently added 'github.com,52.74.223.119' (RSA) to the list of known hosts.
Hi tianqixin! You've successfully authenticated, but GitHub does not provide shell access. # 成功信息

以下命令说明我们已成功连上 Github。

(2)下面这个错误

warning: redirecting to https://github.com/code-anime/test.git/
To http://github.com/code-anime/test.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'http://github.com/code-anime/test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

解决:

执行命令:

git pull --rebase origin master

image-20210924154216282

接着再试一下:

git push -u origin master

七.移除远程仓库

如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>

建议执行该命令之前执行git remote -v查看远程库信息

image-20210924154708648

然后根据名字删除,比如删除origin

此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。

查看.git目录下的config文件,发现原来的这条没有了:

[remote "origin"]
	url = https://github.com/code-anime/test.git
	fetch = +refs/heads/*:refs/remotes/origin/*

如果想重新建立与远程库之间的连接:

git remote add origin git remote add origin https://github.com/code-anime/test.git
git add .
git commit -m "第三次提交"
git push -u origin master

八.从远程库克隆

上面所讲到的是先有本地库,后有远程库,如何关联远程库.

现在,我们来说先有远程库,再有本地库(从远程库克隆),这里我把本地test工作区删除,github上面的test仓库也删除了.从零开始演示.毕竟是test

接着就是创建github仓库,这里不做赘述了.

image-20210924161133414

我在桌面新建了一个文件夹repos,没别的意思就是repository的简写

image-20210924161331081

然后打开文件夹 , 然后git bash here

执行命令:

git clone git@github.com:code-anime/test.git

上面git clone后跟的是仓库地址.

image-20210924161716540

执行命令后,会发现repos目录里面多了一个test文件夹(就是克隆github上的test仓库)

image-20210924161948468

打开test文件夹后我们会发现,和远程仓库内容是一样的

注意:

GitHub给出的地址不止一个,还可以用https://github.com/code-anime/test.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

九.分支管理

首先,列出分支:

git branch

image-20210924163643370

意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支.当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。

如果我们要手动创建一个分支。执行 git branch (branchname) 即可。

创建一个testing分支:

git branch testing

image-20210924163759356

现在我们可以看到,有了一个新分支 testing

当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。

我们切换到testing分支进行实验:

git checkout testing

image-20210924164433951

接下来我们将演示如何切换分支,我们用git checkout (branch) 切换到我们要修改的分支。

我们在testing分支上正常提交,比如创建文件readme.txt,内容写上:

测试testing分支

然后提交:

git add .
git commit -m "添加文字测试testing分支"

image-20210924165518165

现在我们切换会master分支后,再查看readme.txt文件,文件不见了!

!image-20210924165412661

当我们满怀怀疑的时候我们切换回来testing分支,发现还在

image-20210924165631400

因为那个提交是在testing分支上,而master分支此刻的提交点并没有变:

现在,我们把testing分支的工作成果合并到master分支上:

git checkout master
git merge testing

image-20210924165843223

合并完成后,就可以放心地删除testing分支了:

git branch -d testing

image-20210924170024645

十.合并冲突

合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。

git branch
* master
cat readme.txt
测试testing分支

现在我们只有一条主分支masterreadme.txt文件中只有测试testing分支这一段文字.

首先,我们创建一个test1分支, 切换过去,我们将readme.txt文件添加123三个数字

image-20210924171453362

将修改的内容提交到 change_site 分支中。 现在,假如切换回 master 分支我们可以看内容恢复到我们修改前的内容,没有123

image-20210924172006902

我们再次修改readme.txt文件,添加数字456

image-20210924172154332

现在这些改变已经记录到我的 master分支了。接下来我们将 test1分支合并过来。

git merge test1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

打开文件,看见冲突内容

image-20210924172413734

我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

123456

再提交:

git add .
git commit -m "分支冲突解决"

image-20210924173037796

用带参数的git log也可以看到分支的合并情况:

git log --graph --pretty=oneline --abbrev-commit

image-20210924173113409

最后,删除分支:

git branch -d test1

image-20210924173258947

十一.标签管理

如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。

比如说,我们想为我们的 test项目发布一个1.0版本。 我们可以用 git tag V1.0命令给最新一次提交打上(HEAD)v1.0的标签。

首先,切换到需要打标签的分支上:

git tag v1.0 

当你执行 git tag -a 命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。

可以用命令git tag查看所有标签:

git tag
v1.0

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,本该在昨天打的tag没打怎么办?

方法是找到历史提交的commit id,然后打上就可以了:

git log --pretty=oneline --abbrev-commit

image-20210924183517132

比方说要对添加456三个数组这次提交打标签,它对应的commit id是fe6c8d7,敲入命令:

git tag v0.9 fe6c8d7

再用命令git tag查看标签:

$ git tag
v0.9
v1.0

注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:

git show v0.9

image-20210924183926673

可以看到,v0.9确实打在add 添加456三个数字这次提交上。

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -a v0.6 -m "version 0.6 released" 1094adb

用命令git show <tagname>可以看到说明文字:

git show v0.6

image-20210924184645266

用命令git tag -d <tagname>删除标签

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

git tag -d v0.6

image-20210924184827587

如果要推送某个标签到远程,使用命令git push origin <tagname>

git push origin v1.0

image-20210924185208955

image-20210924185236112

或者,一次性推送全部尚未推送到远程的本地标签:

$ git push origin --tags

image-20210924185304118

image-20210924185326118

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

$ git tag -d v1.0

然后,从远程删除。删除命令也是push,但是格式如下:

$ git push origin :refs/tags/v1.0

要看看是否真的从远程库删除了标签,可以登陆GitHub查看。

image-20210924185520588

十二.Gitee使用(hexo博客部署到gitee)

如果你-ssh密钥删除了或者不见了,新建一个ssh密钥

image-20210924190947679

需要重新上传到github

打开你本地生成的ssh密钥(默认路径是C:\user\你的电脑用户名\ .ssh\id_rua_pub)

image-20210924192156924

放到github上:

image-20210924192007187

image-20210924192454932

第一次要密码,输入你创建ssh密钥时候的密码即可.

image-20210924192603706

使用Gitee和使用GitHub类似,我们在Gitee上注册账号并登录后,需要先上传自己的SSH公钥。选择右上角用户头像 -> 菜单“修改资料”,然后选择“SSH公钥”,填写一个便于识别的标题,然后把用户主目录下的.ssh/id_rsa.pub文件的内容粘贴进去

image-20210924192837739

这里我来演示一下在gitee上搭建Hexo博客吧,顺便复习一下:

准备:

安装git,nodejs,npm

(1)首先,创建一个工作目录作为我们的博客目录

image-20210924193136037

右键git bash here

hexo init

初始化hexo

(2)下载主题安装,这里以butterfly主题为例

在你的 Hexo 根目目录

git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly

修改 Hexo 根目录下的 _config.yml,把主題为butterfly

theme: butterfly

image-20210924193754607

(3)安装插件

npm install hexo-renderer-pug hexo-renderer-stylus --save

在 hexo 的根目录创建一个文件_config.butterfly.yml,并把主题目录的 _config.yml内容复制到_config.butterfly.yml去。

注意: 不要把主題目录的_config.yml 刪掉

以后只需要在_config.butterfly.yml進行配置就行。

Hexo会自动合并主题中的_config.ymlconfig.butterfly.yml里的配置,如果存在同名配置,會使用config.butterfly.yml的配置,其优先度较高

image-20210924194202773

然后执行:

hexo clean && hexo g && hexo s

image-20210924194518098

在浏览器打开http://localhost:4000:

image-20210924194553580

能打开说明是好的

(4)部署到gitee

安装组件:

npm install hexo-deployer-git --save

然后:

hexo clean && hexo g && hexo d

最后出现下面那个图为正解.

image-20210924200326794

(5)开启网页服务

image-20210924200432706

直接点击生成即可,就会显示已开启 Gitee Pages 服务,网站地址: xxxxxx

至此,一个用户名.gitee.io的博客网站部署完成

image-20210924200607307

image-20210924200709360

Q.E.D.


樱花庄的一只二刺猿