golang命令行界面工具解决git合并冲突插件fac的使用

Golang命令行界面工具解决Git合并冲突插件fac的使用

简介

fac是一个易于使用的命令行界面工具,用于解决Git合并冲突。它提供了一个直观的交互界面来处理合并冲突。

banner

安装

使用Go安装

$ go install github.com/mkchoi212/fac@latest

使用Homebrew安装

brew tap mkchoi212/fac https://github.com/mkchoi212/fac.git
brew install fac

使用方法

fac的操作类似于git add -p。它在屏幕底部有一个提示输入,用户可以输入各种命令。

预设命令键绑定

按键绑定 描述
w 向上显示更多行
s 向下显示更多行
a 使用本地版本
d 使用传入版本
e 手动编辑代码
j 向下滚动
k 向上滚动
v [v]iew 切换视图方向
n [n]ext 下一个冲突
p [p]revious 上一个冲突
h, ? [h]elp 帮助
q, Ctrl+c [q]uit 退出

交互提示示例

[w,a,s,d,?] >> [INPUT HERE]

自定义配置

可以通过在home目录创建.fac.yml文件来自定义上述键绑定和各种行为。请参考配置README.md获取更多信息。

贡献

这是一个开源项目,欢迎通过以下方式贡献:

  • 提交issue
  • 通过电子邮件发送反馈
  • 在Twitter上联系我

许可证

详见LICENSE文件


更多关于golang命令行界面工具解决git合并冲突插件fac的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang命令行界面工具解决git合并冲突插件fac的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 命令行工具:fac - Git 合并冲突解决插件

fac (Fix All Conflicts) 是一个用 Go 编写的 Git 合并冲突解决工具,它可以帮助开发者更高效地处理 Git 合并冲突。下面我将介绍 fac 的基本使用方法和一个简单的 Go 实现示例。

fac 基本功能

fac 主要提供以下功能:

  • 自动检测当前 Git 仓库中的合并冲突文件
  • 提供交互式界面让用户选择解决冲突的方式
  • 支持批量操作多个冲突文件
  • 提供快捷命令快速接受某一方变更

安装 fac

go install github.com/mkchoi212/fac@latest

基本使用方法

# 进入有合并冲突的 Git 仓库
cd your-repo

# 运行 fac 交互式界面
fac

# 或者直接接受所有本地变更
fac --ours

# 或者直接接受所有远程变更
fac --theirs

Go 实现示例

下面是一个简化版的 fac 核心功能实现:

package main

import (
	"bufio"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"strings"
)

func main() {
	// 检查是否在 Git 仓库中
	if !isGitRepo() {
		fmt.Println("错误:当前目录不是 Git 仓库")
		os.Exit(1)
	}

	// 获取冲突文件列表
	conflictFiles := getConflictFiles()
	if len(conflictFiles) == 0 {
		fmt.Println("没有发现合并冲突")
		return
	}

	fmt.Println("发现以下冲突文件:")
	for i, file := range conflictFiles {
		fmt.Printf("%d. %s\n", i+1, file)
	}

	// 交互式处理
	reader := bufio.NewReader(os.Stdin)
	for _, file := range conflictFiles {
		fmt.Printf("\n处理文件: %s\n", file)
		fmt.Println("1. 接受本地变更 (ours)")
		fmt.Println("2. 接受远程变更 (theirs)")
		fmt.Println("3. 手动编辑")
		fmt.Println("4. 跳过")
		fmt.Print("请选择操作: ")

		input, _ := reader.ReadString('\n')
		input = strings.TrimSpace(input)

		switch input {
		case "1":
			resolveConflict(file, "ours")
		case "2":
			resolveConflict(file, "theirs")
		case "3":
			editFile(file)
		default:
			fmt.Println("跳过此文件")
		}
	}

	fmt.Println("\n所有冲突处理完成")
}

func isGitRepo() bool {
	cmd := exec.Command("git", "rev-parse", "--is-inside-work-tree")
	return cmd.Run() == nil
}

func getConflictFiles() []string {
	cmd := exec.Command("git", "diff", "--name-only", "--diff-filter=U")
	output, err := cmd.Output()
	if err != nil {
		return nil
	}

	files := strings.Split(strings.TrimSpace(string(output)), "\n")
	var conflictFiles []string
	for _, file := range files {
		if file != "" {
			conflictFiles = append(conflictFiles, file)
		}
	}
	return conflictFiles
}

func resolveConflict(file, side string) {
	var option string
	if side == "ours" {
		option = "--ours"
	} else {
		option = "--theirs"
	}

	cmd := exec.Command("git", "checkout", option, "--", file)
	if err := cmd.Run(); err != nil {
		fmt.Printf("解决冲突失败: %v\n", err)
		return
	}

	// 添加到暂存区
	addCmd := exec.Command("git", "add", file)
	if err := addCmd.Run(); err != nil {
		fmt.Printf("添加到暂存区失败: %v\n", err)
		return
	}

	fmt.Printf("已接受 %s 变更: %s\n", side, file)
}

func editFile(file string) {
	editor := os.Getenv("EDITOR")
	if editor == "" {
		editor = "vi" // 默认使用 vi
	}

	absPath, err := filepath.Abs(file)
	if err != nil {
		fmt.Printf("获取文件绝对路径失败: %v\n", err)
		return
	}

	cmd := exec.Command(editor, absPath)
	cmd.Stdin = os.Stdin
	cmd.Stdout = os.Stdout
	cmd.Stderr = os.Stderr

	if err := cmd.Run(); err != nil {
		fmt.Printf("编辑文件失败: %v\n", err)
		return
	}

	fmt.Printf("请检查文件 %s 并手动解决冲突后添加到暂存区\n", file)
}

功能扩展建议

  1. 彩色输出:使用 github.com/fatih/color 包增强可读性
  2. 更智能的冲突解决:实现自动合并无冲突的部分
  3. 保存解决方案:记录冲突解决方式以便复用
  4. 与 Git 钩子集成:在合并失败时自动提示使用 fac

总结

fac 工具通过提供简洁的交互式界面,大大简化了 Git 合并冲突的解决流程。上面的 Go 实现展示了核心功能,你可以根据需要进一步扩展。实际开发中建议直接使用原版 fac 工具,它提供了更完整的功能和更好的用户体验。

要了解更多关于 fac 的信息,可以访问其 GitHub 仓库:https://github.com/mkchoi212/fac

回到顶部