git是什么?

Git是一种分布式的版本控制软件, 它像是把数据看作是对小型文件系统的一系列快照。 在 Git 中,每当你提交更新或保存项目状态时,它基本上就会对当时的全部文件创建一个快照并保存这个快照的索引。 为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。 Git 对待数据更像是一个 快照流

git的特点

  1. 直接记录快照,而非差异比较
  2. 近乎所有操作都是本地执行
  3. Git 保证完整性 (Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。)
  4. Git 一般只添加数据

Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:

1
24b9da6552252987aa493b52f8696cd6d3b00373

git的三种区域划分

  • 已修改(modified):表示修改了文件,但还没保存到数据库中。

  • 已暂存(staged): 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

  • 已提交(committed):表示数据已经安全地保存在本地数据库中。

git三种区域

初次运行 Git 前的配置

用户信息

安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:

1
2
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

再次强调,如果使用了 –global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 –global 选项的命令来配置。

文本编辑器

在 Windows 系统上,如果你想要使用别的文本编辑器,那么必须指定可执行文件的完整路径。 它可能随你的编辑器的打包方式而不同。

1
git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"

检查配置信息

1
git config --list
PS C:\Users\starry\Desktop\hexo-new> git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=D:/dev/git/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
:...skipping...
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=D:/dev/git/Git/mingw64/ssl/certs/ca-bundle.crt    
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
core.editor="D:\dev\vscode\Microsoft VS Code\bin\code.cmd" --wait
user.email=18827637106@163.com
user.name=mhist
http.sslverify=false
http.postbuffer=524288000

使用该命令后,你会获得如上的键值对形式的文件,当然你也可以使用命令,通过键来获得你需要得键值

1
git config <key>
PS C:\Users\starry\Desktop\hexo-new> git config core.fscache
true

获取帮助和官方手册

1
git help config

输入命令后会在浏览器打开手册,通过html文件来展示。实际在安装git软件的时候会在相应的文件夹中,博主的文件对应路径为:

1
file:///D:/dev/git/Git/mingw64/share/doc/git-doc/git-config.html

常用命令

命令 效果 场景
git clone url 在本地创建相应的仓库 用于克隆目标链接的文件
git init 在已存在目录中初始化仓库 用于初始化
git status 显示文件分支和文件提交情况和工作区情况 用于检测当前仓库文件状态
git add 使用文件或目录的路径作为参数,目录路径下所有文件会被追踪 用于跟踪新文件,将文件放到暂存区
git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动 用于查看已暂存和未暂存的修改
git commit 将暂存区的文件提交,可通过git commit -m “添加描述信息” 用于提交更新
git rm 若文件不在暂存区 git rm 文件名 ;否则,使用git rm -f 文件名 用于移除文件,其他删除细节参照链接
git mv 原文件名 新文件名 实质:mv README.md README;git rm README.md;git add README 用于移动文件或者修改文件名
git log 在控制台输入命令后会显示以哈希值版本,作者,提交时间组成的内容 用于查看提交历史

如果文件已被跟踪,然后再后续过程中被修改,则该跟踪文件的内容发生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行 git add 命令。 这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“精确地将内容添加到下一次提交中”

git log 配置

配置例子具体链接

例子:将提交版本的哈希值用简短形式展示

PS C:\Users\starry\Desktop\hexo-new\blog> git log --pretty=format:"%h"
0f2dda8
40f740a
668fc87
2b7da17
418255c
7601831
f89d8a5

撤销操作

  1. 它一般用于解决在开发过程中因为细微的操作导致的问题,比如在提交完成后发现有些文件忘记更新到缓存区,导致文件没有提交,而文件又不是很多,如果再次提交,会增多提交历史中的事件轴,为了解决这一问题可以使用以下命令,它会提交第二次的修改,从效果上来说,就像是旧有的提交从未存在过一样,它并不会出现在仓库的历史中。

    1
    git commit --amend
  2. 取消暂存

    1
    git reset HEAD <file>...

远程仓库

查看远程仓库

1
git remote
1
git remote -v

添加远程仓库

1
git remote add <shortname> <url>

从远程仓库拉取

1
git fetch <remote>

推送到远程仓库

1
git push origin master

查看某个远程仓库

1
git remote show <remote> 

远程仓库的重命名

例如,想要将 pb 重命名为 paul,可以用 git remote rename 这样做:

1
git remote rename pb paul

远程仓库的删除

1
git remote remove 远程仓库名

git分支与合并

  1. 查看分支

    1
    git branch
  2. 创建分支

    1
    git branch 分支名称
  3. 切换分支

    1
    git checkout 分支名称
  4. 分支合并
    假设现在有两个分支,分别为master和test分支,当前你在master分支上,可以使用以下命令将test分支上的内容合并到master分支上。

    1
    git merge test

合并冲突:

  1. 删除分支
    1
    git branch -d 分支名称