解决:Git报错same change IDs

当使用git review的时候,review失败,报错multi commit ...same change ids。。

错误: same Change-Id in multiple changes

意思是说,有多个commit记录的change ids是相同的,这change id概念出现在gerrit,每次commit之后,会自动生成一串数字。称为change id。

这种情况常常是,coder 发现第一次commit 有了问题,然后在本地解决好这个问题之后,进行 第二次的commit,然后,在cmmit msg 里写上 相同的changId(在最后一个段落)

然后无法push 到gerrit 的远程分支(比如 refs/for/your_branch)

gerrit 拒绝这个提交的原因是,如果两个commit 是相同的changeId, 那么gerrit 为了review 的简单,会禁止两次commit,因为你的commit 2 必然依赖 commit 1. 而且gerrit 一直推崇 **commit --amend **这种方式。

解决方法

删除重复的commit change id 对应的记录

复制代码
git reset --soft HEAD^

上条指令会自动删除前一次提交的commit记录,如果要删除多条记录

复制代码
git reset --soft HEAD~3

删除前三次记录

然后再重新提交commit

change id

参考文章:
理解 Gerrit 的 Change-Id-CSDN博客

要理解 Gerrit 的 Change-Id,我们就必须对"一次代码审查任务"有一个定义。通常,我们认为对一次完整的功能实现或 Bug 修复(即一次完整的变更)进行代码审查是合理的。而对一个半成品进行代码审查,得到的结论是不可靠的。因此,一次代码审查任务意味着是对一次变更进行审查。

Gerrit 使用 Change-Id 来标识一次变更。Change-Id 实际上就是一串字符串,类似这样:Ic8aaa0728a43936cd4c6e1ed590e01ba8f0fbf5b

但是,一次变更通常会伴随多次 Git 提交(Commit),而且每次提交的提交是不同的 Commit Id(提交Id)。Gerrit 如何将多次提交关联到同一个 Change-Id 呢?

我们需要在每次提交时,将 Change-Id 以规定的格式放在提交消息(Commit message)的Footer 部分中(最后一行)。如下图:

Change-Id 为避免与提交 Id 冲突,通常以大写字母I为前缀。但是,我们怎么才能方便生成 Change-Id 呢?

使用 Git 钩子生成 Change-Id

Change-Id 最好是自动生成,并放到提交消息指定位置,这样才能节约开发者的时间。Gerrit 提供了标准的"commit-msg"钩子来实现。

Git 提供了4个提交工作流钩子:pre-commit、prepare-commit-msg、commit-msg、post-commit。其中 commit-msg 钩子,会在我们执行 git commit 时被执行。

本质上,commit-msg 钩子是一段脚本程序,放在 .git/hooks 目录下。commit-msg 脚本可以使用 Shell、Ruby、Python 等语言实现。

Gerrit 的 commit-msg 钩子直接从 Gerrit 下载:

复制代码
## 在项目目录下

curl -Lo .git/hooks/commit-msg http://<gerrit服务地址>/tools/hooks/commit-msg

chmod u+x .git/hooks/commit-msg

接下来,在我们执行 git commit 后,再执行 git log 就可以看到 Change-Id 了。

请注意,第一次 clone 代码到本地时,需要重新安装一次 commit-msg 钩子。因为它并不会被提交到版本库中。

相关推荐
阿凡达蘑菇灯7 小时前
git安装--gitlab操作
git·gitlab
Mo_YuO.o7 小时前
工作区 暂存区 版本库
git·gitee·github
深念Y7 小时前
本地Git仓库推送到Gitee教程
git·gitee·github·仓库·项目·源代码管理·初始化
白云千载尽8 小时前
a800上gazebo无法使用gpu的问题修复
网络·git·github
凯酱11 小时前
git 拉取指定分支
git
Easonmax12 小时前
【鸿蒙pc命令行适配】tig(git命令行可视化)工具移植实战:解决ncurses库依赖、terminfo终端适配与环境配置全流程
git·华为·harmonyos
petunsecn14 小时前
多 GitHub 账号与多平台 Git 使用(附加场景:就想用指定账号clone)
git·github
yuanmenghao15 小时前
Git submodule 与 git-repo(Google 的 repo 工具) 在多仓库管理上的差异
git
木易双人青15 小时前
git常用命令
git
热忱112816 小时前
Git 全套常用命令手册(含日常开发示例)
大数据·git·elasticsearch·搜索引擎