一、提交哈希(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



