如何在Git中创建父提交顺序反转的合并提交(Weblate场景)
如何简便调换Git合并提交的父提交顺序
你完全不用再折腾那些繁琐的临时分支操作啦,这里有两种更简洁的方法,能帮你快速调整合并提交的父顺序,让GitHub这类工具优先展示Weblate的翻译变更:
方法一:简化分支切换法
这个方法比你原来的方案少了分支删除的步骤,操作更顺畅:
# 先拉取上游仓库的最新代码 git fetch origin # 切换到上游的master分支 git checkout origin/master # 合并你的本地master分支(包含翻译提交),生成父顺序正确的合并提交 git merge --no-ff master -m "Translated using Weblate" # 切回本地master分支,把它重置到刚生成的合并提交上 git checkout master git reset --hard HEAD@{1} # 最后推送到上游仓库即可 git push origin master
方法二:无需切换分支的高效技巧
如果你不想来回切换分支,这个命令行组合操作更适合你:
# 第一步还是拉取上游最新代码 git fetch origin # 执行合并操作但不提交,要是有冲突就手动解决,解决完记得git add . git merge --no-ff --no-commit origin/master # 把合并后的文件树状态保存下来 MERGED_TREE=$(git write-tree) # 撤销刚才未提交的合并操作 git merge --abort # 创建一个新的合并提交,这里特意把上游master设为第一个父,你的本地提交设为第二个父 NEW_COMMIT=$(git commit-tree $MERGED_TREE -p origin/master -p HEAD -m "Translated using Weblate") # 把本地master分支指向这个新的合并提交 git reset --hard $NEW_COMMIT # 推送到上游仓库 git push origin master
为什么这两种方法管用?
GitHub这类工具会默认把合并提交的第一个父节点当作当前分支,第二个父节点当作被合并的分支。我们调整父顺序后,工具展示的差异就会是你的翻译变更相对于上游仓库的内容,正好符合你想要的效果。
对比你之前用临时分支的方案,这两种方法要么简化了步骤,要么完全避免了分支切换,操作效率提升不少。
内容的提问来源于stack exchange,提问作者Michal Čihař




