如何让git-push永久跳过autocommit分支的提交?
问题1:如何避免推送autocommit分支到远程?
Git没有直接的git push --skip <branch>命令,但有几种可靠的方法来实现这个需求:
明确指定推送的分支:每次推送时只推master分支,而不是所有分支:
git push origin master这样autocommit分支会完全留在本地,不会被推送到远程仓库。
设置默认推送规则:如果你不想每次都手动指定分支,可以配置Git默认只推送master到远程:
git config remote.origin.push refs/heads/master:refs/heads/master之后执行
git push时,只会推送master分支,autocommit分支永远不会被包含在推送操作中。取消autocommit的上游关联:如果之前给autocommit设置过上游分支,直接移除它就能避免Git默认推送该分支:
git branch --unset-upstream autocommit哪怕执行
git push --all,autocommit也不会被推送到远程。
问题2:更优的替代方案(替代squash合并)
你想要保留master和autocommit之间的历史关联,同时不暴露autocommit的零散提交到远程,推荐使用正常的非快进合并,配合上面的推送限制,完美解决你的痛点:
推荐流程:
在autocommit分支完成自动提交后,切换到master分支:
git checkout master执行非快进合并(强制生成合并提交,建立清晰的历史关联):
git merge --no-ff autocommit -m "Merge autocommit updates"这里
--no-ff会生成一个单独的合并提交,让master的历史清晰显示“合并了autocommit的更新”,同时autocommit的所有零散提交会作为本地的父链存在,但绝不会被推送到远程。推送master分支到远程(只有master会被推送):
git push origin master切换回autocommit分支,继续后续的自动提交:
git checkout autocommit如果master有其他手动提交需要同步到autocommit,执行快进合并即可:
git merge --ff-only master
为什么这个方案更好?
- 相比
squash合并,它保留了master和autocommit之间的真实历史关联,你可以通过git log --graph清晰看到两个分支的合并脉络,完全满足本地统计分析的需求。 - 远程仓库只会收到master分支的提交(包括合并提交),autocommit的所有零散提交完全留在本地,不会干扰远程分支的整洁性。
- 彻底解决了
squash合并带来的“历史断层”问题,同时兼顾了本地详细提交和远程整洁历史的双重需求。
关于远程仓库历史的安全性
完全不用担心远程仓库历史会损坏:只要你不推送autocommit分支,远程的master分支历史始终是线性且可访问的。合并提交只会记录“合并了本地分支的更新”,但远程仓库看不到autocommit的具体提交内容,也不需要访问它们——Git在推送master时,只会传输master分支及其祖先提交(包括合并提交),autocommit的提交不会被包含在推送的对象中。
内容的提问来源于stack exchange,提问作者Tobias Kienzler

