Git 基本使用

317 阅读5分钟

概念

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

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

思维导图

图片来自网络

img


不定时分享些许技术~