【问题标题】:Git : edit commit message of other parentGit:编辑其他父级的提交消息
【发布时间】:2018-04-11 15:18:50
【问题描述】:

我必须编辑合并提交的父级的提交消息(父级实际上本身就是一个合并)。我该怎么做?

这里F是我当前的HEAD,E和D合并的结果。D本身就是A和C合并的结果,D是我需要编辑其消息的提交。

  ...A-D-F - branch where I work
      / /
...B-C-E   - master

git rebase -i D~ 仅显示来自 master 的提交以进行编辑 - E、C、B ...

没有一个被推送。有希望吗?

【问题讨论】:

  • 一种方法是使用git rebase --interactive <hash of D>~并将提交D标记为reword
  • 当然我试过了,但是在编辑器中 D 不存在......实际上只有来自主人的提交存在。
  • 您可能需要使用<hash of D>^2 来指定rebase 应该从D 的第二个父提交发生。见stackoverflow.com/a/2222920/3282436

标签: git git-merge git-amend


【解决方案1】:

默认情况下,rebase 尝试生成线性历史记录。此外,rebase 假定所有更改都在非合并提交中表示(除了冲突解决或“邪恶合并”,这应该是真的)。​​

有两个注意事项,您可以使用 --preserve-merges 选项说服 rebase 确认合并提交。需要注意的是:

1) rebase 仍然无法正确处理合并中所做的更改。它将尝试使用默认策略重新创建合并,并在必要时让您重新解决冲突。如果合并是使用 --no-commit 创建的,以便手动更改内容,即使它不会发生冲突,rebase 将默默地更改结果。

2) 将--preserve-merges-i 混合通常并不安全。在特定情况下,它是可以做到的,如果你小心地将你正在做的事情限制在需要做的事情上,这可能会起作用。

因此,您可以尝试使用--preserve-merges 进行变基并在 TODO 列表中更改 nothing,除了将 D 的命令设置为“reword”。

这将替换提交DF,因此如果其他引用指向它们中的任何一个,您也必须移动这些引用。但由于没有推送任何内容,因此重写应该不会引起任何其他重大问题。

还有其他方法可以进行重写,所以如果 --preserve-merges 不适合您(或者如果您只是不想弄乱它),您可以使用 git filter-branch 代替 @987654336 @。但是,这更难设置,因为您需要编写一个脚本来转换Ds 消息,同时传递任何其他提交的消息。见https://git-scm.com/docs/git-filter-branch

或者您可以手动重建历史记录。例如,如果您知道 DF 是不冲突的默认合并,您可以说

git checkout myBranch
git reset --hard HEAD~2
git merge master^
# enter the new commit message for D
git merge master
# re-enter the commit message for E

如果您不确定提交是非冲突的默认合并,您可以执行类似的操作

git checkout myBranch
git tag temp
git reset --hard HEAD~2
git merge --no-commit master^
rm -rf *
git checkout temp^ -- .
git add .
git commit -m"new commit message for D"
git merge --no-commit master
rm -rf *
git checkout temp -- .
git add .
git commit -m"commit message for F"

【讨论】:

  • --preserve-merges 归结为一件事:它改变了哈希值。另一个 repo 将此 repo 包含为子repo,并且在其最新提交时已经指向该哈希。这也是未推出的东西。如果你告诉我如何解决,我们就可以开始了!
  • @Charles:如果您更改消息,您将获得一个新的、不同的提交。这个新的和不同的提交将具有不同的哈希值。这是 Git 的基本属性:提交与所有 Git 对象一样,完全不可更改。您只能将它们复制到新的(略有不同的)对象并切换到使用新对象。因此,如果您有两个存储库,一个是另一个的子模块,您可以在子模块中重写(使用新散列获取新提交),然后在超级项目中重写(使用新子模块散列获取具有新散列的新提交)。否则你会被卡住。
  • ...我的问题是如何做到这一点(在超级项目中重写)。
猜你喜欢
  • 2011-11-27
  • 1970-01-01
  • 2011-11-08
  • 2011-04-25
  • 2018-11-10
  • 2011-11-30
  • 2012-06-05
  • 2012-04-26
  • 2013-01-16
相关资源
最近更新 更多