跳到主要内容

Patch

在参加 oceanbase 大赛的过程中,我是把 miniob 的 commit 信息清除后进行开发的,这样可以保持清晰的 commit 记录。但是要合并上游代码时就要用到 patch 了。

patch 是记录着文件更改的一种文件:

diff --git a/package.json b/package.json
index dc9a6af..bff69eb 100644
--- a/package.json
+++ b/package.json
@@ -16,6 +16,7 @@
"dependencies": {
"@docusaurus/core": "2.4.3",
"@docusaurus/preset-classic": "2.4.3",
+ "@giscus/react": "^2.3.0",
"@mdx-js/react": "^1.6.22",
"clsx": "^1.2.1",
"prism-react-renderer": "^1.3.5",

托管在 github 上的项目,可以在某个 commit 页面或者某个 pr 页面,在 url 后面加上 .patch 就可以下载 patch 文件了。

例如 commit 页面:https://github.com/oceanbase/miniob/commit/c7c5ca7434fb11ad23d6794e7bee2f435c022767

对应的 patch 页面:https://github.com/oceanbase/miniob/commit/c7c5ca7434fb11ad23d6794e7bee2f435c022767.patch

下载下来的 patch 文件,可以用 git apply 命令来应用 patch:

git apply 1.patch

一般情况下上述方法就足够了,但是我在某次 commit 格式化了全部代码(官方仓库有 .clang-format,但未进行格式化),导致差异太大,很难直接使用 patch 来合并。

这个时候可以借助一些图形化工具,可以将官方仓库添加为远程仓库,然后使用图形化工具来合并代码。我使用的是 JetBrains 的 IDE,可以直接使用它的 merge 功能来合并代码,非常好用。

git remote add upstream xxx
git fetch upstream
git merge upstream/master

如果要仅合并某个 commit,也可以使用 IDE 的 cherry-pick 功能,命令行太折磨了。