我有一个分支,我想更改一堆提交消息。我不在乎重写历史。分支有很多变化,所以在master之上对它进行重新定位是不切实际的(很多提交都有很多冲突,解决它需要几周的时间)。
我想要的是(鉴于迄今为止的历史是一致的并且合并是从master使用的)基本上是挑选在分支上完成的所有提交和合并,并按顺序,偶尔修改提交消息。基本上从头开始重新创建并强行推动。
我认为git rebase --interactive --preserve-merges(first commit)^会做到这一点;但是,当完成此操作时,重做合并时仍会遇到冲突。这是为什么?合并完全在分支的相同状态和完全相同的提交(以前是主的HEAD)完成,合并提交包括冲突解决,为什么冲突?我错过了什么吗?
答案 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 或其他一些词。