另外可以见 博文
当我们看到 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
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 ..." 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 ..." 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
或者 git checkout -b
都可以创建分支
$ git checkout -b branch1
Switched to a new branch 'branch1'
$ git branch branch2
Switched to a new branch 'branch2'
git checkout
或者 git switch
,使用 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
$ git branch -D branch2
Deleted branch branch2 (was eaf922f).
git branch -m/-M
$ 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
git tag -a
也可以指定某个提交打标签: git tag xx
git tag -d
删除标签
$ 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
可以展示标签对应的提交信息,对于附注标签还可以显示添加的额外信息
$ 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:
type
一般为下面的类型:
feat
: 新功能(feature)fix
: 修补bugdocs
: 文档(documentation)style
: 格式(不影响代码运行的变动)refactor
: 重构(即不是新增功能,也不是修改bug的代码变动)test
: 增加测试chore
: 构建过程或辅助工具的变动add
: 添加某个文件等change
: 对某个文件进行改变,但不改变原来的功能beautify
: 对界面进行美化此外也可以参考: 约定式提交
图片来自网络