锐湃头像

Git 提交哈希与 Gerrit 同一 Change 更新指南

一、提交哈希(Commit SHA)是什么

每个 commit 都有一个唯一的 SHA-1 哈希(40 位十六进制)。平时常用的是「短形式」——取前 8 位,例如 3c7388df、2c090646。只要在本仓库内不产生歧义,短形式就能当完整哈希来用。

二、如何得到 3c7388df 和 2c090646

1. 查看提交历史

git log --oneline

当时输出(取前几条):

2c090646  灵动岛三应用占满时更高优先级应用进入动效:...        # 动效 commit(当时的 HEAD)
3c7388df  恢复 MainActivity 测试界面「显示仪表报警」按钮:...  # 调试按钮 commit(引入 bug)
90f03b1d  灵动岛三个应用占满时高优先级导航进入崩溃:...        # NPE 修复
0afa2fee  灵动岛三应用删除低优先级退出动效优化:...

--oneline 把每个 commit 显示成 短SHA + 提交标题 一行,2c090646、3c7388df 就是这两行的 SHA。

2. 定位哪个 commit 改了某个文件(找 bug 来源)

因为编译报错在 MainActivity.kt,看这个文件的提交历史:

git log --oneline -- app/src/main/java/com/autolink/dynamiclsland/MainActivity.kt

结果第一行就是 3c7388df(恢复「显示仪表报警」按钮那次),说明是它改了 MainActivity.kt 引入了那个按钮。

3. 确认某次提交改了什么

git show 3c7388df

diff 里正是那三行 R.drawable.instrument_ebdfailsts_img / R.string.fault_msg_21101,坐实了 bug 来源。

4. 常用定位命令速查

目的命令
看某文件每行是谁改的git blame <文件>
看某次提交改了啥git show <SHA>
看完整提交历史(含 message / Change-Id)git log
搜哪个提交加了某串代码git log -S "instrument_ebdfailsts_img" --oneline

三、Gerrit 同一 Change 更新原理

  • Gerrit 用提交信息里的 Change-Id 脚注(由 .git/hooks/commit-msg 自动生成)来标识一个 change。
  • 同一个 Change-Id 再次 push = 在同一个 change 上新增 patchset(覆盖更新)。
  • 不同 Change-Id = 新建一个 change。
  • 所以「把修复并入同一个 change」的关键是:保持原提交的 Change-Id 不变(用 --amend 或 cherry-pick 都会保留 Change-Id)。

四、把修复并入同一 Change 的完整命令

(说明:3c7388df 是引入 bug 的提交,2c090646 是它上面的动效提交)

# 1. 把工作区的修复暂存并提交成一个临时提交
git add app/src/main/res/values/strings.xml \
        app/src/main/res/drawable-nodpi/ \
        app/src/main/java/com/autolink/dynamiclsland/MainActivity.kt
git commit -m "tmp fix"

# 2. 切到引入 bug 的提交
git checkout 3c7388df

# 3. 把修复内容以「暂存但不提交」的方式拿过来
git cherry-pick --no-commit <tmp-fix-SHA>

# 4. 把修复并入 3c7388df 本身(amend 保留 Change-Id)
git commit --amend --no-edit

# 5. 把上面的动效提交重新放到它之上
git cherry-pick 2c090646

# 6. 让分支指向新 HEAD 并切回
git branch -f al_chery-t1ya_8255_dev HEAD
git checkout al_chery-t1ya_8255_dev

踩坑记录:git cherry-pick 没有 -q 选项,误加会打印 usage 并以非零退出、丢掉提交。重放动效提交时用 git cherry-pick 2c090646(不带 -q)。

也可以用 git stash 替代临时提交:

git stash
git checkout 3c7388df
git cherry-pick --no-commit <tmp-fix-SHA>   # 或 git stash pop 后再 add
git commit --amend --no-edit
git cherry-pick 2c090646
git branch -f al_chery-t1ya_8255_dev HEAD
git checkout al_chery-t1ya_8255_dev

五、推送到 Gerrit(带评审人)

git push origin HEAD:refs/for/al_chery-t1ya_8255_dev%r=zhanghao1@auto-link.com.cn,r=xueyuanyuan@auto-link.com.cn,r=liang.han@landmark-phb.com
  • HEAD:refs/for/<分支>:推送到该分支的 Gerrit 评审队列(不是直接推到分支)。
  • %r=邮箱1,r=邮箱2,...:指定评审人。
  • 因为 Change-Id 没变,Gerrit 会在同一个 change 上更新成新 patchset(返回 updated: 2)。

六、关键点总结

  • 提交哈希 = git log --oneline 输出的短 SHA。
  • 定位 bug 提交:git log --oneline -- <文件> / git blame / git log -S "代码"。
  • Gerrit 同一 change = 保持 Change-Id 不变。
  • 用 --amend 改历史提交、cherry-pick 重放后续提交,可把修复折进中间某个提交。
  • 短 SHA 能直接 checkout / cherry-pick,是因为对象还在本地 reflog 里没被回收;换机器或已 push 则需先 git fetch。

在此记录一下

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/chuyouyinghe/article/details/169553625

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--