做一個小腳本在/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',但你必須過濾整個分支,但是構造命令只改變一個指定提交的消息。今天晚些時候我可以給出更好的答案。 –