如何修改提交历史信息 ?

为了规范开发者提交格式,平台提供推送规则检查服务,支持自定义检查规则,对未推送的提交进行检查。

当启用了该服务,你可能会遇到因提交注释格式邮箱信息设置不规范或者代码属主不匹配而导致推送失败的问题,如何处理呢?

  • 代码属主检查不合规请参看文档 推送规则设置

  • 提交注释格式、邮箱信息设置不规范,请参看以下文档了解如何修正已提交的历史信息;

1.修改历史的「提交注释」

修改最后一次提交

如果仅仅只是修改最后一次提交的注释信息,那么很简单:

$ git commit --amend

这会把你带入文本编辑器,里面包含了最近一条提交信息供你修改。 当保存并关闭编辑器后,编辑器将会用你输入的内容替换最近一条提交信息。

修改多个提交信息

Git 自身没有一个改变历史工具,但是可以使用变基来修改一系列提交。

通过给git rebase增加-i选项来交互式地运行变基, 需指定想要重写多久远的历史。

例如,如果想要修改最近三次提交信息,将想修改的最近一次提交的父提交作为参数传递给git rebase -i命令,即 HEAD~2^ 或 HEAD~3。

$ git rebase -i HEAD~3

记住这是一个变基命令 - 在 HEAD~3..HEAD 范围内的每一个提交都会被重写,无论是否修改信息。使用该功能请勿涉及任何已经推送到远程服务器的提交,这样做会产生一个变更的两个版本,使他人困惑。

需要重点注意的是相对于正常使用的 log 命令,这些提交显示的顺序是相反的。 运行一次 log 命令,会看到类似以下内容:

$ git log --pretty=format:"%h %s" HEAD~3..HEAD 
a5f4a0d added cat-file 
310154e updated README formatting and added blame 
f7f3f6d changed my name a bit

交互式变基将会从命令行中指定的提交(HEAD~3)开始,从上到下的依次重演每一个提交引入的修改。

为了修改历史的提交注释,你可以把想修改的提交前面的 ‘pick’ 改为 ‘edit’。

例如,只想修改第三次提交信息,可以像下面这样修改文件:

edit f7f3f6d changed my name a bit 
pick 310154e updated README formatting and added blame 
pick a5f4a0d added cat-file

当保存并退出编辑器时,Git 将你带回到列表中的最后一次提交并提示以下信息:

$ git rebase -i HEAD~3 
Stopped at f7f3f6d... changed my name a bit 
You can amend the commit now, with
         git commit --amend  
Once you’re satisfied with your changes, run
         git rebase --continue

接下来根据提示输入:

$ git commit --amend

修改提交信息,然后退出编辑器,运行以下命令:

$ git rebase --continue

这个命令将会自动应用另外两个提交,本次变更就完成了。

如果需要一次修改多个提交注释,需要在每一个修改为 edit 的提交上重复这些步骤。

使用工具快速修改

工具安装及使用教程

git-filter-repo

2.修改历史的「提交作者」

修改最后一次提交作者

类似上方段落 1 的修改【提交注释】:

$ git commit --amend --reset-author

修改历史提交作者

通过给git rebase增加-i选项来交互式地运行变基, 需指定想要重写多久远的历史,同【提交注释】,对应修改命令如下:

$ git commit --amend --reset-author

3.修改历史的「提交邮箱」

使用工具快速修改

工具安装及使用教程

git-filter-repo

4.本地预设自检规则

为了避免修改历史的繁琐过程,我们建议你使用「Git 钩子」能力在本地预设pre-receive钩子进行期望的提交规则检查,提前识别不合规范的提交。

什么是Git 钩子(githooks)?

Git 支持基于特定动作发生时自动触发自定义脚本,客户端钩子由诸如提交和合并等操作所调用,服务器端钩子作用于诸如接收被推送的提交、更新分支等操作。 你可以随心所欲地运用这些钩子来预设检查。

如何安装钩子?

钩子被存储在 Git 目录下的hooks子目录中,即绝大部分项目的.git/hooks中。

当你用git init初始化一个新库时,Git 默认会在这个目录中放置一些示例脚本。这些脚本除了本身可以被调用外,它们还透露了被触发时所传入的参数。 所有的示例都是 shell 脚本,其中还混杂了 Perl 代码。任何正确命名的可执行脚本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它语言进行编写。 这些示例的名字都是以.sample结尾,如果想启用它们,请先移除这个后缀。

把一个正确命名且可执行的文件放入 Git 目录下的hooks子目录中,即可激活这个钩子脚本。

pre-receive 钩子

处理推送操作时,最先被调用的脚本是pre-receive。 它获取一系列被推送的提交。如果它以非零值退出,所有的推送内容都不被接受。

你可以在本地使用这个钩子对推送修改的所有提交预先进行规则检查,避免推送至远端时因为不合规而被拒绝的问题。

更多钩子说明,参见:Git-Git-钩子