1. Git 的最小配置

配置基本用户信息

1
2
git config --global user.name "louhaojie"
git config --global user.email "851681631@qq.com"

思考: 为何要做 User 信息配置?

提交代码到 本地仓库时,git 会先检索本地仓库的.git/config 文件,如果没有 user 的信息,则使用全局的配置文件(符合就近原则).

Git 提交都会使用这些信息,它们会写入到你的每一次提交中.

config 的三个配置作用域

缺省等同于 local

1
2
3
git config --local  # local只对某个仓库有效
git config --global # global对当前用户所有仓库有效
git config --system # system对系统所有登录的用户有效

查看配置后的 User 信息

显示 config 的配置, 加 –list

1
2
3
git config --list --local
git config --list --global
git config --list --system

2. Git 的工作区和暂存区

思考: 什么是工作区?什么是暂存区?

**工作区**:工作区就是 git 仓库所在的目录,比如咱们项目目录 front-wh-admin 就是一个工作区

**暂存区**:英文叫 stage, 或 index。一般存放在 “.git 目录下” 下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)

**版本库**:工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库.

版本控制的内容修改提交流程是:工作区 → 暂存区 → 分支版本历史库

添加到暂存区

1
2
3
4
git add index.html README.md # 暂存工作区指定的文件
git add . # 暂存所有工作区变更的文件
git add -u # 暂存所有工作区变更的文件
git status # 可以查看你变更了那些文件修改

添加到对应分支版本历史库

1
git commit -m "feat: 增加站点文件和项目叙述文件"

3. 给文件重命名的简洁方法

假设工作目录下有 HelloWorld.html 文件,想重命名为 HelloGit.html

1
2
git add HelloGit.html
git rm HelloWorld.html
1
2
3
4
5
6
git status	# 查看暂存状态

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: HelloGit.html
deleted: HelloWorld.html

一般呢,直接只用 git add . || git add -u,很少使用到 git rm 命令来操作重命名的文件或者需要删除的文件.

4. 通过 git log 查看版本演变历史

展示的比较全面,包含 AuthorDate 以及变更内容的 commit message

1
2
3
4
5
6
7
git log # 查看版本历史

commit 8236b0831e9d8e5dc84c77d1efd38f2563d9d2bb (HEAD -> master, origin/master)
Author: lhj <851681631@qq.com>
Date: Sun May 15 11:06:21 2022 +0800

feat: init

展示一行显示,只包含 commit message

1
2
3
git log --oneline # 查看版本历史

8236b08 (HEAD -> master, origin/master) feat: init

查看整个版本历史的整个演变历史

1
git log --oneline --graph

5. 快捷清理工作区文件变更暂存区目录

1
git reset --hard # 不会破坏 git history, 相当于把暂存区文件取消 + 变更内容都还原

6. Git 之分离头指针

如果不小心通过 git checkout 命令切换到某个 commit 中(即 HEAD 指向某个 commit),git 会提示我们正处于分离头指针的状态下(工作在没有分支的情况下),如果我们做了大量的修改,但是某天我们突然又切换到另一个 commit 时,我们的修改就有可能被 git 当做垃圾清除掉,因此这个动作十分危险。

图片名称

分离头指针的用处:进行尝试性的变更时,但我们试着修改某些文件时,如果觉得修改的效果不满意,可以直接切换到别的分支,丢弃当前修改

记住一点:如果某个变更(提交)是非常重要的,那么一定要跟某个分支绑定在一起

好吧!我们下面实践一下:

语法:git checkout -b 新分支名称 基于某个分支或者commit

1
2
3
git checkout -b feat/login-final master    # 创建出新分支, 基于master分支
git checkout -b feat/login-final dev # 创建出新分支, 基于dev分支
git checkout -b feat/login-final bd1fcbf # 创建出新分支, 基于某个commit

总结:git 分离头指针,简单来说就是 git 当前处于的工作状态,没有跟任何分支进行挂钩.

比较某两个 commit 的区别

语法:git diff 第一个commit 第二个commit

1
2
3
4
5
6
git diff bd1fcbf 8236b08
git diff HEAD 8236b08
git diff HEAD HEAD^1 (当前的HEAD指向的commit和他的父级进行比对)

// HEAD^ == HEAD~ == HEAD^1 == HEAD~1
// HEAD^^ == HEAD^1^1 == HEAD^2

7. 删除不需要的分支

1
2
git branch -D <branch name>
git branch -D 需要删除的分支名

8. 怎么修改最新的 commit 的 message?

思考:什么样的场景下,我们会用到修改 commit message?

有时候我们刚把一个 commit 创建出来之后呢,突然发现我们的 commit message 这个做变更的东西啊,描述的不准确,所以呢,需要对 commit message 进行修改,而且是最近一次的 commit message 修改.

1
git commit --amend	# 修理一下

上面命令执行之后,发现无法进行编辑,这时候按下键盘 i 进入文字插入模式

编辑完了?又如何退出呢?

(1)按 Esc 键退出编辑模式,英文模式下输入 :wq ,然后回车(write and quit)。

(2)按 Esc 键退出编辑模式,大写英文模式下输入 ZZ ,然后回车


那我之前的 commit 信息发现 commit message 命名也不太好!那应该怎么进行操作修改呢?

变基操作如下:

1
2
3
4
5
6
7
8
9
// git rebase -i 选择想变更的那个基的父亲的commit索引

// 假设当前历史版本如下:
f0bf6a6 (HEAD -> master) feat: 增加style.css, 外置文件
bd1fcbf (origin/master) feat: add default index.html template
8236b08 feat: init

想要修改 feat: add default index.html template 这个commit message信息,操作如下:
git rebase -i 8236b08

输入 :wq 保存并退出

然后进入了等同于执行,git commit –amend 界面,对这个 commit 进行修改

然后再输入 :wq 保存并退出

最后:咱们 git log 查看一下,已经修改成功啦!

9. 怎么样把多个commit整理成1个?

场景一:连续的

举例如下:假如说让你完成一个登录功能,开发的途中呢,产生了三个 commit 信息,这个时候呢,就可以把这三个对应的 commit 信息合并成一个,因为呢他们整体是对应 “登录功能开发”,合并成一个 commit 也便于翻阅查看.

step1:

1
git rebase -i 8236b08  

思考:你可能会在想,上面的变基操作中,为什么 -i 后面选择 8236b08 而不是 6921090,这是因为如果你想对某个 commit 进行操作,要选择他的 “父级”,好了接下来看执行上面命令之后的界面,如下

这里说明一下,终端进入编辑模式按 i,保存并退出按 ESC 然后输入 :wq 然后确认键就Ok了!

然后,按 ESC 输入 :wq 保存并退出,进入到另外一个界面中,如下:

然后,我们按 i 进入编辑模式,选择需要保留的 commit 信息,这里也是可以进行 commit message修改的,修改后界面如下:

然后按,ESC 退出编辑模式,输入 :wq 保存并退出,这个时候,咱们所有的工作就都完成啦!

最终:可以 git log 一下,可以看出,咱们多个连续的 commit message 已经合并成为了 1 个.

场景二:不连续的commit

假如说我们想,下面图例中,这两个不连续的 commit message 合并成一个,该怎么操作呢?

step1:

1
git rebase -i 157d8cda0c32468a824

调换后位置的图例:

按键盘 ESC 输入 :wq 保存并退出,然后来到下面这个 commit message 合并编辑的界面,把刚才标注 s 对应的commit message 注释掉即可.

按键盘 ESC 输入 :wq 保存并退出,就完成啦.

最后:咱们 git log 查看一下,已经修改成功啦!