-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add database course documents[overview and LAB0] (#505)
### What problem were solved in this pull request? a preview link: https://nauta.com.cn/miniob/db_course_lab/overview/ 代码和测试平台会在开课前两天公开。 Issue Number: close #xxx Problem: ### What is changed and how it works? ### Other information
- Loading branch information
Showing
18 changed files
with
389 additions
and
69 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
--- | ||
title: 开源学堂在线编程环境开发 MiniOB | ||
--- | ||
|
||
# 开源学堂在线编程环境开发 MiniOB | ||
|
||
## 加入课程 | ||
加入课程链接: [数据库系统实现原理与实践2025春](https://t.cloudlab.top/labAdminRegister-oceanbase/1aEaMb) | ||
|
||
如下图加入课程: | ||
![](images/cloudlab-setup-join-class.png) | ||
|
||
|
||
## 初始化代码环境 | ||
|
||
### 初始化项目代码 | ||
1. 进入课程学习界面后,大家可以在左侧课程目录中找到对应的实验,然后点击对应的目录项,查看对应的实验的文档。 | ||
|
||
2. 点击上方`启动环境`即可启动开发环境,每次实验的开发环境中的内容是会持久化保存在云端。 | ||
|
||
3. 点击实验工具中的`vscode`来进行开发,将项目在浏览器中打开。 | ||
![](images/cloudlab-setup-startenv.png) | ||
|
||
4. 点击在浏览器中打开,单独打开一个网页作为开发页面。 | ||
![](images/cloudlab-setup-openvscode.png) | ||
|
||
5. `vscode`中只提供了开发环境,需要同学们从[https://github.com/oceanbase/miniob](https://github.com/oceanbase/miniob)中将项目克隆到环境中。使用下面命令将项目`clone`下来之后:`git clone https://github.com/oceanbase/miniob.git`,可以看到在`workspace`下面有一个`miniob`的文件夹。 | ||
![](images/cloudlab-setup-miniob.png) | ||
6. 现在将`vscode`的工作目录设置成`miniob`文件夹,从左侧栏中打开`miniob`的文件夹即可,如下图。 | ||
![](images/cloudlab-setup-workspace.png) | ||
|
||
#### 开发环境配置 | ||
1. 首先安装插件`clangd`和`C/C++ Debug`。 | ||
安装`clangd`, | ||
![](images/cloudlab-setup-install-clangd.png) | ||
同样的方式安装`C/C++ Debug`。 | ||
![](images/cloudlab-setup-install-cppdbg.png) | ||
2. 修改好代码之后,`Ctrl+Shift+B`构建项目,构建完毕后有一个`build_debug`的文件夹,存放编译后的可执行文件。 | ||
3. 使用`clangd`作为语言服务器, 构建完毕后,将`build_debug`中的`compile_commands.json`文件复制到`miniob`目录中,随便打开一个cpp文件,就可以看到`clangd`开始工作。 | ||
![](images/cloudlab-setup-config-clangd.png) | ||
4. 用`F5`进行调试,关于如何`vscode`如何调试,可以参考相关的资料:[cpp-debug](https://code.visualstudio.com/docs/cpp/cpp-debug)。修改`launch.json`文件中`program`和`args`来调试不同的可执行文件。 | ||
![](images/cloudlab-setup-launch-config.png) | ||
![](images/cloudlab-setup-debug.png) | ||
## 提交作业 | ||
实验课作业使用提交平台进行提交,提交平台:[OceanBase训练营](https://open.oceanbase.com/train?questionId=200001) | ||
|
||
训练营提交代码需要gitee/github的仓库,并且大家创建的仓库必须是设置为**私有仓库**(否则会提交失败),具体教程可以参考下面链接: | ||
|
||
[MiniOB GitHub 在训练营中的使用说明](https://oceanbase.github.io/miniob/game/github-introduction/) | ||
|
||
[MiniOB Gitee 在训练营中的使用说明](https://oceanbase.github.io/miniob/game/gitee-instructions/) | ||
|
||
点击立即提测,填入对应的仓库代码地址,`Commit id`和分支,就可以进行测试,并且可以看到测试结果。 | ||
|
||
## 注意事项 | ||
1. 注意在线平台的实验时长的限制,到达限制之后会*回收当前环境*,但是**在持久化目录下的文件不会被清理,会持久保存**,就是上文提到的`workspace`下的文件。注意如果需要`debug`,一定要注意剩余环境时长。 | ||
2. 需要及时将代码上传到`github/gitee`上避免丢失代码。 | ||
3. 共有5个实验,实验文档会持续更新。 | ||
4. MiniOB的资料:[MiniOB](https://oceanbase.github.io/miniob/) | ||
## 可能会出现的问题 | ||
出现了问题请先查看相关文档,对于一些文档中没有出现的异常提示/报错可以上网搜索,查询资料然后再可以问问助教,同学和老师。 | ||
|
||
### Github的网络没有问题,但是push代码失败 | ||
1. 使用令牌来做Github的身份验证,详细参考: | ||
[管理个人访问令牌](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) | ||
|
||
2. 按照上述步骤获得`token`之后,并且按照上文步骤中,导入`miniob`仓库在自己的`github`账号中。 | ||
|
||
3. 在终端中输入下面命令。 | ||
``` | ||
# 先删除远端origin对应的仓库的本地记录。 | ||
git remote rm origin | ||
# 添加自己的仓库,按照下面格式,其中 <token>替换成自己的token, <username>替换成自己的用户名。 | ||
git remote add origin https://<token>@github.com/<username>/miniob.git | ||
``` | ||
4. 然后就可以进行正常的推送和拉取操作了。 |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
--- | ||
title: LAB#0 C++ 基础入门 | ||
--- | ||
|
||
> 请不要将代码提交到公开仓库(包括提交带有题解的 Pull Request),同时也请不要抄袭其他同学或网络上可能存在的代码。 | ||
# LAB#0 C++ 基础 | ||
|
||
MiniOB 是用 C++ 编写的,为了便于大家入门数据库系统实现原理与实践课程,这里提供了若干 C++ 编程特性相关的小练习(Cpplings),帮助大家熟悉一些 C++ 特性。一道简单的编程题目(实现 Bloom Filter),帮助大家熟悉 C++ 编程及 MiniOB 开发环境。其中 Cppings **不计入**实验成绩。 | ||
|
||
## C++ 小练习(Cpplings) | ||
请参考 Cpplings: `src/cpplings/README.md` | ||
|
||
## C++ 入门题目(Bloom Filter) | ||
|
||
布隆过滤器(Bloom Filter)是1970年由伯顿·霍华德·布隆(Burton Howard Bloom)提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 | ||
|
||
如果想判断一个元素是不是在一个集合里,一般想到的是将集合中所有元素保存起来,然后通过比较确定。链表、树、散列表(又叫哈希表,Hash table)等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大。同时检索速度也越来越慢。 | ||
|
||
布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点,把它们置为1。检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;如果都是1,则被检元素很可能在。这就是布隆过滤器的基本思想。所以布隆过滤器可能会产生假阳性(误报,即不在集合中的元素被识别为在集合中),但不会产生假阴性(漏报,即在集合中的元素被识别为不在集合中)。 | ||
|
||
``` | ||
┌─┐ | ||
┌─┼M┼───┐ ┌─┐ | ||
│ └─┴─┐ ├─┼T┼─┐ | ||
│ │ │ └─┤ │ | ||
│ │ │ │ │ | ||
┌▼┬─┬─┬▼┬▼┬─┬▼┬▼┬─┐ | ||
│1│0│0│1│1│0│1│1│0│ | ||
└─┴─┴─┴─┴─┴─┴─┴─┴─┘ | ||
``` | ||
|
||
相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。 | ||
|
||
|
||
### 任务 | ||
|
||
请完成 `src/oblsm/util/ob_bloomfilter.h` 中的 `ObBloomFilter` 类,实现布隆过滤器的功能。`ObBloomFilter` 中提供了必要的接口,请不要修改或删除这些接口,你可以添加任何有助于实现 `ObBloomFilter` 的成员函数和变量。 | ||
|
||
请实现下面代码中的: | ||
|
||
- `ObBloomFilter::insert`:将一个元素插入布隆过滤器中,需要支持并发访问。 | ||
- `ObBloomFilter::clear`:清空布隆过滤器中的所有元素。 | ||
- `ObBloomFilter::contains`:判断一个元素是否在布隆过滤器中,需要支持并发访问。 | ||
|
||
```c++ | ||
class ObBloomfilter | ||
{ | ||
public: | ||
ObBloomfilter(size_t hash_func_count = 4, size_t totoal_bits = 65536); | ||
|
||
void insert(const std::string &object) | ||
{ | ||
} | ||
|
||
void clear() | ||
{ | ||
} | ||
|
||
bool contains(const std::string &object) const | ||
{ | ||
return true; | ||
} | ||
|
||
private: | ||
}; | ||
|
||
``` | ||
提示:你可以通过基于锁的方式来支持并发访问,也可以通过无锁的方式实现。 | ||
思考:布隆过滤器有哪些缺点,你能想到什么方法来改进/优化布隆过滤器存在的问题? | ||
### 测试 | ||
可以通过运行 `unittest/oblsm/ob_bloomfilter_test.cpp` 来测试布隆过滤器的功能。 | ||
MiniOB 中的单测框架使用 [GTest](https://github.com/google/googletest),在默认参数编译后,单测二进制程序位于 `$BUILD_DIR/bin/` 目录下,程序名与单测文件名对应。例如,`ob_bloomfilter_test.cpp` 对应的单测程序为 `$BUILD_DIR/bin/ob_bloomfilter_test`,通过运行该程序即可测试你的实现是否正确。 | ||
```bash | ||
# 编译 miniob 代码 | ||
./build.sh debug --make | ||
# 切换到 build 目录 | ||
cd build_debug/ | ||
# 运行单测程序 | ||
./bin/ob_bloomfilter_test | ||
# 修改代码后重新编译可以在 build_debug 目录下运行 make 命令重新编译代码。 | ||
make | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
--- | ||
title: 数据库系统实现原理与实践课程实验 | ||
--- | ||
|
||
> 请不要将代码提交到公开仓库(包括提交带有题解的 Pull Request),同时也请不要抄袭其他同学或网络上可能存在的代码。 | ||
# 数据库系统实现原理与实践课程实验 | ||
|
||
这是数据库系统实现原理与实践课程的配套实验课程,本课程中所有的实验题目都将基于 [MiniOB](https://github.com/oceanbase/miniob) 完成。MiniOB 用 C++ 编写,是一个教学用途的数据库,其目标是为在校学生、数据库从业者、爱好者提供一个友好的数据库学习项目,更好地将理论、实践进行结合,提升同学们的工程实战能力。 | ||
|
||
数据库系统实现原理与实践课程涵盖数据库系统的核心组件,包含存储,查询,事务等章节。该课程的实验项目完全公开,适合学习系统编程技能的高年级本科生,欢迎对数据库系统实现原理与实践感兴趣的同学参与学习。 | ||
|
||
## 实验题目 | ||
这是本课程的实验题目,实验题目是修改 MiniOB 的各个组件并完成指定的功能,实验题目会持续更新。 | ||
|
||
- [LAB#0 C++ 基础入门](./lab0.md) | ||
- LAB#1 LSM-Tree 存储引擎 | ||
- LAB#2 查询引擎 | ||
- LAB#3 事务引擎 | ||
- LAB#4 性能测试 | ||
|
||
## 零基础入门数据库系统实现原理与实践课程 | ||
|
||
由于很多同学是第一次接触 MiniOB,第一次接触 Github/Git/Docker/Vscode 等新事物,可能对实验流程完全没有概念。所以这里提供一个简单的实验流程,以及一个入门小任务(**不需要写代码**)帮助大家熟悉开发环境和测试平台,并获得本课程实验的基础分。 | ||
|
||
### 实验流程 | ||
|
||
1. **学习 C++ 编程基础。** MiniOB 用 C++ 编写,如果你没有 C++ 编程基础,请先参考本文中 `c++编程语言学习` 的参考资料(或者其他任何资料)学习 C++ 基础知识。可以通过 Cpplings: `src/cpplings/README.md` 和 [LAB#0](./lab0.md) 来做一个编程练习。 | ||
2. **准备自己的代码仓库。** 请参考[文档](../game/github-introduction.md),在 Github/Gitee 上创建自己的**私有代码**仓库。(**请不要创建公开仓库,也不要将代码提交到公开仓库。**) | ||
3. **准备自己的开发环境。** 我们为大家提供了一个[开源学堂在线编程环境](./cloudlab_setup.md),推荐大家使用开源学堂在线编程环境进行实验,在线编程环境已经提供了可以直接用于 MiniOB 编程的环境,便于大家快速开始。对于希望在本地准备开发环境的同学,[这篇文档](../dev-env/introduction.md) 中已经介绍的十分详细,请先认真阅读。如果仍有疑问,欢迎提问,也非常欢迎刚刚入门的同学分享自己准备开发环境的经验。 | ||
4. **浏览实验手册中的文档。** 实验手册文档位于本目录下,需要大家理解各个题目描述功能,写代码,实现题目要求的功能。[MiniOB 教程](https://open.oceanbase.com/course/427)中有一些视频讲解教程,可以辅助学习 MiniOB。 | ||
5. **提交自己的代码到线上测试平台**(需要使用 git 命令提交代码,可参考[文档](../game/git-introduction.md)),在训练营中提交测试(参考[训练营使用说明](https://ask.oceanbase.com/t/topic/35600372) )。 | ||
6. **继续重复上述 4-5 步骤,直到完成所有实验题目。** 提交代码后,训练营会自动运行你的代码,返回测试结果。你需要根据训练营中返回的日志信息,继续修改自己的代码/提交测试。并不断重复这一过程,直到完成所有实验题目。此时,恭喜你,本门课程的实验课程你拿到了满分。 | ||
|
||
### 入门小任务 | ||
|
||
这里提供给大家一个入门小任务,帮助大家熟悉开发环境和测试平台。这个小任务完全不需要编写任何 C++代码,主要用于给大家熟悉实验环境。 | ||
|
||
**任务描述**:创建自己的 MiniOB 代码仓库,在开发环境中验证 MiniOB 基础功能,并将代码提交到测试平台通过 `basic` 题目。 | ||
|
||
#### 1. 学会使用 Git/Github,并创建自己的 MiniOB 代码仓库 | ||
在本实验课程中,我们使用 [Git](https://git-scm.com/) 进行代码版本管理(可以理解为用来追踪代码的变化),使用 [GitHub](https://github.com/)/[Gitee](https://gitee.com/) 做为代码托管平台。如果对于 Git/GitHub 的使用不熟悉,可以参考Git/Github 的官方文档。这里也提供了简易的[Git 介绍文档](../game/git-introduction.md)帮助大家了解部分 Git 命令。 | ||
|
||
如果你已经对 Git/Github 的使用有了一定的了解,可以参考[Github 使用文档](../game/github-introduction.md) 或 [Gitee 使用文档](../game//gitee-instructions.md)来创建自己的 MiniOB 代码仓库(**注意:请创建私有(Private)仓库**)。 | ||
|
||
#### 准备自己的开发环境 | ||
MiniOB 的开发环境需要使用 Linux/MacOS 操作系统,建议使用 Linux 操作系统。我们为大家准备好了一个[开源学堂在线编程环境](./cloudlab_setup.md)(**建议大家优先使用在线编程环境,避免由于自己开发环境问题导致的bug**),除此之外,我们准备了详细的[本地开发环境准备文档](../dev-env/introduction.md)。 | ||
|
||
#### 在开发环境中构建调试 MiniOB,并验证 MiniOB 的基本功能 | ||
在准备好自己的开发环境后,你就可以下载 MiniOB 代码,编译 MiniOB 并运行测试用例,验证 MiniOB 的基本功能。 | ||
1. 下载 MiniOB 代码,**注意:这里请使用自己的私有仓库地址** | ||
``` | ||
git clone https://github.com/oceanbase/miniob.git | ||
``` | ||
2. 在 MiniOB 代码目录下,运行下面命令来编译 MiniOB | ||
``` | ||
bash build.sh debug | ||
``` | ||
3. 进入 build_debug 目录 | ||
``` | ||
cd build_debug/ | ||
``` | ||
4. 在 MiniOB 代码目录下,运行下面命令来启动 MiniOB | ||
``` | ||
./bin/observer | ||
``` | ||
5. 打开另一个终端,进入 build_debug 目录,运行下面命令来启动 MiniOB client | ||
``` | ||
./bin/obclient | ||
``` | ||
6. 在 obclient 中分别执行下面的 SQL 语句,并查看输出结果是否符合预期。 | ||
``` | ||
create table t1 (id int, name char(10)); | ||
insert into t1 values (1, 'hello'); | ||
select * from t1; | ||
``` | ||
|
||
如果一切顺利,你的终端将会展示如下的结果: | ||
``` | ||
$./bin/obclient | ||
Welcome to the OceanBase database implementation course. | ||
Copyright (c) 2021 OceanBase and/or its affiliates. | ||
Learn more about OceanBase at https://github.com/oceanbase/oceanbase | ||
Learn more about MiniOB at https://github.com/oceanbase/miniob | ||
miniob > create table t1 (id int, name char(10)); | ||
SUCCESS | ||
miniob > insert into t1 values (1, 'hello'); | ||
SUCCESS | ||
miniob > select * from t1; | ||
id | name | ||
1 | hello | ||
miniob > | ||
``` | ||
|
||
#### 将代码提交到测试平台,并通过 `basic` 题目 | ||
测试平台中的 `basic` 题目是用来验证 MiniOB 的基本功能的(如创建表,插入数据,查询数据等),原始的 MiniOB 代码(**不需要任何代码修改**)就可以通过测试。你需要参考[文档](https://ask.oceanbase.com/t/topic/35600372)来将 MiniOB 代码提交到测试平台进行测试,并通过 `basic` 题目。至此,恭喜你已经顺利熟悉了开发环境和测试平台的使用。 | ||
|
||
## 注意事项 | ||
|
||
1. **最重要的一条**:请不要将代码提交到公开仓库(包括提交带有题解的 Pull Request),同时也请不要抄袭其他同学或网络上可能存在的代码。 | ||
2. 实验题目都需要单人独立完成,不允许组队完成。 | ||
3. 这门课程需要你有一定的 C++ 编程基础。 | ||
4. 这门课程并不是关于如何使用数据库(例如如何写 SQL 语句,如何基于数据库构建上层应用)的课程。 | ||
|
||
## C++ 编程语言学习 | ||
|
||
本门课程需要大家具备一定的 C++ 编程基础,这里推荐几个 C++ 基础学习的链接: | ||
|
||
- [LearnCpp](https://www.learncpp.com/)(可以作为教程) | ||
- Cpplings: `src/cpplings/README.md`(可以作为小练习) | ||
- [cppreference](en.cppreference.com)(可以作为参考手册) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
--- | ||
title: Git 介绍 | ||
--- | ||
|
||
# Git 介绍 | ||
> Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 | ||
> | ||
> Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 | ||
> | ||
## 日常 Git 开发命令 | ||
|
||
- 查看当前分支 | ||
|
||
```bash | ||
git branch # 查看本地分支 | ||
|
||
git branch -a # 查看所有分支,包括远程分支 | ||
``` | ||
|
||
- 创建分支 | ||
|
||
```bash | ||
git checkout -b 'your branch name' | ||
|
||
git branch -d 'your branch name' # 删除一个分支 | ||
``` | ||
|
||
- 切换分支 | ||
|
||
```bash | ||
git checkout 'branch name' | ||
``` | ||
|
||
- 提交代码 | ||
|
||
```bash | ||
# 添加想要提交的文件或文件夹 | ||
git add 'the files or directories you want to commit' | ||
# 这一步也可以用 git add . 添加当前目录 | ||
|
||
# 提交到本地仓库 | ||
# -m 中是提交代码的消息,建议写有意义的信息,方便后面查找 | ||
git commit -m 'commit message' | ||
``` | ||
|
||
- 推送代码到远程仓库 | ||
|
||
```bash | ||
git push | ||
# 可以将多次提交,一次性 push 到远程仓库 | ||
``` | ||
|
||
- 合并代码 | ||
|
||
```bash | ||
# 假设当前处于分支 develop 下 | ||
git merge feature/update | ||
# 会将 feature/update 分支的修改,merge 到 develop 分支 | ||
``` | ||
|
||
- 临时修改另一个分支的代码 | ||
|
||
```bash | ||
# 有时候,正在开发一个新功能时,突然来了一个紧急 BUG,这时候需要切换到另一个分 去开发 | ||
# 这时可以先把当前的代码提交上去,然后切换分支。 | ||
# 或者也可以这样: | ||
git stash # 将当前的修改保存起来 | ||
|
||
git checkout main # 切换到主分支,或者修复 BUG 的分支 | ||
|
||
git checkout -b fix/xxx # 创建一个新分支,用于修复问题 | ||
|
||
# 修改完成后,merge 到 main 分支 | ||
# 然后,继续我们的功能开发 | ||
|
||
git checkout feature/update # 假设我们最开始就是在这个分支上 | ||
git stash pop | ||
|
||
# stash 还有很多好玩的功能,大家可以探索一下 | ||
``` |
Oops, something went wrong.