SuperAPI AI 工具集

git-sync

部署与运维

查看项目

更新于 10-16 10:32

技能介绍

Git Sync

Git Sync 用于将当前分支与其基础分支或上游分支同步。默认采用 merge 以保留历史,rebase 仅在显式选择时使用。该技能只依据 git status 和 git log 实际显示的内容行动:绝不猜测分支状态或冲突。

工作流程

阶段 1:检测与决策

运行以下命令以了解当前分支状态:

git branch --show-current git status --porcelain git remote -v git log --oneline HEAD..origin/main 2>/dev/null | head -20 git log --oneline origin/main..HEAD 2>/dev/null | head -20

同时检查分支是否已推送到远程(git log origin/<branch>..HEAD:报错表示仅本地存在)。

确定一次基础分支,并在本次运行的后续步骤中复用该结果:

用户传入 --base <branch>:使用它。

否则 gh pr view --json baseRefName -q .baseRefName 2>/dev/null(如果存在打开的 PR)。

否则 git config branch.<name>.merge。

否则询问用户使用哪个基础分支。

确定同步策略:

Merge(默认):当分支已推送到远程、用户未传入 --rebase,或不确定时使用。

Rebase(需显式选择):仅在用户明确传入 --rebase 时使用。

Fork 同步(--upstream)从 upstream 远程而非 origin 同步:git fetch upstream && git merge upstream/<base>。

在继续之前显示检测到的状态与拟采用的策略:

Current branch: feature/my-feature Base branch: main Strategy: merge (default) Commits behind: 5 Commits ahead: 2 Dirty tree: no

阶段 2:同步前安全检查

脏工作树:使用 --stash 时,在同步前运行 git stash push -m "git-sync auto-stash"。不使用 --stash 时,中止并告知用户提交、暂存,或使用 --stash 重新运行。

获取最新:git fetch origin(fork 同步时还需 git fetch upstream)。

在 fetch 后重新检查分叉情况,确保报告的数字准确,而非 fetch 前的快照。

阶段 3:执行与报告

Merge:git merge origin/<base>

Rebase,仅本地分支:git rebase origin/<base>

Rebase,已推送分支:重写共享历史前发出警告:

WARNING: This branch has been pushed to remote. Rebasing will require a force-push, which rewrites history. This is ONLY safe if no one else has pulled this branch. Proceed? [y/N]

若确认:

git rebase origin/<base> git push --force-with-lease origin <branch>

遇到合并/变基冲突时,不要猜测如何解决:

git diff --name-only --diff-filter=U 列出冲突文件。

报告确切的文件列表,例如:

Conflicts in 2 files: src/api/client.ts src/api/types.ts Resolve manually, then run git merge --continue (or git rebase --continue). Or run git merge --abort (or git rebase --abort) to back out.

停止并等待。不要尝试自动解决。

成功同步后:

如果阶段 2 自动创建了 stash,现在弹出它:git stash pop。如果弹出本身发生冲突,以与合并冲突相同的方式报告这些冲突文件。

收集真实数字,不要估算:

git log --oneline -5 git log --oneline origin/<base>..HEAD | wc -l

仅使用上述命令得到的值进行报告:

Synced feature/my-feature onto main (merge). Now 2 commits ahead of main, 0 behind. Stash popped cleanly.

报告中包含是否使用了 force-push,以及提及本次运行中若发生冲突可使用 git rerere。

参数解析

--rebase:使用 rebase 而非 merge

--base <branch>:指定基础分支(默认:自动检测)

--upstream:从 upstream 远程而非 origin 同步(fork 工作流)

--stash:同步前自动暂存脏更改,同步后弹出

重要说明

无论标志或用户坚持,绝不 force push 到 main/master。

Merge 是共享分支的安全默认选择;仅对确定仅存在于本地或用户明确接受 force-push 警告的分支进行 rebase。

使用 --force-with-lease,绝不使用裸 --force,以免 rebase 后推送覆盖他人的提交。

Fork 工作流要求已配置 upstream 远程(git remote add upstream <url>)。

示例

Sync with main using merge (default)

/git-sync

Sync with develop branch

/git-sync --base develop

Rebase onto main (will warn if branch is already pushed)

/git-sync --rebase

Sync, stashing local changes first

/git-sync --stash

Fork sync: pull upstream changes into your fork

/git-sync --upstream --base main