概念
另外可以见 博文
当我们看到 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
来说可以使用下面的命令进行安装。
sudo apt install git -all
安装完成之后,进入命令行输入下方命令进行检查,如果输出版本号,则说明安装成功。
$ git --version
git version 2.25.1
使用
首先介绍一下 Git
中的基本术语:工作区, 暂存区,版本库
。
- 工作区:就是在电脑里能看到的目录,或者直接认为是我们在编写项目的目录。
- 暂存区:一般存放在
.git
目录下的index
文件中,所以我们把暂存区有时也叫作索引 (index)。 - 版本库:工作区有一个隐藏目录
.git
,不算工作区,而是Git
的版本库,提交到这里都会形成一个版本,想要要切换到任意版本都很简单。
下面我们就开始介绍一些常用的命令
配置
# 配置全局用户,去掉 --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
命令可将该文件添加到暂存区,可以支持多个文件以及通配符
# 添加一个文件
git add README.md
# 添加 src 目录下的文件
git add src/
# 添加当前目录所有
git add .
查看状态
git status
查看仓库当前的状态,显示有变更的文件。
$ 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
可以比较同一文件在暂存区和工作区的差异。
$ 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
可以查看已经提交的日志记录
$ 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>
都可以创建分支
$ 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 -
可以切换到上一次所在的分支哦
$ git checkout branch1
Switched to branch 'branch1'
$ git switch branch2
Switched to branch 'branch2'
查看分支
git branch
查看所有的分支
$ git branch
branch1
branch2
* master
删除分支
git branch -d/-D <branch name>
$ git branch -D branch2
Deleted branch branch2 (was eaf922f).
重命名分支
git branch -m/-M <old> <new>
$ git branch -m branch1 dev
$ git branch
dev
* master
合并分支
git merge
可以将当前分支和指定分支提交合并
$ 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>
删除标签
$ git tag -d v1.0
Deleted tag 'v1.0' (was 15f051b)
删除远程标签
git push origin :refs/tags/<tag name>
git push origin --delete <tag name>
查看标签
git tag
可以显示所有的标签,我们也可以使用 git tag -l/--list
,并且可以指定特定模式匹配
显示标签内容
git show <tag name>
可以展示标签对应的提交信息,对于附注标签还可以显示添加的额外信息
$ 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
远程仓库
关联仓库
# 一般将 name 取为 origin
# url 可以是 ssh,http 等
git remote add <name> <url>
拉取最新提交
# 只拉取最新提交
git fetch
# 拉取之后合并当前分支
# 相当于 `Git` fetch + `Git` merge
git pull
推送最新提交
本地写完代码之后,提交到仓库中
git push [name] [branch name]
忽略某些文件
有时候,我们有些文件不想要提交到仓库中间,比如说编译的中间仓库,那么我们可以创建一个 .gitignore
文件,并且在其中进行配置
# 忽略 .vscode 目录,无论根目录下的还是子目录下的
.vscode/
# 忽略根目录下的 target 文件夹
/target/
# 忽略所有的 .exe 文件
*.exe
# 指定忽略某个文件
/src/hello.go
# 不过滤 src 目录
!src/
更加详细的见:gitignore
规范
Git 的提交应该符合一定的规定,这样方便操作,比如
type: <description>
type
一般为下面的类型:
feat
: 新功能(feature)fix
: 修补bugdocs
: 文档(documentation)style
: 格式(不影响代码运行的变动)refactor
: 重构(即不是新增功能,也不是修改bug的代码变动)test
: 增加测试chore
: 构建过程或辅助工具的变动add
: 添加某个文件等change
: 对某个文件进行改变,但不改变原来的功能beautify
: 对界面进行美化
此外也可以参考: 约定式提交
思维导图
图片来自网络