---
### Step 1: 通过GitHub Fork

1. 访问 https://github.com/vesoft-inc/nebula
2. 点击右上角`Fork` 按钮创建远程分支

### Step 2: 将分支克隆到本地

定义本地工作目录:

```sh
# 定义工作目录
working_dir=$HOME/Workspace
```

将`user` 设置为GitHub账户名:

```sh
user={GitHub账户名}
```

克隆:

```sh
mkdir -p $working_dir
cd $working_dir
git clone https://github.com/$user/nebula.git
# 推荐如下方式
# 或: git clone git@github.com:$user/nebula.git

cd $working_dir/nebula
git remote add upstream https://github.com/vesoft-inc/nebula.git
# 或: git remote add upstream git@github.com:vesoft-inc/nebula.git

# 由于没有写访问权限,请勿推送至上游主分支
git remote set-url --push upstream no_push

# 确认远程分支有效:
# 正确的格式为:
# origin    git@github.com:$(user)/nebula.git (fetch)
# origin    git@github.com:$(user)/nebula.git (push)
# upstream  https://github.com/vesoft-inc/nebula (fetch)
# upstream  no_push (push)
git remote -v
```

#### 定义预提交hook

请将Nebula Graph预提交挂钩链接到`.git`目录。

此挂钩检查提交格式,构建,文档生成等。

```sh
cd $working_dir/nebula/.git/hooks
ln -s ../../cpplint/bin/pre-commit.sh .
```

有时,预提交挂钩不能执行,在这种情况下,需要手动执行。

```sh
cd $working_dir/nebula/.git/hooks
chmod +x pre-commit
```

### Step 3: 分支

更新本地主分支:

```sh
cd $working_dir/nebula
git fetch upstream
git checkout master
git rebase upstream/master
```

从主分支创建并切换分支:

```sh
git checkout -b myfeature
```
!!! 注意
    由于一个PR通常包含多个commit,在合并至主分支时容易被挤压,因此建议您创建独立的分支进行更改。合并后的分支已无用处,因此可以使用上述rebase命令将本地主分支与上游同步。此外,如果直接将commit提交至主分支,则需要hard reset主分支。

```sh
git fetch upstream
git checkout master
git reset --hard upstream/master
git push --force origin master
```

### Step 4: 开发

#### 编辑代码

此时可在 `myfeature` 分支编辑代码, 编辑时请遵循 [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html)。

#### 运行独立模式

如需重现并检查问题,则需在独立模式下运行nebula。

```sh
# 构建二进制文件
make server

# 在独立模式下运行
nebula-graphd
```

将Nebula Graph与本地服务器相连

```sh
nebula
```

#### 运行测试

```sh
# 运行单元测试,确保所有测试顺利通过。
```

### Step 5: 保持分支同步

```sh
# 当处于myfeature分支时:
git fetch upstream
git rebase upstream/master
```

### Step 6: Commit

提交代码更改

```sh
git commit
```

### Step 7: Push

代码更改完成或需要备份代码时,将本地仓库创建的分支push到GitHub端的远程仓库:
```sh
git push -f origin myfeature
```

### Step 8: 创建pull request

1. 点击此处访问fork仓库https://github.com/$user/nebula (替换此处的 `$user` 用户名)。
2. 点击`myfeature`分支旁的 `Compare & pull request` 按钮。

### Step 9: 代码审查

公开的pull request至少需要一人审查,代码审查包括查找bug,审查代码风格等。