Gerrit 通过Change-Id来识别一个“逻辑变更”(Change),而不是Commit-Id。只要你保留原来的 Change-Id,amend 提交(即--amend),不生成新的 Change-Id,Gerrit 就会把这次修改当作原 Change 的新 Patch Set,而不是新 Change。
问题1:
一笔提交,已经远端推送过一次,因为CR出问题被打回来了。我在本地通过git reflog 查看操作日志,git reset soft xx 回滚后,重新提交,但是由于 commitid 变更,导致页面更新。新的提交不在原来提交的页面。
解答:
不是同一笔提交了,没有被当做新的 Patch Set,被当成了新的 Change。尽量不要reset --soft或reset --hard,而是直接git commit --amend修改最后一次提交。
回滚后修改代码使用git reset --soft <原提交ID>回退后,修改代码解决 CR 问题。
git reset —soft HEAD~1 # 回退到上一次提交(保留修改)- 重新提交时保留 Change-Id
必须确保新提交消息中包含原 Change-Id(即I6bfc6ce6b5cedc0a6e4d28c55dd3302aa04aa882):
git commit -m "【Lite6.66】【ads-search-offline-135438】修复视频max页面响应夜间模式的问题
Change-Id: I6bfc6ce6b5cedc0a6e4d28c55dd3302aa04aa882" # 手动复制原 Change-Id推送后,相同的 Change-Id 自动关联到原评审任务:
关键原理说明
- Change-Id 是 Gerrit 的跟踪标识
Gerrit 通过提交消息中的Change-Id: Ixxx字段关联同一变更的不同补丁集(Patch Set)。只要新提交保留原 Change-Id,就会出现在原评审页面。 git reset --soft不会清除 Change-Id
回滚后重新提交时,如果提交消息模板仍包含原 Change-Id(默认行为),则无需手动添加。若提交消息被覆盖,需手动复制原 Change-Id。
问题2:
- 你已提交了一个 change(即 push 到
refs/for/xxx); - 在 Gerrit 页面上点击了 “废弃”(Abandon)该提交;
- 然后你在本地 没有做任何修改,直接重新
git push origin HEAD:refs/for/xxx; - 结果提示:
! [remote rejected] HEAD -> refs/for/xxx (no new changes)
解答:
原因分析
Gerrit 的核心机制是:只有当新的 commit 的 SHA-1 与之前所有提交都不同时,才认为是“新变更”。
当你“废弃”一个提交后:
- 该 commit 仍然存在于 Gerrit 的 Git 仓库中(只是状态变为 Abandoned);
- 如果你本地的 HEAD 仍然是那个被废弃的 commit(即没有新建 commit、没有 amend、没有 rebase),那么再次 push 相同的 commit,Gerrit 会认为:“这个 change 我已经见过,且没有新内容”,于是拒绝并报
no new changes。
**Gerrit 不允许重复推送完全相同的 commit 到 **
refs/for/*,即使它已被废弃。
解决方案
创建一个新的 commit(哪怕内容完全一样,但 commit ID 必须不同)。
按照标准的 Gerrit 规则,这个时候就已经可以提交了。百度有一些自定义的规则,可能还是会导致无法提交,如下。
! [remote rejected] HEAD -> refs/for/ad/v15.49/FEEDADS-21199/ref%topic=678cc96c-51f7-4b97-b89e-41947801e52f (commit count: 1, latest commit: 239877d. CHECK_FAIL
HCK_F400
==>
** [ERROR] 下列commit对应评审已废弃或已合入 (原因分析详见 https://dwz.cn/ushdMKjn ):
评审号: 119617407, commit: 239877d, 已废弃
[ 请使用以下命令重新提交 ]:
git fetch
git reset --soft origin/ad/v15.49/FEEDADS-21199/ref
git commit -m "您的commit提交说明"
git push origin HEAD:refs/for/ad/v15.49/FEEDADS-21199/ref
重提新评审后,对于存在问题的评审,可酌情废弃
原因是即使用了git commit —amend,但你的新 commit 仍然基于那个已被废弃的 commit(239877d)作为父提交(parent),或者你的本地分支历史中仍包含这个被废弃的 commit,导致系统检测到“关联了已废弃变更”,从而拒绝推送。
不允许新提交的 祖先(ancestor)中包含已被废弃/合入的 commit
解决方案:
# 1. 拉取最新远程分支(确保 origin/ad/v15.49/FEEDADS-21199/ref 是干净的基线)
git fetch
# 2. 软重置到远程分支的最新状态(丢弃本地所有提交,但保留工作区代码)
git reset --soft origin/ad/v15.49/FEEDADS-21199/ref
# 3. 重新提交(注意:不要用 --amend!要全新 commit)
git commit -m "你的提交说明(务必写清楚)"
# 4. 推送
git push origin HEAD:refs/for/ad/v15.49/FEEDADS-21199/ref更新: 2026-01-23 18:00:00
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/wweukkyuxla8h6er