layout: true class: typo, typo-selection --- count: false class: center, middle, nord # Git 入门 --- class: nord ## Git 是什么? Git 是一种版本控制软件. 在传统的版本控制中,我们会遇到这些问题: 1. 不方便多人协作 2. 不方便版本回退 等等. 利用 Git,我们能够看到每个版本的具体更改,同时结合远程仓库,可以实现更高效率的多人合作. --- class: nord ## 核心概念 仓库 (repository): > 指的是存放文件的地方,分为远程仓库和本地仓库. 仓库中代码的组织通过 commit (提交) 来进行. 提交 (commit): > 提交是 Git 中用来组织文件内容的最小单位,将暂存区的变更永久保存到本地仓库,形成版本快照. 每个提交都有一些关键信息,包括提交哈希值、提交作者、提交时间、提交描述、前一个提交 ID 等,方便后续的版本管理和回滚操作. 一个例子是: ```bash # 每次提交都会生成一个唯一的哈希值 git commit -m "feat: add user authentication" # 提交哈希示例:a1b2c3d4e5f6... ``` --- class: nord ## 核心概念 提交历史 (Commit History): > 提交历史是指仓库中所有提交的记录,按照时间顺序排列. 每个提交都有一个唯一的哈希值,用于标识该提交. 通过查看提交历史,我们可以了解项目的开发过程、功能实现、Bug 修复等. > Git 在操作工作目录时,就是基于提交历史来进行的. 每次操作,都需要先获取两种状态之间的对应的提交历史差异,逐个应用到当前工作目录,最终更新到最新状态. --- class: nord ## 核心概念 分支 (branch): > 分支是 Git 中用来并行开发不同功能的机制. 每个分支都是一个独立的线,用于开发和维护不同的功能. 通过分支,你可以在不影响主分支的情况下,独立地开发新功能或修复 Bug. > > 一般来说,我们会按照用途来命名分支,例如: > > main 或 master:主分支,用于稳定版本
> develop:开发分支,用于整合新功能
> feature/:功能分支,用于开发新功能
> hotfix/:修复分支,用于紧急修复 bug
> release/:发布分支,用于版本发布准备 > >
分支的实质是一个指针, 指向某一个提交
--- class: nord ## 核心概念 指针: > 在 Git 中,指针是一个很重要的概念,像分支、标签、HEAD 等,他们的实质是一个指向某个提交的指针. > > > 我们也可以理解为指针是某一个提交对应的 commit id 的别名,指向的是某一种工作目录的状态. 有了指针,可以大大的简化我们的操作,不需要指定具体的提交哈希值. > > 举几个例子来描述一下他如何工作:我们要切换分支,Git 会比较 HEAD 和目标分支,这两个指针之间的相对历史,根据历史,更新当前工作目录的代码到目标分支的状态. > > 我们要拉取代码,Git 比较的是本地分支 (也有可能是 HEAD) 跟远端分支之间的提交历史差异,先通过 fetch 来将远端分支的最新提交历史拉取到本地,然后再根据两个指针之间的差异来更新代码到最新状态. --- class: nord ## 核心概念 暂存区:暂存区可以理解为一个缓存区域,存放了我们准备提交的修改的文件和内容. 文件状态生命周期: * 未跟踪 (Untracked):一般新增的文件,未被提交过、也未被添加到暂存区,因此未被 Git 跟踪,未形成版本控制. 他的状态是未跟踪. * 已暂存 (Staged):不管是新增、修改还是删除,涉及的文件被添加到暂存区,准备提交的状态叫做已暂存. * 已提交 (Committed):改动的文件已被提交到本地仓库,形成版本快照. * 已修改 (Modified):已经被 git 版本控制文件,被修改了. * 未暂存的修改 (Unstaged):已经被 git 版本控制文件,被修改了,但未被添加到暂存区. --- class: nord ## 操作 首先是在命令行中进入项目文件夹,然后运行 `git init`,初始化 git. 在编辑文件之后,运行 `add` 命令 (暂存):暂存一个更改,比如 ```bash git add . git add *.cpp ``` 这里的 `*` 是一个通配符,表示「添加所有后缀为 `.cpp` 的文件进入暂存区」. 如果是 `add .`,就是将全部文件存入暂存区. --- class: nord ## 操作 完成一个阶段的开发之后,确认所有的改动都已经暂存 (运行 `git add .`),之后可以提交这一次更改: ```bash git commit -m "commit message" ``` "commit message" 是 git 默认要求填写的,因为写 commit message 是一个好习惯所以这里也不讲怎么忽略掉它. --- ## 操作 对分支进行操作: ```bash # 查看分支 git branch # 创建分支 git branch
# 切换分支 git checkout
git switch
# 更推荐使用 switch, 因为 checkout 功能非常复杂 # 创建 + 切换分支 git checkout -b
git switch -c
# 合并某分支到当前分支 git merge
# 删除分支 git branch -d
``` --- ## 远程操作 如果要多人合作,可能需要把代码上传到 GitHub (或者我们科协的 gitea) 这类代码托管平台上面. 这时要通过 `remote` 命令来添加远程仓库. ```bash # 显示当前远程仓库 git remote # 添加远程仓库 git remote add
# 删除远程仓库 git remote remove
``` --- ## 远程操作 远程仓库需要一个名字,比如我想把远程仓库叫做 origin,并添加到 GitHub 上面 `physnya/blog` 这个仓库,那么应该写: ```bash git remote add origin https://github.com/physnya/blog.git ``` 后面这个域名可以在这个截图的位置找到: .abs-layout.top-53.left-20.width-55[  ] --- ## 远程操作 在某一次 commit 之后,如果准备将代码推送到远程,那么使用 `git push` 命令,仍然以刚刚远程名字为 origin 为例,将本地的 main 分支推送到 origin,写成: ```bash git push origin main ``` 同理,如果想要把远程分支拉回到本地,使用 `git pull` 命令, ```bash git pull origin main ``` --- ## 进阶操作 下面说一些没那么常用的内容. 最简单的一个是 `git log`,用来查看之前的更改: ```bash # 查看更改历史 git log # 以点线图方式展示更改历史 git log --graph # 每次 commit 用一行显示的更改历史 git log --oneline # 展示所有分支的 log git log --all ``` --- ## 进阶操作 变基 (`git rebase`):这个操作简单理解是用来整理之前的 commit 历史的. 如果有很多人同时给一个远程项目做了提交,这些提交之间有相互冲突,那么就会造成 commit 历史出现分叉;这时候用 `git rebase` 命令,会将历史记录按照改动的顺序排列为一条直线. 另外,`git rebase -i` 命令可以用来将之前的 commit 记录合并为一条,实现「删除 commit 记录」的目的: 首先,使用 `git log` 命令查看提交历史,找到要删除之前的提交的 SHA 值. ```bash $ git log --oneline 701c71f (HEAD -> master) Add feature C a3e5546 Add feature B bc4d08b Add feature A 9f3d2c3 Initial commit ``` --- ## 进阶操作 复制要保留的最早提交的 SHA 值,然后运行以下命令将基于该提交进行重写. ```bash $ git rebase -i
``` 这将打开一个交互式界面,列出要重写的提交. 将要删除的提交前面的指令从 pick 改为 edit,然后保存并关闭文件. 运行 `git rebase --continue`,直到完成重写过程. ```bash $ git rebase --continue ``` 如果有冲突需要解决,在解决冲突后继续运行该命令. 最后,使用 `git push --force` 命令将更改推送到远程仓库,覆盖历史记录. --- ## 进阶操作 回滚 (reset):如果发现某次 commit 并不好,想要回退到上一个 commit 或者更早的某一个 commit,使用 `git reset` 命令. ```bash # 回滚到上一个提交 git reset --hard HEAD^ # 回滚到 3 个提交之前 git reset --hard HEAD~3 # 回滚到某个特定提交 git reset --hard
# 这个操作的前提是知道那一次 commit 的 SHA 值, 可以先 git log ``` 回滚之后想要提交到远程,就要强制 (`--force`) 提交: ```bash git push origin HEAD --force ``` --- ## 进阶操作 commit message 的写法:这里以 Angular 规范为例, > 提交类型指定为下面其中一个: > > build:对构建系统或者外部依赖项进行了修改;
> ci:对 CI 配置文件或者脚本进行了修改;
> docs:对文档进行了修改;
> feat:增加新的特征;
> fix:修复 bug;
> perf:提高性能的代码更改;
> refactor:既不是修复 bug,也不是添加特征的代码重构;
> style:不影响代码含义的修改,比如空格、格式化、缺失的分号等;
> test:增加确实的测试或者矫正已存在的测试. --- ## References [Git 笔记 | 重构人生](https://ykshang.github.io/MyBlog/Git/) [创建与合并分支 - 廖雪峰的官方网站](https://liaoxuefeng.com/books/git/branch/create/index.html) [rebase - 廖雪峰的官方网站](https://liaoxuefeng.com/books/git/branch/rebase/) [Git:如何删除特定提交之前的历史记录 | 极客教程](https://geek-docs.com/git/git-questions/975_git_git_how_to_remove_history_before_a_specific_commit.html) 如果想要练习 git,可以到 [这个网站](https://learngitbranching.js.org/?locale=zh_CN) --- class: nord, middle, center ## Thanks for listening --- exclude: true ## Thanks .card.float-right.width-20[ .img[] ] The template is based on the following open source project: [Remarkjs](https://github.com/gnab/remark) [Typo.css](https://github.com/sofish/typo.css) [Pure.css](https://github.com/pure-css/pure) [Nord](https://github.com/arcticicestudio/nord) [Open color](https://github.com/yeun/open-color) [CSS spaces](https://github.com/badabam/css-spaces) [Remix Icon](https://github.com/Remix-Design/remixicon) [Fork me on GitHub CSS ribbon](https://github.com/simonwhitaker/github-fork-ribbon-css) [Decktape](https://github.com/astefanutti/decktape) [Vue.js](https://cn.vuejs.org/index.html) [Quasar](https://quasar.dev/) [Devices.css](https://github.com/picturepan2/devices.css) [Mermaid](https://github.com/knsv/mermaid) [MathJax](https://github.com/mathjax/MathJax)
Fork me on GitHub