【问题标题】:git: changing an old commit message without creating conflictsgit:更改旧的提交消息而不产生冲突
【发布时间】:2014-05-24 11:42:33
【问题描述】:

我想使用以下方法更改一个非常旧的提交消息:

git rebase -i sha1-of-commit^

这很好,我会 git commit --amend 并编辑消息,但是当我这样做时事情变得很糟糕:

git rebase --continue

我遇到了多个冲突,但不明白为什么整个冲突解决方案显然已经在过去完成了,git 应该继续前进,直到所有提交都被重新设置。

如何在不处理这些旧冲突的情况下快速完成变基?毕竟我只想更改一个简单(和旧)的提交消息......

【问题讨论】:

  • 您的历史记录中是否有任何合并? git rebase 默认不包括合并提交。即使使用--preserve-merges 选项,当它尝试重新合并时,它也会忽略您之前的合并分辨率。
  • @JosephK.Strauss 谢谢,你有解决方法吗?
  • 我相信git filter-branch 会做你想做的事,如果你使用msg-filter,但你必须过滤整个分支,但是构造命令只更改一个指定提交的消息.今天晚些时候我可能会留下更好的答案。

标签: git conflict git-rebase


【解决方案1】:

在您的/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/'

【讨论】:

  • 谢谢。 == 与测试一起使用时是什么意思,因为它是not standard
  • 糟糕。它在我的 Windows Git bash 中工作;我想我是在 Java 模式下思考的。
  • 我必须将 echo $MESSAGE 更改为 echo \"$MESSAGE\" 才能使其正常工作。你为我节省了很多时间!谢谢!
  • 为我节省了数小时的头痛,非常感谢!
猜你喜欢
  • 2021-02-06
  • 2010-12-25
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 2014-07-12
  • 2020-07-22
  • 2011-12-19
相关资源
最近更新 更多