2014-04-10 30 views
3

我想用改變一個很老的提交信息:混帳:改變舊的提交信息,而無需創建衝突

git rebase -i sha1-of-commit^ 

這很好,我做git commit --amend和編輯郵件,但事情變得糟糕時,我做的:

git rebase --continue 

我遇到矛盾多,但不明白爲什麼作爲整個解決衝突顯然已經在過去所做的,和git應該只是向前走,直到所有的提交都會被重訂。

如何快速完成rebase而不必處理這些舊的衝突?我只想畢竟改變一個簡單的(老)提交消息...

+1

您的歷史中是否有任何合併? 'git rebase'默認不包含合併提交。即使使用'--preserve-merges'選項,當它嘗試重新合併時,它將忽略您以前的合併解析。 –

+0

@ JosephK.Strauss謝謝,你有解決方法嗎? – Totor

+0

我相信'git filter-branch'會做你想做的事情,如果你使用'msg-filter',但你必須過濾整個分支,但是構造命令只改變一個指定提交的消息。今天晚些時候我可以給出更好的答案。 –

回答

5

做一個小腳本在/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/' 
+0

謝謝。 「==」與測試一起使用時的含義是什麼,因爲它是[not standard](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html)? – Totor

+0

Woops。它在我的Windows Git bash中起作用;我想我正在考慮Java模式。 –