SuperAPI AI 工具集

git-push

编程与开发

查看项目

更新于 10-16 05:27

技能介绍

用途

git-push 用于将已有的本地提交推送到远程仓库,并正确处理分支跟踪与上游设置。它适用于以下场景:将本地提交推送到远程并建立分支跟踪与上游;在尚未创建 PR 时先把变更发送到远程;通过显式 refspec 将本地 main 的提交迁移到远程特性分支;在 rebase 或 amend 之后更新远程分支。

如果存在未提交的变更需要推送,应先使用 git-commit;如果推送后要创建 PR,应使用 git-pr;如果要设计更广泛的 main-branch-dev 模式,应使用 git-branch-pr-workflow;如果需要合并的 commit + push + PR 宏操作,应使用 git-commit-push-pr。

触发方式

触发短语包括:“push”“push changes”“push commits”“send to remote”“update remote”“sync with origin”“upload changes”。

上下文信号包括:存在尚未推送到远程的本地提交;用户刚刚提交了变更;git status 显示“Your branch is ahead”;未提及“PR”或“pull request”。

工作流程

  1. 评估推送状态:检查当前分支与跟踪(git branch --show-current、git status --porcelain=v2 --branch);统计领先远程的提交数(git rev-list --count @{upstream}..HEAD,无上游时输出 no upstream);检查远程是否存在(git remote -v)。

  2. 确定推送策略:已有上游跟踪时使用 git push;无上游且本地与远程分支名相同时使用 git push -u origin $(git branch --show-current);在 main 上推送到不同名的远程分支时使用显式 refspec(git push origin main:<remote-branch>),不使用 -u 以保留 main 的跟踪;需要强制推送(rebase/amend 后)时使用 git push --force-with-lease,且仅在用户明确确认后执行。

  3. 验证推送:使用 git status --porcelain=v2 --branch 确认同步状态,应显示 branch.ab +0 -0(无领先/落后提交)。

推送模式

标准推送(默认):对已跟踪分支上的常规提交使用 git push。

推送到远程特性分支(主分支开发):在 main 上且有提交需要为 PR 推送时,直接推送到远程特性分支而不创建本地分支:git push origin main:<remote-branch-name>;推送特定提交范围到远程分支:git push origin <start>^..<end>:<remote-branch-name>。这避免了本地分支的来回切换,PR 合并后在 main 上执行 git pull 即可干净同步。

首次推送(新分支):对没有上游的分支,当远程分支名与本地一致时使用 git push -u origin $(git branch --show-current)。注意:-u 会将当前本地分支的上游绑定到指定的远程分支。如果你在 main 上却想推送到不同名的特性分支,应改用 refspec 形式,否则 main 会跟踪该特性分支。错误示例(在 main 上):git push -u origin feat/foo 会把 main 设置为跟踪 origin/feat/foo;正确做法:git push origin main:feat/foo,在不改变跟踪的情况下把 main 的提交推送到远程特性分支。

带标签推送:当提交包含版本标签时使用 git push --follow-tags。

强制推送(With Lease):对 rebase 或 amend 后的提交(需要确认)使用 git push --force-with-lease,它比 --force 更安全,如果远程有新提交则会失败。

安全检查

推送前需验证:分支名(避免直接推送到 main/master);提交数量(数量合理);无未提交变更(工作区干净);远程可达(网络连通性);分支处于活跃且同步状态——当继续在已有 PR 的分支上工作时,先调用 /git:pr-sync-check。pr_merged 结论意味着工作应基于更新后的默认分支新建分支,而不是在此处继续;behind 结论意味着推送前应先协调(git pull --rebase)。check-branch-sync-on-push.sh 钩子也会自动提示。参见 .claude/rules/pr-branch-sync.md。

主分支推送行为

当当前分支为 main 或 master 时:主分支开发模式下,预期工作流是推送到远程特性分支以供 PR(git push origin main:<feature-branch>);直接推送到远程 main(git push origin main)需要确认,除非用户明确要求。

可组合性

该技能只推送提交。完整工作流组合如下:用户意图为“push”时仅调用 git-push;“commit and push”时调用 git-commit → git-push;“push and create PR”时调用 git-push → git-pr;“commit, push, and PR”时调用 git-commit → git-push → git-pr;“create PR”(在 main 上)时由 git-pr 自动处理推送与 PR 创建。

输出

成功时报告:已推送到 origin/feature-branch;推送的提交数:3;分支现已与远程同步;可进行:创建 PR、继续工作或合并。

错误处理

无上游配置:提示“Branch has no upstream. Setting upstream to origin/<branch>”。

远程已分叉:提示“Push rejected: remote contains commits not in local branch.”,并提供选项:1. 拉取并合并:git pull;2. 拉取并 rebase:git pull --rebase;3. 强制推送(会丢失远程提交):git push --force-with-lease。

远程不可达:提示“Cannot reach remote 'origin'. Check network connection.”。

受保护分支被拒绝:提示“Push rejected: branch 'main' is protected. Create a feature branch and submit a pull request instead.”。

快速参考

标准推送:git push;main 到远程特性分支:git push origin main:<branch-name>;提交范围到远程分支:git push origin <start>^..<end>:<branch>;新分支(本地/远程同名):git push -u origin $(git branch --show-current);带标签:git push --follow-tags;rebase 后:git push --force-with-lease;检查领先数:git rev-list --count @{upstream}..HEAD;检查跟踪:git branch -vv。

最佳实践

频繁推送——更小、增量的推送更安全;绝不对共享分支强制推送——先与团队协调;使用特性分支——保持 main/master 干净;强制推送前验证——始终使用 --force-with-lease;推送后检查 CI——确保远程测试通过。