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