2.3 修改 Git 历史记录之 git commit ‐‐amend 学习 - hust-open-atom-club/TranslateProject GitHub Wiki

HCTT 项目审核 PR(Pull Request)的时候,经常会发现一些同学在解决 comments 的时候都是通过追加一个新的 git commit 来完成,鲜少有同学直接修改 PR 中的 Git 历史提交来完成。这时候有同学就要问了,我们为什么要这样做呢?因为这样从作者侧看到的 Git 提交记录非常干净。本文就将介绍一下如何使用 git comment --amend 来修改已经提交的 PR 中的最后一个 Git 历史提交。注意,git commit --amend 只能修改最后一个 Git 历史提交,如果需要某个中间的 Git 历史提交,那需要 git rebase。我们留到下次来讲述。

这里我将用自己 fork 的 mudongliang/TranslateProject 仓库,编写一个简单的 PR 来讲述,正好也趁着这个机会给大家介绍我的 Github 使用习惯(虽然不是最好,但是也值得大家借鉴)。

  1. 更新本地的 TranslateProject 到最新
git pull
  1. 切换到一个新的分支 translate_db_md 开始做翻译或修改文件
git checkout -b translate_db_md
  1. 根据 TranslateProject 的 Wiki 要求开始翻译,这样只是作为 demo,所以我仅作翻译请求的 PR。
---
status: translatig
title: "syz-db"
author: Syzkaller Community
collector: mudongliang
collected_date: 20240428
translating_date: 20240829
priority: 10
link: https://github.com/google/syzkaller/blob/master/docs/db.md
---

为了后续要做 PR 修改,我故意放了一个 typo - translatig,无法通过 CI 检查。

  1. 提交本地 commit,并推送到 Github 仓库
git add sources/syzkaller/db.md
git commit -m "request to translate syzkaller/db.md"

image

  1. 将本地分支提送到 mudongliang/TranslateProject Github 仓库
git push --set-upstream origin translate_db_md

是不是觉得这个命令好长,很难记?不用担心,git push 命令会给我们提示,或使用配置自动化这个工作。

image

  1. 下面我们按照 Wiki 中的步骤提交 PR,如下所示,

image

https://github.com/hust-open-atom-club/TranslateProject/pull/201

  1. 很快,上游仓库中 TranslateProject CI 会通知我们说,有一个测试没通过。此处要感谢俱乐部_常续本_同学为 HCTT 项目编写 CI。

image

image

  1. 接下来,在介绍如何修改 PR 中的 git 提交之前,我们简单说一下 git commit --amend 的两个功能
  • 修改最后一次提交的 log message;
  • 修改最后一次提交的文件修改;

我们这次将使用后者修改 PR status,详细见后续步骤。

  1. 修改 typo,并使用git add将该文件加入暂存区
git add sources/syzkaller/db.md
  1. 使用 git commit --amend 来修改之前的 git 提交记录,此时,本地的 git status 如下所示

image

  1. 最后,通过 git push -f 来更新 mudongliang/TranslateProject Github 仓库,此时 PR 会同步更新,如下所示,大家可以发现,PR 中此时还是只有 1 个 git commit。

image

  1. 上游 CI 观测到 PR 更新会重新开始检测,但是仍然有错误。我们只需要重复之前的操作,修改文件内容即可

image

  1. 最后我们添加了 translator 之后,CI 终于过了

image

image

结语:目前很多开源仓库(如 Syzkaller)都会要求 Git 仓库提交历史尽可能干净,所以大家需要掌握这个技能让自己在开源项目贡献中走得更远。