我可以重新向 git 合并添加消息吗?



我刚刚在 git 上做了一个分支合并,以更新我(据称)特定代码运行的冻结分支。因为我是个白痴,我忘了在cmd行上添加"-m消息"(所以习惯于git提交提示)。即我做到了:

git checkout frozenBranch
git merge liveBranch

当然,现在这意味着"frozenBranch"的最后一个提交消息是最新的"liveBranch"提交消息; 而我真正想要的是"frozenBranch"的最后一次提交,内容类似于"2019 年 2 月 8 日合并到 livebranch;这是用于传播 V2.1 数据发布的版本">

有没有办法追溯将日志消息添加到合并中?我可以看到如何为正常提交而不是合并编辑消息。

如果没有,我想我可以查看 frozenBranch,进行一些微不足道的更改,提交并重新合并,但这有点不优雅!

您可以修改上次提交消息(合并或不合并)

git commit --amend -m "New message"

如果你还没有推动,完美,你已经准备好了。如果你这样做了,你将不得不强制推送来更新旧的引用(请咨询你的同事)。

到目前为止,我得到的最好的方法是

  1. 将分支重置回合并前的提交,
    $ git reset --hard "${commit_before_merge}"
    
    然后
  2. 再次合并,这次关闭了快进:
    $ git merge --no-ff "${branch_you_merged_from)"
    

一个很酷的好处是,这只是在历史记录中添加了一个合并提交,它不会替换任何提交,因此您不必强制推送,也没有其他人必须处理您为他们破坏拉取。

因此,假设您刚刚将分支live-branch合并到frozen-branch中,并且快进了四(4)次提交。然后,您可以键入:

# Take your current branch four commits back:
$ git reset --hard HEAD~4
# Merge again, this time forcing a merge commit:
$ git merge --no-ff live-branch

提示和技巧

您可以使用git log查找快进的提交,然后获取哈希或计算它之前有多少次提交。

或者,如果您仍然有执行快进的git merge命令的输出,则它当前按如下所示启动:

$ git merge live-branch
Updating 0850cf3..491e984
Fast-forward

方便的是,第一个缩写的提交哈希是您要重置为的起始提交:

$ git reset --hard 0850cf3

如果您已经删除了合并的分支,则可以先从合并到的分支重新创建它:

git branch --delete live-branch  # oops
# no worries, since the merge was a fast-forward, you can
# remake the branch and it has exactly the same history:
git branch live-branch
# now do the steps described earlier:
git checkout HEAD~4
git merge --no-ff live-branch

如果您在本地删除了分支,但不是远程删除,您也可以像这样重新创建它:

git branch live-branch origin/live-branch

(此示例假定您使用的默认值是将远程存储库命名为origin,并且分支具有与本地远程相同的名称)。

如果您刚刚进行了合并(更准确地说,如果是最后一个 Git 操作更改了分支头所在的提交),则无需计算/记住合并的提交数 - 您只需使用HEAD@{1}来引用您在快进之前所在的提交:

git checkout HEAD@{1}
git merge --no-ff live-branch

更一般地说,正如您可以使用~NUMBER提交历史记录中返回NUMBER提交一样,您可以使用@{NUMBER}通过提交历史记录返回"移动">中的NUMBER提交。

因此,您可以使用git reflog找到要返回的正确运动。例如,如果您刚刚完成live-branch的工作,切换到frozen-branch,合并live-branch,切换到another-branch,意识到您不小心快进并想要添加该合并提交,然后返回frozen-branch,您的 reflog 可能会开始如下内容:

491e984 (HEAD -> frozen-branch, live-branch) HEAD@{0}: checkout: moving from another-branch to main
00ae7c3 (another-branch, origin/another-branch) HEAD@{1}: checkout: moving from main to another-branch
491e984 (HEAD -> frozen-branch, live-branch) HEAD@{2}: merge live-branch: Fast-forward
0850cf3 HEAD@{3}: checkout: moving from live-branch to frozen-branch
491e984 (HEAD -> frozen-branch, live-branch) HEAD@{4} commit: Add epic live-branch feature
d2ffe45 HEAD@{4} commit: Fix bug in live-branch

因此,在我们的示例中,您将查找位于(下)merge live-branch: Fast-forward之前的行,因为这是您在快进之前进行的提交 合并发生 - 在这种情况下,这是HEAD@{3}: checkout: moving from live-branch to frozen-branch行,因此您可以使用HEA@{3}.一旦您习惯阅读 reflog,它有时最终会比尝试计算合并的提交或找到正确的提交哈希更快、更容易。

当然,如果您还没有将快进合并推送到frozen-branch,重置会更容易:

git reset --hard origin/frozen-branch

(此示例假定您使用的默认设置是将远程存储库命名为origin)。

最新更新