如何使用更改的提交消息精确重放git分支历史记录?

时间:2015-10-12 21:10:43

标签: git git-rebase

我有一个分支,我想更改一堆提交消息。我不在乎重写历史。分支有很多变化,所以在master之上对它进行重新定位是不切实际的(很多提交都有很多冲突,解决它需要几周的时间)。

我想要的是(鉴于迄今为止的历史是一致的并且合并是从master使用的)基本上是挑选在分支上完成的所有提交和合并,并按顺序,偶尔修改提交消息。基本上从头开始重新创建并强行推动。

我认为git rebase --interactive --preserve-merges(first commit)^会做到这一点;但是,当完成此操作时,重做合并时仍会遇到冲突。这是为什么?合并完全在分支的相同状态和完全相同的提交(以前是主的HEAD)完成,合并提交包括冲突解决,为什么冲突?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

交互式rebase仍然必须执行合并。它不能只采用原始合并的树,因为(据他所知)你正在进行其他更改以改变合并结果。

由于你实际上正在更改树,只有消息,git附带的命令可以执行你想要的 1 git filter-branch。 / p>

您想要的过滤器是"消息过滤器" (--msg-filter)。棘手的部分是提出一个过滤器,它只影响你想要影响的提交。没有一种方法可以做到这一点,但一种选择是编写一个shell脚本,检查$GIT_COMMIT对一组" new"消息,如:

#! /bin/sh
new_msg_dir=/absolute/path  # we don't know $cwd during a msg-filter
if [ -f "$new_msg_dir/$GIT_COMMIT" ]; then
    cat "$new_msg_dir/$GIT_COMMIT"
else
    cat
fi

自动执行将stdin内容(原始消息)替换为文件内容(来自commit-ID指定的文件)的作业,当且仅当有替换消息时才会这样做。

显然这都是未经测试的。

1 好吧,几乎你想要的。加上比你想要的更多,这使得它非常有趣 2 来编写脚本以完全按照自己的意愿行事。

2 或其他一些词。