使用node脚本合并git分支

520 阅读1分钟

实现效果

在终端输入命令yarn merge test dev,自动将git的dev分支的代码合并到test。 这只是一个简单的例子,介绍一下代码中几个依赖工具的简单使用,可以使用类似方法实现代码合并、项目发布等需求。

准备

1、在根目录创建文件scripts/merge.js

2、在package.json中的scripts添加"merge": "node scripts/merge.js"

实现代码

也就是scripts/merge.js文件中的代码

记得安装相关依赖:

minimist:命令行参数解析

chalk:控制台输出

enquirer:交互式询问CLI

execa:执行命令

import minimist from 'minimist';// 命令行参数解析
import chalk from 'chalk';// 控制台输出
import pkg from 'enquirer';// 交互式询问CLI
const { prompt } = pkg;
import { execa } from 'execa';// 执行命令

const args = minimist(process.argv.slice(2))// 命令行参数解析

const targetBranch = args._[0];// 目标分支
const mergeBranch = args._[1];// 合并分支

// 控制台输出
const step = msg => console.log(chalk.cyan(msg))

// 执行命令
const run = (bin, args = [], opts = {}) => {
    console.log(chalk.blue(`[执行命令] ${bin} ${args.join(' ')}`));
    return execa(bin, args, { stdio: 'inherit', ...opts });
}

// 执行合并命令
async function executeMerge(target, branch) {
    // 切换到合并目标分支
    step(`正在切换到目标分支“${target}”...`);
    await run('git', ['checkout', target]);
    // 拉取
    step(`正在拉取远程代码...”`);
    await run('git', ['pull']);
    // 合并
    step(`正在合并代码...”`);
    await run('git', ['merge', branch]);
    // 推送
    step(`正在推送...”`);
    await run('git', ['push']);
    // 切换回原分支
    step(`正在切换回原分支“${branch}”...`);
    await run('git', ['checkout', branch]);
}

async function main() {
    if (!targetBranch || !mergeBranch) {
        console.log(chalk.red('请传入目标或合并分支'))
        return;
    }
    const { confirm } = await prompt({
        type: 'select',
        name: 'confirm',
        message: `确定将“${mergeBranch}”分支合并到“${targetBranch}”分支?`,
        choices: ['取消', '确定']
    })
    if (confirm === '取消') {
        return;
    }
    executeMerge(targetBranch, mergeBranch)
}

try {
    main()
} catch (err) {
    console.log(chalk.red(err))
}