You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用go-git获取两个分支或当前分支与master的diff差异

go-git 分支差异对比实现方案

Git 中的分支本质是指向对应分支最新提交的指针引用,你提到的(*object.Commit).Patch方法完全可以满足分支维度的 diff 需求,只需要先获取到两个分支对应的最新提交对象即可,不需要额外的特殊 API。

实现步骤

  • 第一步:打开本地 Git 仓库实例
  • 第二步:分别解析两个分支的引用,获取对应分支的最新提交哈希,拿到 Commit 对象
  • 第三步:调用两个 Commit 对象的 Patch 方法生成差异内容,即为对应分支之间的 diff 结果

代码示例

package main

import (
	"fmt"
	"os"

	"gopkg.in/src-d/go-git.v4"
	"gopkg.in/src-d/go-git.v4/plumbing"
)

func main() {
	// 打开本地仓库,替换为你的仓库本地路径
	repo, err := git.PlainOpen("/path/to/your/repo")
	if err != nil {
		fmt.Printf("打开仓库失败: %v\n", err)
		os.Exit(1)
	}

	// 获取 master 分支的最新提交
	masterRef, err := repo.Reference(plumbing.ReferenceName("refs/heads/master"), true)
	if err != nil {
		fmt.Printf("获取master分支引用失败: %v\n", err)
		os.Exit(1)
	}
	masterCommit, err := repo.CommitObject(masterRef.Hash())
	if err != nil {
		fmt.Printf("获取master分支最新提交失败: %v\n", err)
		os.Exit(1)
	}

	// 示例:获取 feature/branch 分支的最新提交
	// 若要对比当前分支与master的差异,替换为当前分支名即可
	targetRef, err := repo.Reference(plumbing.ReferenceName("refs/heads/feature/branch"), true)
	if err != nil {
		fmt.Printf("获取待对比分支引用失败: %v\n", err)
		os.Exit(1)
	}
	targetCommit, err := repo.CommitObject(targetRef.Hash())
	if err != nil {
		fmt.Printf("获取待对比分支最新提交失败: %v\n", err)
		os.Exit(1)
	}

	// 生成两个提交的差异补丁,等价于 git diff master feature/branch
	patch, err := targetCommit.Patch(masterCommit)
	if err != nil {
		fmt.Printf("生成差异补丁失败: %v\n", err)
		os.Exit(1)
	}

	// 输出完整diff内容
	fmt.Println(patch.String())
}

补充说明

如果你需要实现git diff master的效果,也就是当前工作区未提交内容和 master 分支的对比,只需要额外获取当前工作区的树对象,和 master 分支的提交树对象做对比即可。

内容的提问来源于stack exchange,提问作者p3quod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 08:24:02