拉动时重写提交消息
rewrite commit message when pulling
我正在将多个存储库合并为一个。为此,我添加了每个原始回购 git add ...
,然后我 运行 git pull --no-edit --quiet --allow-unrelated-histories ...
我的问题是是否可以同时重写提交消息,以便我可以为提交主题添加标签或为提交主体添加尾部。
编辑:
澄清一下,我想用更改重写所有提交消息,而不是 pull
的合并消息
任何提交的任何部分都不能更改,所以从这个意义上说,答案是否定的。
git pull
命令实质上由 运行 git fetch
后跟 git merge
或 git rebase
组成。 rebase 命令通过 copying 现有提交到新的(和不同的,并且可能是改进的)提交来工作,所以从这个意义上说,有一种方法可以得到你想要的东西。但是 git pull
运行的 rebase 仅复制 your 提交,而不是获取的提交;您似乎想将获取的提交复制到 new-and-improved 提交,具有不同的哈希 ID。
为此,您必须将操作分开。停止使用 git pull
。 运行:
git fetch
,获取新的提交;然后
- 您选择的将这些复制到 new-and-improved 提交的方法;然后
git merge
,如果需要,或 需要的任何其他命令(可能 none)。
作为一般规则,每当您尝试做一些花哨的事情时,关于如何让 git pull
做到这一点的问题的答案就是“停止使用 git pull
”。想一想 git pull
的作用,并将其分解为有用的部分和无用的部分:通常 fetch
有用,有时第二个命令有用,但通常你想要在两者之间插入一些东西。
拉取提交时不能更改提交消息。
设计一定是不可能的。当您更改提交消息时,此提交的哈希值也会更改。仅在提交消息上不同的两个相同提交将具有不同的哈希值。所以 git 始终将此类提交视为两个不同的提交。
pull
应该将远程存储库中的更改合并到您的本地存储库中。如果您在拉取过程中重写提交消息,它将更改这些提交的哈希值。从 git 的角度来看,您最终会在本地存储库中获得另一个历史记录。说明合并没完成,你再拉一下。
因此,您无法在拉取提交时更改提交消息。但是您可以在拉取后重写提交消息。您可以使用 git filter-branch 和 --msg-filter
选项来重写提交消息。
我建议您按照下一个顺序进行:
- 从一个存储库中提取提交
- 使用
git filter-branch
重写来自此存储库的提交。 (这一次,您的历史记录中只有 "#nnn" 这样的链接,因此您可以轻松地将它们更改为 ""#nnn" ])
- 从下一个存储库中提取提交,然后重写这些提交(这次,来自先前存储库的链接已经处理,因此您可以将它们与来自当前存储库的链接分开)
我正在将多个存储库合并为一个。为此,我添加了每个原始回购 git add ...
,然后我 运行 git pull --no-edit --quiet --allow-unrelated-histories ...
我的问题是是否可以同时重写提交消息,以便我可以为提交主题添加标签或为提交主体添加尾部。
编辑: 澄清一下,我想用更改重写所有提交消息,而不是 pull
的合并消息任何提交的任何部分都不能更改,所以从这个意义上说,答案是否定的。
git pull
命令实质上由 运行 git fetch
后跟 git merge
或 git rebase
组成。 rebase 命令通过 copying 现有提交到新的(和不同的,并且可能是改进的)提交来工作,所以从这个意义上说,有一种方法可以得到你想要的东西。但是 git pull
运行的 rebase 仅复制 your 提交,而不是获取的提交;您似乎想将获取的提交复制到 new-and-improved 提交,具有不同的哈希 ID。
为此,您必须将操作分开。停止使用 git pull
。 运行:
git fetch
,获取新的提交;然后- 您选择的将这些复制到 new-and-improved 提交的方法;然后
git merge
,如果需要,或 需要的任何其他命令(可能 none)。
作为一般规则,每当您尝试做一些花哨的事情时,关于如何让 git pull
做到这一点的问题的答案就是“停止使用 git pull
”。想一想 git pull
的作用,并将其分解为有用的部分和无用的部分:通常 fetch
有用,有时第二个命令有用,但通常你想要在两者之间插入一些东西。
拉取提交时不能更改提交消息。
设计一定是不可能的。当您更改提交消息时,此提交的哈希值也会更改。仅在提交消息上不同的两个相同提交将具有不同的哈希值。所以 git 始终将此类提交视为两个不同的提交。
pull
应该将远程存储库中的更改合并到您的本地存储库中。如果您在拉取过程中重写提交消息,它将更改这些提交的哈希值。从 git 的角度来看,您最终会在本地存储库中获得另一个历史记录。说明合并没完成,你再拉一下。
因此,您无法在拉取提交时更改提交消息。但是您可以在拉取后重写提交消息。您可以使用 git filter-branch 和 --msg-filter
选项来重写提交消息。
我建议您按照下一个顺序进行:
- 从一个存储库中提取提交
- 使用
git filter-branch
重写来自此存储库的提交。 (这一次,您的历史记录中只有 "#nnn" 这样的链接,因此您可以轻松地将它们更改为 ""#nnn" ]) - 从下一个存储库中提取提交,然后重写这些提交(这次,来自先前存储库的链接已经处理,因此您可以将它们与来自当前存储库的链接分开)