git提交与gerrit代码审查细节

代码拉取和提交

  • 配置config文件
    1
    2
    3
    4
    5
    Host gerrit
    HostName 10.10.1.127
    Port 29418
    User 1016739
    IdentityFile ~/.ssh/id_ed25519
  • 克隆
    1
    git clone "ssh://gerrit/<project path>" my-project && cd my-project && f="$(git rev-parse --git-dir)/hooks/commit-msg"; curl -o "$f" http://10.10.1.127:30090/tools/hooks/commit-msg; chmod +x "$f"
  • 仅克隆某个分支到本地目录
    1
    git clone -b <分支名> --single-branch <仓库地址> <目标目录>

代码补充提交

1
2
git add .
git commit --amend --no-edit

一般用于以下情况,例如:

  • 未推送
    针对已修改的代码一般操作是git add然后git commit,此时这个提交的功能又有需要补充修改的,但又不想再次创建一个新的提交。

  • 审核被废弃
    废弃后就不在待审核列表了,本地可以保留原提交信息,仅更改需要更改的,或者git reset HEAD^

  • 审核被打回
    打回的提交就不会被合并,本地需要修改问题,按上述指令再次提交;审查人可以看提交明细中的最新版本,若已修改完毕,则可以+2通过,执行合并。

若要修改更早的未合并的提交

git commit --amend 只能修改最近的一次提交(即 HEAD 指向的提交),不能用于修改之前的某个提交。

为什么 --amend 不能修改更早的提交?

git commit --amend 的作用是:

  • 替换最近一次提交(HEAD),
  • 使用你当前暂存区的内容(如果有修改)和新的提交信息(如果指定),
  • 生成一个新的提交,其父提交是原提交的父提交。

由于 Git 的提交历史是链式结构,修改一个中间的提交会改变其哈希值,从而导致后续所有提交的父哈希不一致,破坏了历史的连续性。因此 Git 不允许直接“原地修改”一个非最新的提交。


如果你想修改之前的某个提交,应该使用:

git rebase -i(交互式变基)

这是最常用的方法。

步骤示例:

  1. 找到你想修改的提交之前的提交(比如你想修改倒数第3个提交):

    1
    git rebase -i HEAD~3

    这会打开编辑器,列出最近3次提交,从最旧到最新。

  2. 在编辑器中,将你想修改的提交前的 pick 改为 edit(或 e):

    1
    2
    3
    edit abc1234 Add feature X
    pick def5678 Fix bug Y
    pick xyz9012 Update docs
  3. 保存并退出,Git 会在 abc1234 提交后暂停。

  4. 此时你可以:

    • 修改文件,
    • git add 相关更改。
  5. 完成修改后,执行:

    1
    git commit --amend

    (这时 --amend 是合法的,因为 HEAD 正好停在你要改的提交上)

  6. 然后继续变基:

    1
    git rebase --continue

Git 会重新应用后续的提交,形成新的历史。


⚠️ 注意事项:

  • rebase -i重写提交历史。如果这些提交已经推送到共享仓库,重写历史会导致协作者出现问题。
  • 在重写历史前,建议备份分支:git branch backup-branch-name

总结

情况 命令
修改最近一次提交 git commit --amend
修改之前的某个提交 git rebase -i + git commit --amend
直接用 --amend 改旧提交 ❌ 不可能

所以,想改旧提交?用 git rebase -i 是正道。