Git 知识点
[TOC]
1.CentOS安装Git
1.1 YUM源或者第三方源IUS源安装
# 卸载自带Git
yum remove -y git
yum install -y epel-release
# centos6配置IUS源
rpm -ivh https://centos6.iuscommunity.org/ius-release.rpm
# centos7配置IUS源
rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm
yum list git2u
yum install -y git2u
git --version
# windows版本升级到最新版本
git update-git-for-windows
1.2 CentOS安装最新版Git(源码安装)
# 安装第三方依赖
sudo yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
# 为了能够添加更多格式的文档(如 doc, html, info),你需要安装以下的依赖包
sudo yum install -y asciidoc xmlto docbook2X
# 如果使用的是 Fedora/RHEL/RHEL-衍生 系统,需要执行
sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi
# 下载源码,解压后编译安装
wget https://codeload.github.com/git/git/tar.gz/v2.18.0
tar zxvf git-2.18.0.tar.gz && cd git-2.18.0
sudo make configure
./configure --prefix=/usr
sudo make all doc info && sudo make install install-doc install-html install-info
# 现在已经可以用git命令了,用git把Git项目仓库克隆到本地,以便日后随时更新
git clone git://git.kernel.org/pub/scm/git/git.git
1.3 配置全局用户名和邮箱
git config --global user.name "顾小兔"
git config --global user.email 524343695@qq.com
1.4 安装中文汉化包
下载后解压到/mingw64/share即可,同时Git Bash设置如下:
显示效果:
2. Git命令
2.1 git常用命令
# 初始化Git本地仓库
git init
# 查看Git项目状态(工作区、暂存区)
git status
# 查看Git项目日志记录(本地仓库,--oneline:显示在一行(提交哈希值,注释),看不到reset回退之后的记录
git log [--oneline]
# 显示效果
038b811 (HEAD -> master) 增加d.txt
a09f72b 增加c.txt
351e5ec 增加a.txt
b1baca7 增加b.txt
# 也可以使用git reglog,显示的HEAD@{数字},表明HEAD指针移动到当前指针需要几步,回退后仍然可以看到所有的版本记录 方便查看每个操作步骤所在的版本,可以根据版本号自由前进后退
git reflog
# 显示效果
038b811 (HEAD -> master) HEAD@{0}: reset: moving to 038b811
9723e41 HEAD@{1}: reset: moving to HEAD
9723e41 HEAD@{2}: commit: 第二次修改d.txt
23a53b3 HEAD@{3}: commit: 修改d.txt
038b811 (HEAD -> master) HEAD@{4}: commit: 增加d.txt
a09f72b HEAD@{5}: commit: 增加c.txt
351e5ec HEAD@{6}: commit: 增加a.txt
b1baca7 HEAD@{7}: commit (initial): 增加b.txt
# 远程服务器Git仓库克隆项目到本地仓库
git clone <远程仓库> [文件路径]
# 将工作区的文件(新建或修改)增加到暂存区进行追踪
git add <文件>
# 暂存区的文件修改后,用git add <文件>更新暂存区文件
git add <文件>
# 暂存区的文件修改后直接提交(但是跳过了暂存区,所以无法撤销,文件无法回退到工作区)
git commint -am 'comment'
# 暂存区的文件修改后,用git checkout -- <文件>丢弃修改
git checkout -- <文件>
# 删除暂存区的文件,-r:递归删除,-f:强制删除
git rm -rf <文件>
# 取消文件暂存,文件返回工作区中
git rm --cached <文件>
# 删除工作区的文件,-r:递归删除,-f:强制删除
rm -rf <文件>
# Git项目提交到本地仓库
git commit -m 'comment' <文件>
# 本地仓库中项目推送到原车给服务器Git仓库
git push
# 从远程服务器Git仓库更新项目到本地仓库
git pull
2.2 回退历史版本命令
2.2.1 git reset --soft 仅仅在本地仓库移动HEAD指针,但是本地文件还是之前最新状态
2.2.2 git reset --mixed 本地仓库移动HEAD指针,同时重置暂存区
2.2.3 git reset --hard 本地仓库移动HEAD指针,同时重置暂存区和工作区
# 重置HEAD指针到某个历史版本,可以在所有历史版本中前进或后退,一般与git reflog配合使用
git reset --hard <哈希值>
# 重置HEAD指针到某个历史版本,只能后退,n表示后退n步
git reset --hard HEAD~n
# 重置HEAD指针到某个历史版本,只能后退,一个^表示后退一步,n个^表示后退n步
git reset --hard HEAD^^^
2.2.4 各种误删文件情况
1)在误删文件同时提交到本地库后,可以通过git reset --hard <文件删除前的版本哈希值>来找回误删的文件
git reset --hard <文件删除前的版本哈希值>
2)添加到暂存区的误删除文件找回,解决办法:hard方式重置本地库HAAD指针,让暂存区,工作区和本地库保持一致
git add <文件>
git commit -m '增加文件' <文件>
rm -rf <文件> # 工作区删除文件
git add <文件> # 将删除操作变更提交到暂存区
git status # 查看工作区和暂存区状态
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
删除: e.txt
git reset --hard HEAD # :hard方式重置本地库HAAD指针,让暂存区,工作区和本地库保持一致
总结:
==前提,删除前,文件存在于本地库。==
git reset --hard [HEAD指针位置]
- 删除操作已经提到本地库,HEAD指向历史版本位置
- 删除操作尚未提交本地库,HEAD指向当前版本位置(默认HEAD)
2.3 git diff <文件> 文件比较命令
# 修改e.txt后比较(默认和暂存区比较)
git diff <文件>
# -:表示删除的行,+:表示增加的行
diff --git a/e.txt b/e.txt
index 384c816..f0ebe0a 100644
--- a/e.txt
+++ b/e.txt
@@ -1 +1,5 @@
-eeeeee
+
+
+1234434
+1345454
+dfda
# 增加到暂存区后,显示没有任何修改
git diff <文件>
# 如果和本地库比较,则和之前一样显示删除增加修改的行
git diff HEAD <文件>
Tips:如果某行同时又删除和增加或者修改操作。会把原有的那行用-表示删除,再把更新好的结果用+表示增加,如以下效果
-dfda +dfdd
结论:不带文件名就是比较多个文件
git diff <文件> # 工作区和暂存区比较 git diff [本地库历史版本哈希值] <文件> # 工作区和本地库比较
2.4 git branch 分支管理
2.4.1 git branch基础命令
git branch <分支名> # 创建分支
git checkout <分支名> # 切换分支
git branch -v # 查看所有分支,前面*标识当前所在分支
2.4.2 合并分支
切换到接受修改的分支的上(被合并,增加新内容)
git checkout <被合并的分支名>
执行合并命令git merge
git merge <有新内容的分支名> # 查看当前HEAD指针指向版本 git log --oneline 14b5d83 (HEAD -> xiaotu) 修改c.txt 5a466a3 (master) 增加e.txt 9723e41 第二次修改d.txt 23a53b3 修改d.txt 038b811 增加d.txt a09f72b 增加c.txt 351e5ec 增加a.txt b1baca7 增加b.txt
解决冲突
# 当前分支合并另一分支 git merge <分支名> 自动合并 b.txt 冲突(内容):合并冲突于 b.txt 自动合并失败,,修正冲突然后提交修正的结果。 # 查看冲突文本,<<<<<<HEAD:当前分支内容,=======:分隔符,>>>>>>>xiaotu:分支xiaotu中的内容 cat <文件> <<<<<<< HEAD ffffff ======= ccccc >>>>>>> xiaotu # 修改b.txt,删除fffff等文本 cat <文件> ccccc # 提交到本地库,注意合并过程中不能单个文件部分提交 git add <文件> git commit -m 'comment' # 再次合并 git merge <分支名> # 显示合并成功 Already up to date.
3. Git的文件管理机制
3.1 Git文件系统简介
Git把数据看作小型文件系统的一组快照,每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不会重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git的工作方式可以称之为快照流。
3.2 Git的“提交对象”
提交对象以及父对象形成的链条
==切换分之前,master和testing指向当前最新版本,同时HEAD指向分支testing==
graph RL;
head[HEAD] -->testing[testing]
master[master] -->B[f30ab]
testing[testing] -->B[f30ab]
B[f30ab] -->C[34ac2]
C[34ac2] -->D[98ca9]
==切换分之前,testing更新提交后指向最新版本,master依然指向某个历史版本==
graph RL;
head[HEAD] -->testing[testing]
master[master] -->B[f30ab]
testing[testing] -->A[87ab2]
A[87ab2] -->B[f30ab]
B[f30ab] -->C[34ac2]
C[34ac2] -->D[98ca9]
==切换分之后,HEAD切换指向master主分支==
graph RL;
head[HEAD] -->master[master]
master[master] -->B[f30ab]
testing[testing] -->A[87ab2]
A[87ab2] -->B[f30ab]
B[f30ab] -->C[34ac2]
C[34ac2] -->D[98ca9]
附录:Hash算法简介
哈希是一系列的加密算法,各个不同的哈希加密算法虽然强度不同,但是有以下几个共同点:
- 不管输入的数据的数据量多大,输入同一个哈希算法,得到的加密长度固定。
- 哈希算法确定,输入数据确定,输出的数据结果唯一。
- 哈希算法确定,输入数据变化,数据的数据通常变化很大。
- 哈希算法不可逆
==Git底层采用的是SHA-1算法==
哈希算法可以被用来验证文件。原理如下图所示: