当前位置:   article > 正文

Git原理以及常用命令_git-bash git-cmd

git-bash git-cmd

一. Git的安装与配置

1. Git的安装
Windows下安装完后,有两个exe文件。Git-bash是git自带的编辑器,它是基于shell命令库开发的,所以可以使用Linux系统下的一些命令,熟悉Linux指令的建议使用这个编辑器。git-cmd使用了Windows下的cmd编辑器,不能使用Linux系统下的命令。
git-bash.exe
git-cmd.exe

如果习惯了使用windows下的cmd,建议配置一下环境变量,便于在非C:\Program Files (x86)\Git路径下也可以识别git命令:
Path路径中加入git-cmd.exe的路径。如:C:\Program Files (x86)\Git

2. Git的配置

执行git config命令之后会在C:\Users\Administrator下生成.gitconfig文件,里面包含了我们的git配置信息。

Git config --global user.name “xxxxx”    #用户名
Git config --global   “xxx@xx.com”       #邮箱
Git config --global gui.encoding utf-8   #gui中文乱码
Git config --global core.quotepath off   #git status显示中文乱码
Git config --global color.ui true
  • 1
  • 2
  • 3
  • 4
  • 5

获取config信息:

Git config --get user.name
Git config --get user.email
  • 1
  • 2

秘钥:

Git使用了ssh来进行加密传输,ssh的加密传输算法是rsa,rsa要解决的一个核心问题是,如何使用一对特定的数字,使其中一个数字可以用来加密,而另外一个数字可以用来解密。这两个数字就是public key也就是公钥以及private key私钥。公钥就是那个用来加密的数字,一般公钥要保存在服务器中。在我们访问远程仓库服务器的时候,服务器会要求我们出示私钥,通过私钥和公钥的配对来完成认证,决定是否允许我们访问服务器。由于使用的是不对称加密,所以公钥可以公开,只要保管好私钥就可以。
如果你的key丢失了,不管是公钥还是私钥,丢失一个都不能用了,解决方法也很简单,重新再生成一次

秘钥的生成:

ssh-keygen -t rsa -C "xxx@xx.com"
  • 1

这里写图片描述
C:\Users\Administrator下生成了一个.ssh文件夹。。ssh文件夹下有两个文件:id_rsa和id_rsa.pub,id_rsa为私钥,id_rsa.pub为公钥,id_rsa.pub公钥要上传到服务器中。


二. Git的原理

物理寻址(本地寻址):所有的数据存储在物理媒介的可用空间中,与其内容无关,系统记录其物理地址(physical location)供随后使用,这些物理地址通常通过使用一个列表或者目录来维护,当再次请求特定数据时,需要使用其物理地址,如路径和文件名。
内容寻址(Content-Basd Filesystem):系统记录的是一个内容地址(content-address),该内容地址是对应数据的一个唯一且持久的识别符,它是通过加密哈希算法(如,SHA-1或MD5)计算出来的一串值,当我们需要数据时,提供该内容地址,系统即可通过该地址获取数据的物理地址,返回数据;同时,对于数据的任何变更都将导致内容地址发生变化。

Git是一个内容寻址文件系统(content-addressed filesystem),其存储内容都是通过内容地址维护,采用了HashTable的方式进行查找。可以把它理解成一个键值对的存储方式:

  • Key值:文件名+文件内容,使用SHA-1算法,生成一个40位的十六进制字符组成的字符串。这个字符串就是Git中通常所说的校验和。
  • Value值:经过压缩后的文件内容。

Value值根据其保存的内容可以分为三种类型:

  • BLOB:binary large object,大的二进制对象,可以存储几乎所有的文件类型。(保存实际的文件内容)
  • Tree:组织BLOB对象的一种数据类型,可以当成多叉树中的Node节点。
  • Commit:表示每一次的提交操作

这种键值对的存储数据方式被封装起来使用就是git对象,因此,git对象分为:Blob对象,tree对象,commit对象。

总的来说,Git对象的存储方式:
将文件头与原始数据内容拼接起来,并计算拼接后的新内容的 40位的sha-1校验和,将该校验和的前2位作为object目录中的子目录的名称,后38位作为子目录中的文件名;然后,Git 用zlib的方式对数据内容进行压缩,最后将用 zlib 压缩后的内容写入磁盘。
这里写图片描述
如图,objects目录下的文件就是Git对象。因为每一次的文件删除,修改,新增操作都会重新生成新的Git对象,因此,.git文件夹要比实际上的文件总和大小要大得多。

Git提供了以下命令用来查看Git对象的内容以及类型:

//cat命令是linux下的一个文本输出命令,通常用于查看某个文件的内容
git cat-file -help
    -t                    show object type
    -s                    show object size
    -e                    exit with zero when there's no error
    -p                    pretty-print object's content
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

1. 新建本地的版本库

安装好Git后,如果我们需要本地创建一个版本库,并把相关文件加入到版本库中。

Git init
  • 1

Git init会在当前目录下生成一个.git文件夹,该文件夹下保存着Git进行版本控制所需要的文件,其目录结构为:
这里写图片描述

Hooks:主要定义了客户端或服务端钩子脚本,这些脚本主要用于在特定的命令和操作之前或者之后进行特定的处理
Info:保存了一份不希望在.gitignore 文件中管理的忽略模式的全局可执行文件
Logs:记录了本地仓库和远程仓库的每一个分支的提交记录,即所有的commit对象信息
objects:保存了该项目中所有的git对象。Git对象就是git的一些操作,git对象分为BLOB、tree和commit三种类型,例如git commit便是git中的commit对象。
Refs:保存了指向数据(分支)的提交对象的指针。其子文件夹heads存储本地每一个分支最近一次commit的sha1值
COMMIT_EDITMSG:记录了最后一次提交时的注释信息。
config:保存了针对该项目的一些配置信息
HEAD:该文件指明了git branch(即当前分支)的结果,比如当前分支是master,则该文件 就会指向master,但是并不是存储一个master字符串,而是分支在refs中的表示,例如ref: refs/heads/master。
index:保存了暂存区域的信息。该文件某种程度就是缓冲区(staging area),内容包括它 指向的文件的时间戳、文件名、sha1值等;

2. Git add操作

Git add Hello.txt    (Hello.txt中的内容为hello字串)
  • 1

当git add Hello.txt指令执行的时候,/.git/objects下生成一个b6文件夹,里面有一个fc4c620b67d95f953a5c1c1230aaab5db5a1b0文件,这里,文件夹名+文件名字就是经过SHA-1算法生成的校验和,代表着一个内存地址。
这里写图片描述
我们可以通过git cat-file命令查看该内存地址的内容和该内存地址所保存的对象类型:

这里写图片描述
该内存地址保存的内容是:hello
该内存地址保存的对象类型是:

说明在git add执行的时候,生成了blob对象,blob对象中保存的是我们add的文件的内容。

3. Git commit 操作

git commit -m "commit the hello.txt"
  • 1

执行git commit命令后,/.git/objects下生成一个a1和cf文件夹,下面各有一个文件。文件夹名+文件名字就是经过SHA-1算法生成的校验和,代表着一个内存地址。
这里写图片描述

我们可以通过git cat-file命令查看该内存地址的内容和该内存地址所保存的对象类型:

这里写图片描述

可以看到,a1文件夹下的7759e53ae373665ed9b4660c36f534b83fa324文件的对象类型是:commit
a1文件夹下的7759e53ae373665ed9b4660c36f534b83fa324文件的内容包括:

  • 提交信息:包括提交者姓名/邮箱和提交备注等相关信息;
  • tree对象的校验和:关于tree对象在下一节详细介绍;
  • 父提交对象的校验和(可能存在多个。如分支发生合并时,提交的父提交可能有多个)

cf文件夹下的aac44a83706cb6d241a8c329cb01eb2bca1f34文件的类型:tree
cf文件夹下的aac44a83706cb6d241a8c329cb01eb2bca1f34文件的内容:

  • 若干tree对象校验和: 指向当前目录的一个子目录;
  • 若干blob校验和:指向一个文件

以上说明了在git commit的时候,tree和commit对象被创建。tree对象包含了blob对象的引用,blob对象保存了真正的文件内容,tree对象以类似于树节点的形式,tree对象互相串联构建成一颗多叉树。这种多叉树组合起来就是一个git版本库。

4. Index索引文件(暂存区)

Git把文件分为Untracked和tracked两种状态,而tracked又分为Unmodified,Modified,Staged三种状态,这几种状态如下:
Untracked: 新添加的文件,还没有纳入git版本控制,处于未跟踪状态。
Unmodified: 已经被跟踪的文件,但是没有做过新的修改。也就是commit提交之后的文件状态
Modified: 已经被跟踪的文件,且做过新的修改。也就是commit提交之后再次修改的文件状态
Staged: 文件已经放入到index缓存区。也就是git add之后的文件状态。

这里写图片描述

Git add之后在暂存区域创建了blob对象,blob对象保存了实际的文件内容,其校验和代表了blob对象的内存地址,这个内存地址被保存到/.git/index索引文件中。Git status就是把每一个文件的索引信息和上次提交的索引信息进行比较,如果发生了变化,就会显示出来。
Index索引文件一般也被称为缓存区,虽然执行git add之后在暂存区域创建了blob对象,但是并没有真正加入到git本地版本库中,我们可以git add多次多个文件或者git add同一个文件多次,每次add的过程都会生成一个或者多个新的blob对象。只有当执行git commit后,创建了tree对象,把blob对象串联成多叉树,才真 正加入到git本地版本库中。所以index索引文件一般称为缓存区。
下面的图比较形象的表示了这种缓冲区的概念:

这里写图片描述


三. Git的常用命令

Git的基本命令如下:
这里写图片描述

HEAD一般指的是本地版本库,origin代表远程仓库的地址,origin/master代表的远程仓库中的master分支。

添加文件内容到暂存区中:

Git add .
Git add --all
Git add  “filename”
  • 1
  • 2
  • 3

撤销修改:

Git reset .
Git reset “filename”
Git reset HEAD  撤销版本库和暂存区的修改。(撤销add和commit的过程)
Git reset --soft  撤销版本库中的修改(也就是撤销commit的过程)
Git reset --hard  撤销工作区,暂存区,版本库中的修改。后面如果跟着HEAD,则是撤销工作区,缓存区的修改,替换成本地版本库中的修改。如果跟着origin,则是撤销工作区,缓存区,版本库中的修改,替换成远程分支版本库中的修改。
  • 1
  • 2
  • 3
  • 4
  • 5

把版本库中的文件删除,并把删除操作保存到暂存区中:

Git rm “filename”
Git rm -r .
  • 1
  • 2

checkout :

Git checkout -- “filename”   撤销工作区的修改,替换成暂存区中的内容
Git checkout HEAD “filename”  撤销工作区和暂存区的修改,替换成版本库中的内容

Git checkout -b “branch_name” 新建一个分支 
Git checkout branch_name  切换分支
  • 1
  • 2
  • 3
  • 4
  • 5

查看,创建,删除分支:

Git branch --list
Git branch --all
Git branch --remotes
Git branch new_branch
Git branch -d branch_name
  • 1
  • 2
  • 3
  • 4
  • 5

合并分支:

Git checkout branch_name
Git checkout master
Git merge branch_name
  • 1
  • 2
  • 3

查看差异:

Git diff   查看工作区与版本库之间的差异
Git diff --cached    查看暂存区与版本库之间的差异
Git diff branch1 ^ branch2  查看两个版本的差异
  • 1
  • 2
  • 3

提交:

Git commit -m “”
Git commit --amend    修改已经提交过的信息,本次add的文件合并到上一次的提交中。
  • 1
  • 2

Push:

usage: git push [<options>] [<repository> [<refspec>...]]
git push origin HEAD:refs/for/master   需要code review
git push origin master   不需要code review
  • 1
  • 2
  • 3

Fetch和pull:

Git pull --rebase   从远程仓库获取最新版本到本地仓库,并且合并到工作区
Git fetch origin master 从远程仓库获取最新版本到本地仓库,但是不合并到工作区,需要调用merge手动合并到工作区。
  • 1
  • 2

svn和git的区别:https://blog.csdn.net/hellow__world/article/details/72529022
参考:
https://www.cnblogs.com/yelbosh/p/7471979.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/680634
推荐阅读
相关标签
  

闽ICP备14008679号