做一个小脚本在/bin
目录(或在您的路径中的任何目录)命名git-reword-commit
。 (你可以将其命名为任何你想要的,只要名称与git-
开始。无论是否有合并提交与否这将起作用。
#! /bin/bash
REV=$1
MESSAGE=$2
FILTER="test $(echo '$GIT_COMMIT') = $(git rev-parse $REV) && echo $MESSAGE || cat"
git filter-branch --msg-filter "$FILTER" -- --all
要使用,执行
git reword-commit <commit> 'new message'
警告:这将重写很多提交,所以同样适用于rebase的问题也适用于此处,也就是说,当您推送时需要强制执行此操作,而其他用户将必须知道这一点。
Git将您的原始参考(从过滤器分支之前)放入.git/refs/original
。您可以使用以下别名撤销/确认任何filter-branch命令。
git config alias.undo-filter-branch '! DIR=$(git rev-parse --git-dir); cp -r $DIR/refs/original/refs/ .git/; rm -r $DIR/refs/original/'
git config alias.confirm-filter-branch '! DIR=$(git rev-parse --git-dir); rm -r $DIR/refs/original/'
您的历史中是否有任何合并? 'git rebase'默认不包含合并提交。即使使用'--preserve-merges'选项,当它尝试重新合并时,它将忽略您以前的合并解析。 –
@ JosephK.Strauss谢谢,你有解决方法吗? – Totor
我相信'git filter-branch'会做你想做的事情,如果你使用'msg-filter',但你必须过滤整个分支,但是构造命令只改变一个指定提交的消息。今天晚些时候我可以给出更好的答案。 –