Git 基本使用

概念

当我们看到 Git 的时候,涌现上来的第一个想法就是 Git 是什么,我们为什么要使用 Git

首先解决一下第一个问题,Git 是什么?

Git 官网上有一段说明: Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. 翻译一下就是说:Git 是一个免费的开源分布式版本控制系统,旨在快速且高效地处理从小型到大型的所有项目。

这里简单说明一下版本控制系统是什么,打个比方,我们有一段完整的代码,不过现在我们需要在此基础上进行新功能的开发,开发完成之后上线了,不过很不幸,上线之后出现了很多 bug,那应该怎么处理,不用想,第一件事肯定是回滚,采用之前运行正确的代码,如果我们没有采用 Git ,那我们就需要保存一份之前的源代码了,如果我们采用 Git ,那么我们可以很方便的将代码切换到历史中的每一条记录,这就叫做版本控制。

介绍完了什么是 Git ,那么我们为什么要用 Git 呢?

首先,互联网公司都在用 Git ,当你参加工作的时候,无法避免地会使用 Git ,比如暑期在字节实习的时候,公司内部自己搭建了一个 Git lab,代码的提交都是使用 Git 进行的,你如果不知道怎么使用 Git ,那么你写好的代码就只能让其他同学帮忙上传,效率极低,而且同学不可能一直帮你吧,所以说学习 Git 很必要。

其次,Git 的分布式版本控制系统真的很棒,在公司里面一个项目往往是一组同学一块开发,不可能单枪匹马,不同的同学负责不同的模块,这个时候 Git 的作用就更明显了,开发不同 feature 的同学统一从仓库上拉取代码,然后在本地另外创建一个分支进行新功能开发,开发完成,测试通过,代码进行 review 之后合入主干分支,极大的提高了编码效率。

安装

访问 Git 官网 下载,如果是 Linux 系统,基本上都会预装 Git ,如果没有,对于 Ubuntu 来说可以使用下面的命令进行安装。

1
sudo apt install git -all

安装完成之后,进入命令行输入下方命令进行检查,如果输出版本号,则说明安装成功。

1
2
$ git  --version
git version 2.25.1

使用

首先介绍一下 Git 中的基本术语:工作区, 暂存区,版本库

  • 工作区:就是在电脑里能看到的目录,或者直接认为是我们在编写项目的目录。
  • 暂存区:一般存放在 .git 目录下的 index 文件中,所以我们把暂存区有时也叫作索引 (index)。
  • 版本库:工作区有一个隐藏目录 .git,不算工作区,而是 Git 的版本库,提交到这里都会形成一个版本,想要要切换到任意版本都很简单。

下面我们就开始介绍一些常用的命令

配置

1
2
3
4
5
6
# 配置全局用户,去掉 --global 参数表示配置当前目录用户
git config --global user.name "xxx"
git config --global user.email "xxx"

# 查看配置
git config --list

基本操作

创建仓库

有两种方式,下面分别讲解:

一种是在本地直接创建,使用 git init,创建之后会生成一个 .git 目录

  • 在当前目录进行创建:git init
  • 在指定目录进行创建:git init repo

另外一种方式是从远程仓库克隆下来,使用 git clone

  • 克隆到目录,目录名为仓库名:git clone
  • 克隆到指定目录:git clone <dir>

添加文件

git add 命令可将该文件添加到暂存区,可以支持多个文件以及通配符

1
2
3
4
5
6
# 添加一个文件
git add README.md
# 添加 src 目录下的文件
git add src/
# 添加当前目录所有
git add .

查看状态

git status 查看仓库当前的状态,显示有变更的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ echo "Hello World" > README.md
$ git status
On branch master

No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md

nothing added to commit but untracked files present (use "git add" to track)

$ git add README.md
$ git status
On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md

查看差异

git diff 可以比较同一文件在暂存区和工作区的差异。

1
2
3
4
5
6
7
8
$ git diff README.md
diff --git a/branch/README.md b/branch/README.md
index ce01362..3b18e51 100644
--- a/branch/README.md
+++ b/branch/README.md
@@ -1 +1 @@
-hello
+hello world

提交本地仓库

git commit 可以将代码添加到本地仓库,添加到这里的代码之后可以恢复。

回退版本

get reset 可以将代码回退到指定的版本,默认使用 --mixed

  • git reset --mixed:回退到指定版本,工作区文件内容保持不变,但是会删除暂存区。
  • git reset --soft:回退到指定的版本,保留工作目录和暂存区中的内容,并把重置 HEAD 所带来的新的差异放进暂存区。
  • git reset --hard: 撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到指定版本。

查看提交日志

git log 可以查看已经提交的日志记录

1
2
3
4
5
6
7
8
9
$ git log
commit eaf922fa1908cb6e9295570252ce3776f851bc16 (HEAD -> master, dev)
Author: junhaideng <201648748@qq.com>
Date: Fri Dec 17 19:21:53 2021 +0800

docs: add README.md

$ git log --oneline
7110de5 (HEAD -> master) docs: add README.md

分支操作

创建分支

git branch <branch name> 或者 git checkout -b <branch name> 都可以创建分支

1
2
3
4
$ git checkout -b branch1
Switched to a new branch 'branch1'
$ git branch branch2
Switched to a new branch 'branch2'

切换分支

git checkout <branch name> 或者 git switch <branch name>,使用 git checkout - 可以切换到上一次所在的分支哦

1
2
3
4
$ git checkout branch1
Switched to branch 'branch1'
$ git switch branch2
Switched to branch 'branch2'

查看分支

git branch 查看所有的分支

1
2
3
4
$ git branch
branch1
branch2
* master

删除分支

git branch -d/-D <branch name>

1
2
$ git branch -D branch2
Deleted branch branch2 (was eaf922f).

重命名分支

git branch -m/-M <old> <new>

1
2
3
4
$ git branch -m branch1 dev
$ git branch
dev
* master

合并分支

git merge 可以将当前分支和指定分支提交合并

1
2
3
4
5
6
7
8
9
10
$ git branch
* feat/say_hello
master
$ git checkout -
Switched to branch 'master'
$ git merge feat/say_hello
Updating 7110de5..19dad58
Fast-forward
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

标签操作

创建标签

Git 中标签有两种:

  • 轻量标签:
    • git tag <tag name>
    • 不保存其他任何信息,相当于某个提交的信息
  • 附注标签:
    • git tag -a <tag name>
    • 可以显示打标签者的信息,时间和附注消息,然后显示具体的提交信息

也可以指定某个提交打标签: git tag xx <commit id>

删除标签

删除本地标签

git tag -d <tag name> 删除标签

1
2
$ git tag -d v1.0
Deleted tag 'v1.0' (was 15f051b)
删除远程标签
1
2
git push origin :refs/tags/<tag name>
git push origin --delete <tag name>

查看标签

git tag 可以显示所有的标签,我们也可以使用 git tag -l/--list,并且可以指定特定模式匹配

显示标签内容

git show <tag name> 可以展示标签对应的提交信息,对于附注标签还可以显示添加的额外信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ git tag v1.0 -m "tag demo"
$ git tag
v1.0
$ git show v1.0
tag v1.0
Tagger: junhaideng <201648748@qq.com>
Date: Sat Dec 18 09:43:27 2021 +0800

tag demo

commit 54f9e2cbea36cdd28718a7a0ff847e005442142e (HEAD -> master, tag: v1.0)
Author: junhaideng <201648748@qq.com>
Date: Fri Dec 17 20:26:25 2021 +0800

add: tag

diff --git a/tag/tag b/tag/tag
new file mode 100644
index 0000000..ce01362
--- /dev/null
+++ b/tag/tag
@@ -0,0 +1 @@
+hello

远程仓库

关联仓库

1
2
3
# 一般将 name 取为 origin
# url 可以是 ssh,http 等
git remote add <name> <url>

拉取最新提交

1
2
3
4
5
# 只拉取最新提交
git fetch
# 拉取之后合并当前分支
# 相当于 `Git` fetch + `Git` merge
git pull

推送最新提交

本地写完代码之后,提交到仓库中

1
git push [name] [branch name]

忽略某些文件

有时候,我们有些文件不想要提交到仓库中间,比如说编译的中间仓库,那么我们可以创建一个 .gitignore 文件,并且在其中进行配置

1
2
3
4
5
6
7
8
9
10
# 忽略 .vscode 目录,无论根目录下的还是子目录下的
.vscode/
# 忽略根目录下的 target 文件夹
/target/
# 忽略所有的 .exe 文件
*.exe
# 指定忽略某个文件
/src/hello.go
# 不过滤 src 目录
!src/

更加详细的见:gitignore

规范

Git 的提交应该符合一定的规定,这样方便操作,比如

1
type: <description>

type 一般为下面的类型:

  • feat: 新功能(feature)
  • fix: 修补bug
  • docs: 文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor: 重构(即不是新增功能,也不是修改bug的代码变动)
  • test: 增加测试
  • chore: 构建过程或辅助工具的变动
  • add: 添加某个文件等
  • change: 对某个文件进行改变,但不改变原来的功能
  • beautify: 对界面进行美化

此外也可以参考: 约定式提交

思维导图

注:图片来自网络

生活杂笔,学习杂记,偶尔随便写写东西。

作者

Edgar

发布于

2021-12-18

更新于

2021-12-21

许可协议

评论