2014-04-10 31 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模式。 –