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 需要的数据和资源都存放在这个目录中。
3.把文件添加到版本库
这里我在工作区里添加一个文本文件作为演示:
一个文件放到Git仓库只要三步( 把大象当冰箱 ):
(1)把文件放到工作区或者新建文件,保证文件是在工作区目录下或子目录下
(2)用git add
命令把文件添加到暂存区 : git add read.txt
(3)用git commit
命令用把文件提交到仓库
git commit -m "第一次提交" # -m后面输入的是本次提交的说明(message)
提交后发现和git add
一样没有任何反应,在linux中没有反应是最好的反应
四.版本回退
git log
命令:查看历史提交记录
假如说我修改read.txt文件,添加一行文字测试修改
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TiaPz2Ln-1632487562316)(https://i.loli.net/2021/09/24/huG1l6posUjIrdc.png)]
使用git log
命令查看提交记录
如果提交次数很多,可以使用git log --pretty=oneline
查看提交记录
说明:
提交记录里面那一大串字符``(20b123…)是
commit id`(版本号)
版本回退:
使用命令git reset
回退版本:
说明:
在Git中,用HEAD
表示当前版本,也就是最新的提交20b123....
,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^
比较容易数不过来,所以写成HEAD~100
git reset --hard HEAD^
打开之前添加的文字修改,发现回退到第一次提交的版本
用命令git log
查看版本历史,我们如果想再回到最新版本(添加文字修改过的那个版本)怎么办:
git reset --hard 20b123
id没必要写全,前几位就可以了,Git会自动去找
问题来了,假如说,我关机了,或者关掉git了,ID不知道怎么办.在git中,总有后悔药可以吃:
使用命令git reflog
查看命令历史
知道了id不是想怎么玩就怎么玩!
五.查看仓库当前的状态
命令git status
查看仓库当前的状态,显示有变更的文件
我在工作区中再添加一个文件
使用命令:
git status
me.txt文件没有被添加,所以它的状态是Untracked
。
那现在来添加一下,再查看:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PnMzSfwj-1632487562326)(https://i.loli.net/2021/09/24/XoifkPWjz6OZ72A.png)]
提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的(working tree clean)
六.添加远程仓库–Github
首先你需要你个Github账户,再者你要创建一个仓库,注册账户就不说了,闭上眼注册就行了,我们来说一下创建仓库吧
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pXN7QFsB-1632487562327)(https://i.loli.net/2021/09/24/YGTurLsO3pfVRK4.png)]
接着确定就行了…
创建好的效果如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6VjAiNlD-1632487562328)(https://i.loli.net/2021/09/24/93KwCvolH4qemRu.png)]
接着,我们从这里找到github仓库的地址
执行命令:
git remote add origin https://github.com/code-anime/test.git
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的
下一步,就可以把本地库的所有内容推送到远程库上:
git push -u origin master
执行完毕后我们可以看到github上远程仓库内容和本地的内容一样.
注意:
执行途中可能遇到的问题:
(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(账户配置)。
左边选择 SSH and GPG keys,然后点击 New SSH key 按钮,title 设置标题,可以随便填,粘贴在你电脑上生成的 key。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8jbPVdT-1632487562333)(https://i.loli.net/2021/09/24/QGJrjOvehsnxfXo.jpg)]
添加成功后界面如下所示
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HhMMUmuV-1632487562335)(https://i.loli.net/2021/09/24/MyavhetVYEXijbP.jpg)]
为了验证是否成功,输入以下命令:
$ 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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cqOxvkkZ-1632487562336)(https://i.loli.net/2021/09/24/LknDerGX4qdI2ap.png)]
接着再试一下:
git push -u origin master
七.移除远程仓库
如果添加的时候地址写错了,或者就是想删除远程库,可以用git remote rm <name>
建议执行该命令之前执行git remote -v
查看远程库信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hjpcpxS8-1632487562338)(C:/Users/22721/AppData/Roaming/Typora/typora-user-images/image-20210924154708648.png)]
然后根据名字删除,比如删除origin
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
查看.git
目录下的config文件,发现原来的这条没有了:
[remote "origin"]url = https://github.com/code-anime/test.gitfetch = +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仓库,这里不做赘述了.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0unGwbWx-1632487562343)(https://i.loli.net/2021/09/24/ylbKxJ2D7GuZsgH.png)]
我在桌面新建了一个文件夹repos
,没别的意思就是repository
的简写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PcOyMDr-1632487562345)(https://i.loli.net/2021/09/24/nR69k4NqUBSKLY8.png)]
然后打开文件夹 , 然后git bash here
执行命令:
git clone git@github.com:code-anime/test.git
上面git clone
后跟的是仓库地址.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6fhXXlZ-1632487562346)(https://i.loli.net/2021/09/24/tkf2KZvTiswxmJB.png)]
执行命令后,会发现repos
目录里面多了一个test文件夹(就是克隆github上的test仓库)
打开test文件夹后我们会发现,和远程仓库内容是一样的
注意:
GitHub给出的地址不止一个,还可以用https://github.com/code-anime/test.git
这样的地址。实际上,Git支持多种协议,默认的git://
使用ssh,但也可以使用https
等其他协议。
使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh
协议而只能用https
九.分支管理
首先,列出分支:
git branch
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aW1pUCbX-1632487562348)(https://i.loli.net/2021/09/24/lUL2XWNVJqO7Gju.png)]
意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支.当你执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。
如果我们要手动创建一个分支。执行 git branch (branchname) 即可。
创建一个testing
分支:
git branch testing
现在我们可以看到,有了一个新分支 testing。
当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。
我们切换到testing
分支进行实验:
git checkout testing
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYk3rs8J-1632487562350)(https://i.loli.net/2021/09/24/SRsQ38JOdnBPqjG.png)]
接下来我们将演示如何切换分支,我们用git checkout (branch)
切换到我们要修改的分支。
我们在testing
分支上正常提交,比如创建文件readme.txt
,内容写上:
测试testing分支
然后提交:
git add .
git commit -m "添加文字测试testing分支"
现在我们切换会master
分支后,再查看readme.txt
文件,文件不见了!
![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2bArBHeG-1632487562353)(https://i.loli.net/2021/09/24/tpIsqRHXUASBk6E.png)]
当我们满怀怀疑的时候我们切换回来testing
分支,发现还在
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hP1dK74J-1632487562353)(https://i.loli.net/2021/09/24/VaKfgYxIbQZwj8e.png)]
因为那个提交是在testing
分支上,而master
分支此刻的提交点并没有变:
现在,我们把testing
分支的工作成果合并到master
分支上:
git checkout master
git merge testing
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pv7swisu-1632487562355)(https://i.loli.net/2021/09/24/IWJSRxPGCOpfqjE.png)]
合并完成后,就可以放心地删除testing
分支了:
git branch -d testing
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SW7dZNS2-1632487562357)(https://i.loli.net/2021/09/24/XUvorehsZ6pkFQf.png)]
十.合并冲突
合并并不仅仅是简单的文件添加、移除的操作,Git 也会合并修改。
git branch
* master
cat readme.txt
测试testing分支
现在我们只有一条主分支master
且readme.txt
文件中只有测试testing分支
这一段文字.
首先,我们创建一个test1
分支, 切换过去,我们将readme.txt
文件添加123
三个数字
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h7oiMBbr-1632487562358)(https://i.loli.net/2021/09/24/WYxC2al8NEcJroe.png)]
将修改的内容提交到 change_site 分支中。 现在,假如切换回 master 分支我们可以看内容恢复到我们修改前的内容,没有123
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UCpdY3T3-1632487562359)(https://i.loli.net/2021/09/24/EsmQdOgFalr3PIx.png)]
我们再次修改readme.txt
文件,添加数字456
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JgC2TQHu-1632487562360)(https://i.loli.net/2021/09/24/tkKfzLduywbamsQ.png)]
现在这些改变已经记录到我的 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.
打开文件,看见冲突内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V8r66FT9-1632487562361)(https://i.loli.net/2021/09/24/XQYtm57qlfAwaZM.png)]
我们将前一个分支合并到 master 分支,一个合并冲突就出现了,接下来我们需要手动去修改它。
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改如下后保存:
123456
再提交:
git add .
git commit -m "分支冲突解决"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jzdhGvFv-1632487562362)(https://i.loli.net/2021/09/24/8ZKXpn4GNM925Ye.png)]
用带参数的git log
也可以看到分支的合并情况:
git log --graph --pretty=oneline --abbrev-commit
最后,删除分支:
git branch -d test1
十一.标签管理
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZyfPJV7f-1632487562366)(https://i.loli.net/2021/09/24/LYaSbQeuRsirnCz.png)]
比方说要对添加456三个数组
这次提交打标签,它对应的commit id是fe6c8d7
,敲入命令:
git tag v0.9 fe6c8d7
再用命令git tag
查看标签:
$ git tag
v0.9
v1.0
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>
查看标签信息:
git show v0.9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-crS9GPc5-1632487562367)(https://i.loli.net/2021/09/24/NCEZIDVSQynKYOJ.png)]
可以看到,v0.9
确实打在add 添加456三个数字
这次提交上。
还可以创建带有说明的标签,用-a
指定标签名,-m
指定说明文字:
$ git tag -a v0.6 -m "version 0.6 released" 1094adb
用命令git show <tagname>
可以看到说明文字:
git show v0.6
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yr3vuQPK-1632487562368)(https://i.loli.net/2021/09/24/GyxXfu7t9iow5gT.png)]
用命令git tag -d <tagname>
删除标签
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
git tag -d v0.6
如果要推送某个标签到远程,使用命令git push origin <tagname>
:
git push origin v1.0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTfiDmiS-1632487562370)(https://i.loli.net/2021/09/24/mb6UOpI3hTjlGAM.png)]
或者,一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v1.0
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v1.0
要看看是否真的从远程库删除了标签,可以登陆GitHub查看。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JlJFpQg-1632487562374)(https://i.loli.net/2021/09/24/MJ6AewT32zLoucq.png)]
十二.Gitee使用(hexo博客部署到gitee)
如果你-ssh密钥删除了或者不见了,新建一个ssh密钥
需要重新上传到github
打开你本地生成的ssh密钥(默认路径是C:\user\你的电脑用户名\ .ssh\id_rua_pub)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OWtmaGcT-1632487562375)(https://i.loli.net/2021/09/24/3Z4CmqWVQyRUXTb.png)]
放到github上:
第一次要密码,输入你创建ssh密钥时候的密码即可.
使用Gitee和使用GitHub类似,我们在Gitee上注册账号并登录后,需要先上传自己的SSH公钥。选择右上角用户头像 -> 菜单“修改资料”,然后选择“SSH公钥”,填写一个便于识别的标题,然后把用户主目录下的.ssh/id_rsa.pub
文件的内容粘贴进去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6J6F2b8-1632487562380)(https://i.loli.net/2021/09/24/MSnVrQGkpTLDWm7.png)]
这里我来演示一下在gitee上搭建Hexo博客吧,顺便复习一下:
准备:
安装git,nodejs,npm
(1)首先,创建一个工作目录作为我们的博客目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WUhpbfOK-1632487562381)(https://i.loli.net/2021/09/24/o3b98kCDX6TpOB1.png)]
右键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
(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.yml
和 config.butterfly.yml
里的配置,如果存在同名配置,會使用config.butterfly.yml
的配置,其优先度较高
然后执行:
hexo clean && hexo g && hexo s
在浏览器打开http://localhost:4000
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aOlXuyLx-1632487562385)(https://i.loli.net/2021/09/24/ewNSToGKgUhm9YH.png)]
能打开说明是好的
(4)部署到gitee
安装组件:
npm install hexo-deployer-git --save
然后:
hexo clean && hexo g && hexo d
最后出现下面那个图为正解.
(5)开启网页服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rO7saibc-1632487562387)(https://i.loli.net/2021/09/24/UavdtkPAQs8cTYM.png)]
直接点击生成即可,就会显示已开启 Gitee Pages 服务,网站地址: xxxxxx
至此,一个用户名.gitee.io的博客网站部署完成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wA1DCLrV-1632487562389)(https://i.loli.net/2021/09/24/PmjcKDyRpSnTYzX.png)]