1.Git入门
1.1 什么是版本控制?
版本控制是一套系统,该系统按时间顺序记录某一个或一系列文件的变更,让你可以查看其以前的特定版本。
1.2 版本控制器的分类?
常用的版本控制器分为:集中式版本控制系统(简称CVCS)和分布式版本控制系统(简称DCVS)
![](https://i-blog.csdnimg.cn/blog_migrate/fdce7e3c94e8ddb28494ae97570b9d6e.webp?x-image-process=image/format,png)
![](https://i-blog.csdnimg.cn/blog_migrate/6cfcd06029f19661351e37360622d8d3.webp?x-image-process=image/format,png)
1.3 Git简史
Git诞生于2005年,采用分布式版本控制系统,经过多年的不断发展,日趋成熟易用。
1.4 Git基础
1.4.1 快照,而非差异
Git与其他版本控制系统最大的不同在于其对待数据的方式。其他大多数版本控制系统以文件变化列表的方式存储信息,这类系统将其存储的信息视为一组文件以及对这些文件随时间所作出的变更。如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/7ca674c4062b5d465abdf78b075c5db3.webp?x-image-process=image/format,png)
Git更像是将数据视为一个微型文件系统的一组快照。每次提交或在Git中保存项目的状态时,Git基本上会抓取一张所有文件当前状态的快照,然后存储一个指向该快照的引用。
处于效率的考虑,如果文件并没有发生变动,Git重新保存文件,而只是留下一个指向先前已保存过相同文件的链接。Git更多的是将数据作为一个快照流。如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/e8fad358a127918b047ec32c2d3fa11e.webp?x-image-process=image/format,png)
1.4.2 Git的完整性
Git中的所有数据在存储前都会执行校验和计算,随后以校验和来引用对应的数据。这意味着不可能在Git不知情的情况下更改文件或目录的内容。
Git所采用的校验和机制叫做SHA-1散列。这是一个由40个十六进制字符(0~9和a~f)所组成的字符串,它根据文件内容或Git的目录结构计算所得到的。
1.4.3 Git的三种状态
在Git中,文件可以处于一下三种状态之一:已提交(commited)、已修改(modified)和已暂存(staged)。
已提交表示数据已经被安全地存入本地数据库中;
已修改表示已经改动了文件,但尚未提交到数据库;
已暂存表示对已修改文件的当前版本做出了标识并将其加入下一次要提交的快照中。
Git项目中三个主要区域:Git目录、工作目录以及暂存区。如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/f54dea28b785f74c2e3b411eb1931ba4.webp?x-image-process=image/format,png)
Git目录是Git保存项目元数据和对象数据库的地方,是Git最重要的部分,也是从其他计算机中克隆仓库时要复制的内容。工作目录是项目某个版本的单次检出。这些文件从Git目录下的压缩数据库内被提取出,放置在磁盘上以供使用或修改。暂存区是一个文件,位于Git目录中。它保存了下次要提交内容的相关信息。
Git的基本工作流:修改工作目录中的文件暂存文件,将这些文件的快照加入到暂存区提交暂存区中的文件,将快照永久的保存在Git目录中。
1.5 Git的首次配置
1.5.1 设置用户身份
安装好Git后的第一件事就是设置用户名和电子邮件地址。这一步非常重要。
设置命令如下:
$ git config - -global user.name “John Doe”
$ git config - -global user.email johndoe@example.com
1.5.2 个人编辑器
设置好身份信息之后就可以配置默认的文本编辑器了,当Git需要输入消息的时候会用到这个编辑器。如果没有配置,Git会使用默认的编辑器。
Vim、Emacs、Notepad++编辑器的配置命令详见各个编辑器的官网
1.5.3 检查个人设置
命令如下:
$ git config - -list
该命令可以列出当前Git可以找到的所有设置。
也可以通过键入gir config来查看Git中当前某个键的值。
例如: git config user.name 就可以查看当前电脑的配置的用户姓名。
1.5.4 获取帮助
如果在使用Git的过程中需要帮助,有以下三种方法可以查看Git任何命令的帮助页面。
命令如下:
$ git help
$ git- -help
$ man git - -help
2 Git基础
2.1 获取Git仓库
建立Git项目的方法主要有两种:
① 把现有的项目或者目录导入到Git中;
② 从服务器上克隆现有的Git仓库
2.1.1 在现有目录中初始化Git仓库
要想在Git中对现有项目进行跟踪管理,只需进入项目目录并输入:
$ git init
会创建一个名为.git 的子目录,这个目录包含了构成Git仓库骨架的所有必须信息。
2.1.2 克隆现有仓库
如果需要获取现有仓库的一份副本,可以使用git clone 命令。
因为Git会对服务器仓库的几乎所有数据进行完整复制,而不只是复制当前工作目录。
git clone 默认会从服务器上把整个项目历史中每个文件的所有历史版本都拉取下来。
命令如下:
$ git clone [url]
git 可以用几种不同的协议传输数据,包括:https:// 协议 git:// 协议或者是SSH传输协议。
2.2 在Git仓库中记录变更
2.2.1 查看当前文件状态
检查文件所处状态的主要工具是 git status 命令。
2.2.2 跟踪新文件
可以使用git add命令让Git开始跟踪新的文件。
git add 是一个多功能命令,既可以用来跟踪新文件,也可以用来暂存文件,它还可以做其他的一些事,比如把存在合并冲突的文件标记为已解决。
所以,把git add命令看成“添加内容到下一次提交中”而不是“把这个文件添加到项目中”,更有助于理解该命令。
2.2.3 显示更简洁的状态信息
Git提供了一个显示简短状态的命令选项,是你可以以一种更为紧凑的形式查看变更。
执行git status - -s 或者 git status - -short 就可以看到类似下面的效果。
此时,未被跟踪的新文件旁边会有一个?? 标记,已暂存的新文件会有A标记,而已修改的文件则会有一个M标记。
2.2.4 忽略文件
很多时候,你不希望某一类文件被Git自动添加,甚至不想这些文件被显示在未跟踪的文件列表下面。这些文件一般是自动生成的文件(比如日志文件)或是有构建系统创建的文件。
在这种情况下,可以创建名为.gitignore的文件,在其中列出待匹配文件模式。最好在开始工作前配置好.gitignore文件,这样就不会意外的把不想纳入Git仓库的文件提交进来了。
可以写入.gitignore文件中匹配模式规则如下:
空行或者以#开始的行被忽略
支持标准的glob模式
以斜杠(/)开头模式可用于禁止递归匹配
以斜杠(/)结尾的模式表示目录
以感叹号(!)开始的模板表示取反
2.2.5 查看已暂存和未暂存的变更
如果想知道修改的具体内容,而不仅仅是你更改了那些文件,这是可以使用 git diff命令。改命令可以解决两个问题:男鞋变更还没有暂存,那些已暂存的变更正待提交。
尽管git status也可以通过列举文件名的方式大致回答上述问题,但git diff 则会显示出你具体添加和删除了哪些行。换句话说,git diff的输出是补丁(patch)。
如果你想看看哪些暂存的内容会进入下一次提交,可以使用git diff - -staged命令。这条命令会将暂存的变更与上一次提交的内容相比较。
请注意:执行git diff本身并不会显示出自从上一次提交以来所有的变更,而只会显示出还没有进入暂存区的哪些变更。
执行git diff - -cached查看当前已暂存的更改。
2.2.6 提交变更
此时,你的暂存区已经准备妥当,可以提交了。
请记得所有未暂存的变更都不会进入到提交的内容中,这包括任何在编辑之后没有执行git add命令添加到暂存区的新建或者修改过的文件。
命令如下:
方式一:git commit;(不推荐)
方式二:git commit -m “添加内容或者修改内容简短说明”
请记住:提交时记录的是暂存区中的快照。任何未暂存的内容仍然保持着已修改状态。
2.2.7 跳过暂存区
如果你想要跳过暂存区直接提交,Git为你提供了更快捷的途径。
给git commit命令传入 -a选项,就能让Git自动把已跟踪的所有文件添加到暂存区,然后再提交,这样就不用再执行 git add了。
命令如下:
git commit -a -m “添加内容或者修改内容简短说明”
2.2.8 移除文件
要从Git中移除某个文件,需要把它先从已跟踪文件列表中移除(确切的说,是从暂存区中移除),然后再提交。
命令如下:
$ git rm <file>…
git rm会帮你完成这些操作,另外该命令还会把文件从工作目录中移除。如果你更改了某个文件,并已经把它加入到了索引当中(已暂存),要想让Git移除它就必须使用-f选项强制移除。这是为了防止没有被记录到快照中的数据被意外移除而设立的安全特性,因为这样的数据被意外移除后无法有Git访问。
你也许想将文件保留在硬盘上,但不想让Git对其进行跟踪管理,只需使用 - -cached选项即可;
命令如下:$ git rm - -cached <file>…
2.2.9 移动文件(重命名文件)
Git与很多其他版本控制系统不同,它并不会显式跟踪文件的移动。如果你在Git中重命名了文件,仓库的元数据并不会记录这次重命名操作。不过Git能推断出究竟发生了什么。
命令如下:$ git mv file_from file_to
例如:$ git mv readme.md readme
2.2.10 查看提交历史
在完成了几次提交或者克隆了一个已有提交历史的仓库之后,你可能想要看看历史记录。可以使用git log命令来实现。
git log 的常用选项:
命令格式如下:
$ git log - -p
注释:按补丁格式显示每个提交引入的更改
$ git log - -start
注释:显示每个提交中被更改的文件的统计信息
$ git log - -shortstat
注释:只显示上述 - -start输出中包含“已更改/新增/删除”行的统计信息
$ git log - -name -only
注释:在每个提交信息后显示被更改的文件列表
$ git log - -name -status
注释:在上一个选项输出基础上还显示“已更改/新增/删除”统计信息
$ git log - -abbrev -commit
注释:只显示完整的SHA-1 40位校验和字符中的前几个字符
$ git log - -relative –date
注释:显示相对日期(例如“两周前”),而不是完整日期。
$ git log - -graph
注释:在提交历史旁边显示ASCⅡ图标,用于展示分支和合并的历史消息
$ git log - -pretty
注释:用一种可选格式显示提交。
该命令还可以配合:oneline、short、full、fuller和format。
命令如下:$ git log - -pretty=oneline
最值得注意的选项是format,它允许你指定自己的输出格式。
命令如下:
$ git log - -pretty=format:”此处添加格式选项标识符”
![](https://i-blog.csdnimg.cn/blog_migrate/e083ceed4abac1b7f685bf3a15864d8a.webp?x-image-process=image/format,png)
oneline和format这两个选项如果与log命令的另一个选项- -graph一起使用,就能发挥更大的作用。
具体来说,- -graph选项会用ASCII字符形式的简单图表来显示Git分支和合并历史。
命令格式如下:$ git log - -pretty=format:”此处添加格式选项标识符” - -graph
$ git log -<n>
注释:只显示最新的n次提交
$ git log - -since或者 git log - -after
注释:只输出指定日期之后的提交
$ git log - -until 或者 git log - -befor
注释:只输出指定日期之前的提交
$ git log - -author
注释:只输出作者与指定字符串匹配的提交
$ git log - -committer
注释:只输出提交者与指定字符串匹配的提交
$ git log - -grep
注释:只输出提交信息包含指定字符串的提交
$ git log - S
注释:只输出包含“添加或删除指定字符串”的更改的提交
2.3 撤销操作
有一种撤销操作的常见使用场景是提交之后才发现自己忘了添加某些文件,或者写错了提交信息。如果这时你想重新尝试提交。可以使用- -amend选项:
$ git commit - -amend
该命令会提交暂存区的内容。
2.3.1 撤销已暂存的文件
举例来说:假设你更改了两个文件,想要分两次提交,却不小心键入了git add *,把这两个文件都添加到了暂存区。这时你改如何把它们从暂存区移除呢?
可以使用如下命令:
命令格式:$ git reset HEAD <file>...
2.3.2 撤销对文件的修改
如果你突然发现,自己不再需要对某个文件所做的更改,这时该怎么办?
可以使用如下命令:
命令格式:$ git checkout - -<file>...
注意:该命令是一条危险命令,除非你确信不再需要这些文件,否则不要使用这个命令。
2.4 远程仓库的使用
2.4.1 显示远程仓库
要查看设置了哪些远程仓库,请使用git remote命令。
也可以使用git remote -v命令,这样会显示出每个远程仓库对应的URL
2.4.2 添加远程仓库
要添加一个远程仓库,并给它起一个简短名称以便引用,可以执行git remote add [shortname] [url]命令。
此时,你可以使用[shortname]代替完整的[url]。
2.4.3 从远程仓库获取和拉取数据
命令格式如下:
$ git fetch [remote - name]
注意:git fetch命令只会把数据拉取到本地仓库,然而它并不会自动将这些数据合并到本地的工作成果中,也不会修改当前工作目录下的任何数据。在准备好之后需要手动将这些数据合并到本地内容中。
2.4.4 将数据推送到远程仓库
当你的项目进行到某个阶段,就要把变更推送到远程仓库与他人分享。
此时用到的命令格式如下:
$ git push [remote - name] [branch - name]
注意:上述命令恩能够正常工作的前提是必须拥有克隆下来的远程仓库的写权限,并且克隆后没有任何其他人向远程仓库推送过数据。
2.4.5 检查远程仓库
要查看关于某一远程仓库的更多信息,可以使用git remote show [remote - name]命令。
2.4.6 删除和重命名远程仓库
重命名命令格式:
$ git remote rename 仓库旧名称 仓库新名称
删除命令格式:
$ git remote rm 仓库名称
2.5 标记
2.5.1 列举标签
列举标签只需键入 git tag即可;
如果按照某个特定匹配模式搜索标签,可以使用如下命令:
命令格式:
$ git tag -l “标记版本号”
2.5.2 创建标签
Git使用的标记主要有两种类型:轻量(lightweight)标签和注释(annotated)标签。
轻量标签很像是一个不变的分支——只是一个指向某次提交的指针。
注释标签则会作为完整的对象存储在Git数据库中。
一般推荐创建注释标。
2.5.3 注释标签
创建注释标签的语法格式如下:
$ git tag -a [tagname]
或者$ git tag -a [tagname] -m “标记信息”
再执行$ git show命令就可以看到标签数据以及对应的提交信息。
2.5.4 轻量标签
创建轻量标签的语法格式如下:
$ git tag -a [tagname] -lw
2.5.5 补加标签
命令格式如下:
$ git tag -a [tagname] [SHA-1散列前七位]
2.5.6 共享标签
默认情况下,git push 命令不会把标签传输到远程服务器上。在创建标签之后,必须明确的将标签推送到共享服务器上。
命令格式如下:
$ git push origin [tagname]
如果有很多标签需要一次性推送,可以使用git push命令的 - -tags选项。这会把所有服务器上还没有的标记都推送过去。
执行完上述命令后,其他人此时对仓库执行克隆或拉取操作,也能够得到所有的标签。
2.6 Git别名
设置别名能够使Git更加易用、简单,同时也更容易掌握。
命令语法格式:
$ git config - -global alias.[别名] [原名]
例如:
$ git config - -global alias.ci commit
设置完成后,此时就可以运用git ci 来代替git commit 命令。
3 Git分支机制
3.1.1 创建新分支
命令格式如下:
$ git branch [branchname]
分至建立之后,可以使用如下命令查看各个分支当前所指向的对象:
$ git log - -oneline - -decorate
3.1.2 切换分支
命令格式如下:
$ git checkout [branchname]
使用命令:$ git log - -oneline - -decorate - -graph - -all 会输出提交历史,显示出分支的指向以及项目历史的分叉情况。
上述分支的创建与切换可以用如下命令格式替代:
$ git checkout -b [branchname]
在分支上开发完毕并提交之后,然后合并到主分支的步骤:
① 从分支回到master分支
② 再合并。
命令格式如下:
$ git checkout master
$ git merge [branchname]
3.1.3 删除分支
命令格式如下:
$ git branch -d [branchname]
把新建分支合并到master之后,需要删除之前新建的分支,原因是此时的分支已经没有用了。
可执行上述删除分支命令,然后再提交即可。
3.1.4 基本的合并冲突处理
若要使用图形化工具解决冲突,可以执行git mergtool命令,该命令会启动相应的图形化合并工具,并引导你一步一步进行。
3.1.5 分支管理
git branch 命令并不只是可以用来创建和删除分支。如果执行不带参数的git branch 命令,就会得到当前所有分支的简短列表。
此时应注意分支前面的*字符,它表明你的项目当前所在的分支。(即HEAD指向的分支)。
要查看每个分支上的最新提交,可以使用$ git branch -v命令。
也可以使用如下命令:
命令格式:
$ git branch - -merged
注释:此命令用来筛选已并入当前分支的所有分支。
命令格式:
$ git branch - -no - merged
注释:筛选尚未并入的所有分支。