Git 知识点

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 安装中文汉化包

Windows下Git汉化包下载

下载后解压到/mingw64/share即可,同时Git Bash设置如下:

Git 知识点
Git 知识点

显示效果:

Git 知识点

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指针,但是本地文件还是之前最新状态

Git 知识点

2.2.2 git reset --mixed 本地仓库移动HEAD指针,同时重置暂存区

Git 知识点

2.2.3 git reset --hard 本地仓库移动HEAD指针,同时重置暂存区和工作区

Git 知识点

# 重置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 合并分支

  1. 切换到接受修改的分支的上(被合并,增加新内容)

    git checkout <被合并的分支名>
  2. 执行合并命令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 
  3. 解决冲突

    # 当前分支合并另一分支
    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的工作方式可以称之为快照流。

Git 知识点

3.2 Git的“提交对象”

Git 知识点

提交对象以及父对象形成的链条

Git 知识点

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算法==

哈希算法可以被用来验证文件。原理如下图所示:

Git 知识点

上一篇:设计新手必看::帮新手熟练掌握字体运用的18招秘籍


下一篇:PS移动工具使用小技巧你知道吗