git实践 | 青训营笔记

70 阅读5分钟

git基本命令

从零开始操作git

初始化

使用git init 初始化一个目录为git项目

在创建时git提供了额外的参数

指定分支(不再是默认的master)

只有.git目录

自定义git目录

初始化后观察.git目录下的目录结构

git的基本知识

git中包括工作区、暂存区与分支。

其中工作区是我们能直接看到的文件区域,暂存区是我们git add 之后文件被暂时储存的区域,当使用git commit命令后,暂存区的数据将被存储到分支中。

其中暂存区与分支均存放在.git目录中

git配置

git配置分为 local、system与global三个级别。

常见git配置

用户名配置

向世界说明自己是谁

Instead of 配置

Git别名配置

用于缩短命令

连接远程仓库

使用git remote add 添加远程仓库

Git add 与 commit

我们先创建一个txt文件

然后使用git status查看当前分支状态

可以看到新增的text.txt处于untracked状态,代表其未被加入暂存区。我们使用add指令添加该文件。

可以看到此时体行已经新增了新文件。我们看看git文件夹下出现了什么

objects目录下新增了文件,这个文件储存了txt文件中新增的内容

现在我们commit这个文件

再次查看文件状态,objects目录下新增了两个文件

这两个文件分别储存着什么呢?

20文件夹下储存了tree对象的名称“a820d3fc9ddcc0ad4be84dffc3ea9e5f17f76495”以及commit时添加的信息

“a820d3fc9ddcc0ad4be84dffc3ea9e5f17f76495”文件下储存了blob文件的名称,而blob文件就是我们之前看过的储存新增内容的文件。

总的来说,在commit后会出现三种对象

三种对象的关系为

使用图像去理解就是

Git 分支

在前面的操作之后,我们会发现ref文件夹下也多了点东西

heads事实上就是各个分支,本质上一个个指向commit的指针。master文件中储存了指向commit的编号。

创建分支与标签

使用git checkout -b dev 创建新分支 dev

可以看到ref目录下添加了新的dev指针

使用 git tag 创建新的tag

查看这个tag对象的内容,可以看到指向的是之前出现过的commit对象

直接使用 tag创建的是轻量级标签,仅仅用于指定的commit

使用 git tag -a tagname -m "message"可以创建附注标签,也即是带有注释信息的标签。

查看已存在的tag

检查新创建tag的信息,可以看到这里输出了当时输入的注释

修改历史版本

课程中介绍了三种与commit相关操作。

git commit --amend

git commit --amend 命令是一种修改最近提交的便捷方法。它让您将暂存的变更与先前的提交合并,而不是创建一个全新的提交。

rebase (变基)

为了理解变基,我们首先需要知道当分支合并的时候会发生什么。

这里使用git官方的例子做介绍。现在我们有两个分支 experiment与master,他们各自都有一个自己的commit。

当我们想要整合两个分支的时候存在两个方法:

1、直接在master分支上使用merge命令,这样git会把两个分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交)
(需要说明的是,当我们在使用git pull的时候也会发生这种情况,因为git pull = git fetch + git merge。所以当我们多次从主分支pull数据时,将导致版本链出现大量的环,使其变得非常不美观,正是因为这点我们需要使用下面的rebase方法合并分支,它能保证版本链是一条直线)

2、rebase的本质是“提取在 C4 中引入的补丁和修改,然后在 C3 的基础上应用一次。”,使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一样。

rebase在目标分支上使用,完整的使用代码为:

$ git checkout experiment
$ git rebase master

执行效果为

它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。

为了合并两个分支我们还需要回到master分支使用merge指令将两个分支合并

请注意,无论是通过变基,还是通过三方合并,整合的最终结果所指向的快照始终是一样的,只不过提交历史不同罢了。 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。

filter -branch

git官方不建议使用,所以暂时跳过

团队协作