# 使用 REST API 与 Git 数据库交互

使用 REST API，可在 GitHub 上的 Git 数据库中读取和写入原始 Git 对象，并列出和更新你的引用（分支头部和标记）。

## 概述

这基本上允许你通过 REST API 重新实现大量 Git 功能 - 通过直接在数据库中创建原始对象并更新分支引用，从技术上讲，可以在不安装 Git 的情况下完成 Git 能做的任何事情。

如果 Git 存储库为空或不可用，REST API 将返回 `409 Conflict`。 存储库不可用通常意味着 GitHub 正在创建存储库。 对于空存储库，可以使用 [`PUT /repos/{owner}/{repo}/contents/{path}`](/zh/rest/repos/contents#create-or-update-file-contents) REST API 终结点来创建内容并初始化存储库，以便可以使用 API 来管理 Git 数据库。 如果此响应状态仍然存在，请联系 通过网站管理员[GitHub支持门户](https://support.github.com)。

有关 Git 对象数据库的详细信息，请阅读 Pro Git 手册中的 [Git 内部](https://git-scm.com/book/en/v2/Git-Internals-Plumbing-and-Porcelain)章节。

例如，如果要将更改提交到存储库中的某个文件，需要：

* 获取当前提交对象
* 检索它指向的树
* 检索树中与该特定文件路径对应的 blob 对象的内容
* 以某种方式更改内容并发布包含这些新内容的新 blob 对象，以获取 blob SHA
* 发布新的树对象， 将文件路径指针替换为新的 blob SHA， 以获取树 SHA
* 通过作为父级的当前提交 SHA 和新的树 SHA，创建新的提交对象，以获取提交 SHA
* 更新分支的引用以指向新的提交 SHA

看似很复杂，但是当了解模型后，实际上很简单，它将带来崭新的体验，使你可以使用 API 实现许多功能。

## 检查拉取请求的可合并性

> \[!WARNING]
> 请不要依赖于直接使用 Git 或 [`GET /repos/{owner}/{repo}/git/refs/{ref}`](/zh/rest/git/refs#get-a-reference) 来更新 `merge` Git 引用，因为此内容会在没有警告的情况下过时。

使用 API 需要明确请求拉取请求来创建一个\_测试\_合并提交。 在 UI 中查看拉取请求并显示“合并”按钮时，或者使用 REST API *获取*、[创建](/zh/rest/pulls/pulls#get-a-pull-request)或[编辑](/zh/rest/pulls/pulls#create-a-pull-request)拉取请求时，将创建一个[测试](/zh/rest/pulls#update-a-pull-request)合并提交。 如果没有此请求，`merge` Git 引用将过期，直到有人查看拉取请求。

如果当前使用的是生成过时`merge` Git refs 的轮询方法，则GitHub建议使用以下步骤从默认分支获取最新更改：

1. 接收拉取请求 web 挂钩。
2. 调用 [`GET /repos/{owner}/{repo}/pulls/{pull_number}`](/zh/rest/pulls/pulls#get-a-pull-request) 来启动创建合并提交候选的后台任务。
3. 使用 [`GET /repos/{owner}/{repo}/pulls/{pull_number}`](/zh/rest/pulls/pulls#get-a-pull-request) 轮询存储库以查看是否 `mergeable` 属性为 `true` 或 `false`。 只有在执行上述步骤后，才能直接使用 Git 或 [`GET /repos/{owner}/{repo}/git/refs/{ref}`](/zh/rest/git/refs#get-a-reference) 更新 `merge` Git 引用。