问题描述
我正在将多个存储库合并到一个。为此,我将每个原始存储库添加为git add ...
,然后运行git pull --no-edit --quiet --allow-unrelated-histories ...
我的问题是,是否可以同时重写提交消息,以便我可以在提交主题上添加标签,或者在提交主体上添加尾随。
编辑: 为了明确起见,我想重写所有带有更改的提交消息,而不是pull的合并消息
解决方法
任何提交的任何部分都无法更改,因此从这个意义上讲,答案是否定的。
git pull
命令实质上包括运行git fetch
,然后运行git merge
或git rebase
。 rebase命令通过将现有提交复制到新的(以及不同的,可能是经过改进的)提交来起作用,因此从这种意义上讲,有一种方法可以获取所需的内容。但是git pull
运行的基准只能复制您的提交,而不是已获取的提交。您似乎想将获取的提交复制到具有不同哈希ID的新的和改进的提交中。
为此,您必须分开操作。停止使用git pull
。运行:
-
git fetch
,以获得新的提交;然后
您选择的将那些复制到新的和改进的提交中的方法;然后
-
git merge
(如果需要),或者需要其他任何命令 (也许没有)。
作为一般规则,每当您尝试做一些花哨的事情时,关于如何使git pull
做到这一点的答案就是“停止使用git pull
”。 ?考虑一下git pull
的作用,然后将其分解为有用的部分和无效的部分:通常fetch
是有用的,有时第二个命令是有用的,但是通常希望在两者之间插入一些东西。
提取提交时,您无法更改提交消息。
设计上不可能做到这一点。当您更改提交消息时,此提交的哈希会更改。在git中,只有提交消息不同的两个相同的提交始终具有不同的哈希值。因此,git始终将此类提交视为两个不同的提交。
pull
假设将来自远程存储库的更改合并到本地存储库中。如果您在提取过程中重写提交消息,它将更改这些提交的哈希值。从git的角度来看,您将在本地仓库中获得另一个历史记录。这意味着合并尚未完成,您应该再次退出。
因此,您无法在提取提交时更改提交消息。但是您可以在提取后重写提交消息。您可以将git filter-branch与--msg-filter
选项一起使用来重写提交消息。
我建议您按下一个顺序进行操作:
- 从一个存储库中拉出提交
- 使用
git filter-branch
重写此存储库中的提交。 (这次,您的历史记录中只有诸如“#nnn” 之类的链接,因此您可以轻松地将其更改为“ first-repo-url / nnn” )) - 从下一个存储库中拉出提交,然后重写其提交(这次来自上一个存储库的链接已经处理,因此您可以将它们与当前存储库中的链接分开)