git 学习笔记

Git 的完整性

​ Git 中的所有数据在存储前都会执行校验和计算,随后以校验和来引用对应的数据。这意味着不可能在 Git 不知情的情况下更改文件或目录的内容。这项功能根植于 Git 的最底层,是其设计理念中不可或缺的一环。只要有 Git 在,它就能检测出传输过程中丢失的信息或者受损的文件。

​ Git所采用的校验和机制叫做 SHA-1 散列。这是一个由 40 个十六进制字符所组成的字符串,它是根据文件内容或者 Git 的目录结构计算所得到的。一个 SHA-1 散列类似于如下的字符串

​ 24b9da6552252987aa493b52f8696cd6d3b00373

​ 由于用途极广,你在 Git 中到处都会看到这种散列值。实际上,Git 并不是通过文件名在数据库中存储信息,而是通过信息的散列值

Git 中文件的三种状态

​ Committed 已提交

​ Modified 已修改

​ Staged 已暂存

Git 的首次配置

1
2
3
4
#配置用户名
git config --global user.name "Sunnyrian"
#配置邮箱
git config --global user.email Sunnyrain233@gmail.com

配置自己喜欢的 editor,如果没有配置,Git 会使用默认的编辑器

1
git config --global core.editer nano

在 Windows X64 中配置 editor Notepad++

1
git config --global core.editor "'C:/Program Files(x86)/Notepad++/notepad++.exe' -multiInst"

检查个人配置

1
git config --list

在现有目录中初始化 Git 仓库

1
git init

这个命令会创建一个名为 .git 的子目录。这个子目录包含了构成 Git 仓库骨架的所有必需文件。但此刻 Git 尚未开始跟踪项目中的任何文件

如果要开始对现有文件进行版本控制,那么就应该开始跟踪这些文件并进行初次提交。对需要跟踪的文件执行 git add 命令,然后输入 git commit

1
2
git add .
git commit -m 'initial project version'

克隆现有仓库

1
git clone https://github.com/Sunnyrian/Blog

查看当前文件状态

1
git status

如果在克隆仓库后立即执行这个命令,我们可以看到

On branch master

nothing to commit, working directory clean

如果将新的文件添加进去,我们又没有 add 过这个文件,那么就会在 status 下看到这个未被跟踪的文件

如果使用 add 命令,可以将该文件放到暂存区,将会是一个 Changes to be committed 的状态

如果更改了某个 git 仓库原有的文件,那么该文件会是一个 Changes not staged for commit 的状态

git add 是一个多功能的命令,既可以用来跟踪新文件,也可以用来暂存文件,它还可以做其他的一些事,比如把存在合并冲突的文件标记为已解决。所以,把 git add 命令看成“添加内容到下一次提交中”而不是“把这个文件加入到项目中”,更有助于理解该命令。

如果说我们在修改一个文件后,git add 它之后又修改了它,那么他的 git status 状态将会是即在 Changes to be committed 中又会在 Changes not staged for commit 中,但 Changes to be committed 中存储的是第一次 add 的文件的样子

显示更简洁的状态信息
1
git status -s

忽略文件

大家很多时候,都会有希望某一类或者某几个文件不想被Git自动添加,甚至不想这些文件被显示在未跟踪的文件列表下面。

那么我们可以创建一个名为 .gitignore 的文件,然后在里面写入待匹配文件的模式

1
2
3
4
cat >>.gitignore <<EOF
*.[oa]
*~
EOF

其中第一行告诉 Git 忽略所有以 .o 或者 .a 结尾的文件,这些一般是编译代码生产的二进制文件。第二行是告诉 Git 忽略所有以波浪号(~)结尾的文件

可以写入 .gitignore 文件中的匹配模式的规则如下:

  • 空行或以 # 开始的行会被忽略
  • 支持标准的 glob 模式(正则表达式)
  • 以斜杠(/)开头的模式可用于禁止递归匹配
  • 以斜杠(/)结尾的模式表示目录
  • 以感叹号(!)开始的模式表示取反
1
2
3
4
5
6
*.a		#忽略.a类型的文件
!lib.a #仍然跟踪lib.a,即使上一行指令要忽略 .a 类型的文件
/TODO #只忽略当前目录的 TODO 文件,而不忽略子目录下的 TODO
build/ #忽略 build/ 目录下的所有文件
doc/*.txt #忽略 doc/note.txt,而不忽略 /doc/server/arch.txt
doc/**/*.pdf #忽略 doc/目录下的所有 .pdf文件

查看已暂存和未暂存的变更

1
git diff

查看暂存的变更与上一次提交的内容的比较

1
git diff -staged

查看已暂存的更改

1
git diff --cached

提交变更

1
git commit

会在编辑器中显示并可以编辑提交信息 -v 的话可以把这次提交的差异对比显示在文本编辑器中,可以看到更具体的的变更

1
2
#在命令行中
git commit -m

跳过暂存区,有时候会我们不用再添加文件,而只是修改了现有文件,要提交 commit,可以直接 commit -a,不需要再执行 add指令,可以自动把已经跟踪的所有文件添加到暂存区,然后再提交,就可以省掉 git add了

1
git commit -a -m 'added new benchmarks'

移除文件

​ 要从 Git 中移除某个文件,你需要把它先从已跟踪的文件列表中移除(确切地说,是从暂存区中移除),然后再提交。git rm 可以帮我们完成这些操作,同时会在工作目录中删除该文件

1
git rm <file>

​ 如果我们只是简单地删掉了我们的文件,没有使用 git rm,那么在执行 git status 的时候,还是会看到该文件出现在 “Changes not staged for commit” 区域(也就是未暂存区域)

​ 如果我们已经 add 添加某个文件到暂存区了,我们需要使用 -f 选项,可以防止没有被记录到快照中的数据被意外移除,因为这样的数据被意外移除后无法由 Git恢复

1
git rm -f <file>

​ 如果我们只是想让 git 不再追踪某个文件,比如说我们忘记在 .gitignore 中添加该文件而将它 add 到暂存区了,我们想在工作目录中保留该文件,那么我们可以只删除暂存区的该文件

1
2
git rm --cached <file>
# 此处的<file>也可以输入glob正则表达式选取文件

移动文件

1
2
3
4
5
git mv README.md README
#相当于执行了以下三条命令
mv README.md README
git rm README.md
git add README

相当于非常方便了

查看提交历史

1
2
3
4
5
6
7
8
9
10
11
git log
#查看最近两次提交
git log -p -2
#查看简要统计信息
git log --stat
#选择日志输出的默认格式 例如单行显示↓ 还有 short、full、fullter 格式可以选择
git log --pretty=oneline
#明确指定输出格式
git log --pretty=format:"%h - %an, %ar : %s"
#加上简单图标来显示 Git 分支和合并历史 --graph
git log --pretty format: "%h %s" --graph

git log –pretty=format 命令的一些有用的选项👇:

格式选项 输出的格式描述
%H 提交对象的散列值
%h 提交对象的简短散列值
%T 树对象的散列值
%t 树对象的简短散列值
%P 父对象的散列值
%p 父对象的简短散列值
%an 作者的名字
%ae 作者的电子邮箱地址
%ad 创作日期(可使用 -date= 选项指定日期格式)
%ar 相对于当前日期的创作日期
%cn 提交者的名字
%ce 提交者的电子邮箱地址
%cd 提交日期
%cr 相对于当前日期的提交日期
%s 提交信息的主题

git log 的常用选项

选项 描述
-p 按补丁格式显示每个提交引入的更改
–stat 显示每个提交中被更改的文件的统计信息
–shortstat 只显示上述 –state 输出中包含“已更改/新增/删除”行的统计信息
–name-only 在每个提交信息后显示被更改的文件列表
–name-status 在上一个选项输出基础上还显示出“已更改/新增/删除”统计信息
–abbrev-commit 只显示完整的 SHA-1 40 位校验和字符串中的前几个字符
–relative-date 显示相对日期(如两周前),而不是完整日期
–graph 在提交历史旁边显示 ASCII 图标,用于展示分支和合并的历史信息
–pretty 用一种可选格式显示提交。选项有 oneline、short、full、fuller、format

用于限制 git log 输出范围的选项

选项 描述
-(n) 只显示最新的 n 次提交
–since,–after 只输出指定日期之后的提交
–until,–before 只输出指定日期之前的提交
–author 只输出作者与指定字符串匹配的提交
–committer 只输出提交者与指定字符串匹配的提交
–grep 只输出提交信息包含指定字符串的提交
-S 只输出包含“添加或删除指定字符串”的更改的提交

从远程仓库拉取代码库

1
git fetch <repo>

告诉 Git 去获取我们没有的数据,然后我们可以

1
git merge [alias]/[branch]

以上命令会将服务器上的任何更新合并到我们的当前分支

分支管理

创建分支

1
git branch <branch-name>

查看现有分支

1
git branch

切换分支

1
git checkout <branch-name>

删除分支

1
git branch -d <branch-name>

合并分支到主分支

1
git merge <branch-name>