如何提交单个Commit用于评审,同时在本地保留多Commit历史?
解决方案:本地保留Gerrit Patch Set历史的两种方法
方法一:用本地分支追踪每个Patch Set
每次提交新Patch Set时,不直接amend原Commit,而是用本地分支单独记录每个版本,既满足Gerrit的Change-Id要求,又能在本地留存完整改动轨迹:
- 首次提交并推送到Gerrit:
git add . git commit -m "fix: 修复XX问题" # Gerrit钩子会自动生成Change-Id git push origin HEAD:refs/for/master - 收到评审意见需修改时,先给当前版本创建分支存档:
git branch patch-set-1 HEAD - 回到工作分支做修改,amend时保留原Change-Id后推送:
# 完成代码修改 git add . git commit --amend # 不要修改Commit信息里的Change-Id git push origin HEAD:refs/for/master - 后续每一轮修改都重复步骤2-3,用不同分支名(如
patch-set-2、patch-set-3)区分版本,本地可随时切换分支查看或对比:git checkout patch-set-1 # 查看第一版改动 git diff patch-set-1 patch-set-2 # 对比两版差异
方法二:用git reflog找回历史版本
即使使用git commit --amend,本地被覆盖的Commit也会被reflog记录,可通过它回溯各阶段版本:
- 查看本地HEAD变动日志:
输出会包含类似记录:git reflogabc1234 HEAD@{0}: commit (amend): fix: 修复XX问题(第二版) def5678 HEAD@{1}: commit: fix: 修复XX问题(第一版) - 用哈希值创建分支或直接查看内容:
git branch patch-set-1 def5678 # 把旧版本保存到分支 git show def5678 # 查看第一版Commit内容 git diff def5678 abc1234 # 对比两版差异
更优的Gerrit工作流推荐
结合Gerrit“一个问题对应一个Commit”的规则,推荐特性分支+临时分支存版本的工作流:
- 从master拉取最新代码,创建专属特性分支:
git checkout master git pull git branch feature/fix-xx-problem git checkout feature/fix-xx-problem - 首次提交并推送到Gerrit评审:
git add . git commit -m "fix: 修复XX问题" git push origin HEAD:refs/for/master - 收到评审意见后,用临时分支存档当前版本:
git branch ps/fix-xx-problem-1 HEAD - 在特性分支上修改代码,amend保留Change-Id后推送新Patch Set:
# 完成代码修改 git add . git commit --amend git push origin HEAD:refs/for/master - 评审通过后,将特性分支合并到master(或直接cherry-pick,契合Gerrit最终squash到master的规则):
之后可按需删除特性分支,或保留临时分支作为历史记录。git checkout master git pull git merge feature/fix-xx-problem git push origin master
内容的提问来源于stack exchange,提问作者user1283776
相关产品推荐
相关产品推荐

