无需切换分支或修改工作区,如何复制Git提交并复用提交信息?
Git提交复制问题解决方案
当前处于foo分支的提交123456上,需要向bar分支添加一个内容与123456完全一致的新提交(不使用变基,仅基于相同快照创建),针对你提出的两个问题,解决方案如下:
问题1:无需离开foo分支或修改工作区的实现方式
可以使用git commit-tree命令直接创建提交,全程无需切换分支或改动工作区。该命令能基于指定的文件快照(树对象)和父提交生成新提交,再通过git update-ref更新bar分支的指向。
具体命令:
git update-ref refs/heads/bar $(git commit-tree 123456^{tree} -p bar)
命令说明:
123456^{tree}:获取提交123456对应的文件快照(树对象)-p bar:指定新提交的父提交为bar分支当前的顶端提交git commit-tree会输出新提交的哈希值,git update-ref则将bar分支直接指向这个新哈希
问题2:自动复制123456提交信息的简洁方法
通过git log提取目标提交的完整信息,再传递给git commit-tree,就能自动复用原提交信息,无需手动复制。
结合问题1的命令,修改后完整命令如下:
git update-ref refs/heads/bar $(git commit-tree 123456^{tree} -p bar -F <(git log --format=%B -n 1 123456))
命令说明:
git log --format=%B -n 1 123456:提取123456提交的完整信息(包含标题和正文)<(...):将命令输出作为临时文件传递给-F参数,-F表示从文件读取提交信息- 若仅需复用提交标题,可将
--format=%B替换为--format=%s
也可以拆分为两步执行,更直观:
# 创建带原提交信息的新提交,获取其哈希值 NEW_COMMIT=$(git commit-tree 123456^{tree} -p bar -F <(git log --format=%B -n 1 123456)) # 更新bar分支指向新提交 git update-ref refs/heads/bar $NEW_COMMIT
内容的提问来源于stack exchange,提问作者joshlf
相关产品推荐
相关产品推荐

