likes
comments
collection
share

无痕修复:优雅修改本地及远程Commit信息,保持项目历史整洁

作者站长头像
站长
· 阅读数 3

引言

修改最近一次提交信息 是 Git 工作流程中的一个灵活机制,旨在应对开发过程中出现的提交信息错误、遗漏或需要即时调整的情况。这一操作的应用场景虽相对特定,却对保持代码库历史的准确性和可读性至关重要。

操作步骤

要修改最近一次Git提交的信息(包括提交消息和可能需要更改的文件内容),并且这些更改也应反映在远程仓库上,可以按照以下步骤进行操作:

步骤1:修改最近一次提交的消息

  1. 确保你当前位于想要修改提交信息的本地分支上。

  2. 使用 git commit --amend 命令来修改最近一次提交的消息。这会打开一个编辑器(根据你的系统配置),允许你修改提交消息。保存并关闭编辑器以提交更改。

git commit --amend

如果你想直接指定新的提交消息,可以使用 -m 参数,此时不会打开编辑器,来修改信息

git commit --amend -m "New commit message"

步骤2:推送更改到远程仓库

由于你已经修改了提交历史(即改变了最近一次提交的哈希),直接使用 git push 会导致冲突,因为远程仓库仍然保留着原来的提交。此时,需要使用 --force--force-with-lease 参数强制推送,以覆盖远程仓库的相应提交。

方法一:使用 --force (慎用)

git push --force origin <your_branch_name>

注意: 使用 --force 会强制更新远程分支,使其与你的本地分支状态完全一致。这意味着如果你或他人在此期间有其他提交到远程,它们将被你的这次推送覆盖。因此,除非你确信没有其他人在此期间推送到该分支,否则应谨慎使用 --force

方法二:使用 --force-with-lease (推荐)

git push --force-with-lease origin <your_branch_name>

推荐理由: --force-with-lease 提供了一种更安全的强制推送方式。它会在推送前检查远程分支的状态是否与你预期的一致。如果远程分支在你上次拉取后有其他人的新提交,推送会失败,从而避免意外覆盖他人的工作。在多人协作的环境中,--force-with-lease 是一个更好的选择。

操作步骤总结

修改最近一次Git提交信息并推送到远程仓库的流程如下:

  1. 修改提交消息:git commit --amendgit commit --amend -m "New commit message"
  2. 强制推送更改到远程:git push --force-with-lease origin <your_branch_name>

请确保在执行强制推送操作前,与你的团队成员沟通,告知他们你将修改最近的提交,以避免产生不必要的冲突或丢失他人的工作。在多人协作的项目中,修改已公开的历史提交通常应尽量避免,除非确实必要且团队成员达成共识。

应用实践及注意事项

场景一:修改本地分支最近一次提交信息,切记此时没有提交到远程分支。

1.查看下本地分支的日志信息:

$ git log --oneline
d63ca18 (HEAD -> master, origin/master, origin/HEAD) fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
c635285 Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
eee0505 fix: user2还原了特技区域的第六项内容
....

2.修改文件,然后往本地分支提交信息:

# 查看本地分支状态
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

# 添加文件到暂存区
$ git add .

# 提交信息
$ git commit -m "add: user2修改文件"
[master 4b4f48b] add: user2修改文件
 1 file changed, 2 insertions(+)

3.查看刚刚提交到本地分支的日志信息,发现hash简短值是4b4f48b

4b4f48b (HEAD -> master) add: user2修改文件
d63ca18 (origin/master, origin/HEAD) fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
c635285 Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
......

4.第一次修改刚刚提交的信息,使用 --amend,不加 -m 参数,此时会打开编辑器,来修改提交信息内容:

$ git commit --amend
[master 665763e] add: user2增加了参与贡献区域的内容
 Date: Tue Apr 2 10:47:10 2024 +0800
 1 file changed, 2 insertions(+)

5.查看第一次修改的提交信息后的日志信息,发现没有新增一条提交信息,而是修改了hash值

$ git log --oneline
665763e (HEAD -> master) add: user2增加了参与贡献区域的内容
d63ca18 (origin/master, origin/HEAD) fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
c635285 Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
......

6.第二次修改提交信息,带上-m参数,此时不会打开编辑器,输入提交信息,而是直接在参数后跟上提交信息:

$ git commit --amend -m "add: user2增加了参与贡献区域的第九项内容"
[master 0c8dc7d] add: user2增加了参与贡献区域的第九项内容
 Date: Tue Apr 2 10:47:10 2024 +0800
 1 file changed, 2 insertions(+)

7.查看第二次修改的提交信息后的日志信息,发现没有新增一条提交信息,而是修改了hash值

$ git log --oneline
0c8dc7d (HEAD -> master) add: user2增加了参与贡献区域的第九项内容
d63ca18 (origin/master, origin/HEAD) fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
c635285 Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
......

注意:在本地分支上修改最近一次的提交信息,命令行中有无 -m 参数,提交的记录信息都不会新增多条记录。

场景二:修改远程分支上的最近一次提交信息

提交到远程时使用参数 --force-with-lease (推荐) 或者 使用 --force (慎用),不会导致新增记录,会覆盖最近一条的记录。

  1. 查看下提交记录日志信息,此时最近一次记录hash值是 0c8dc7d
$ git log --oneline
0c8dc7d (HEAD -> master) add: user2增加了参与贡献区域的第九项内容
d63ca18 (origin/master, origin/HEAD) fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
c635285 Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
......

2.第一次使用不带 -m 参数修改记录,此时记录hash值是 97d50ca

$ git commit --amend
[master 97d50ca] add: 参与贡献区域的第九项内容的内容是用户user1增加的
 Date: Tue Apr 2 10:47:10 2024 +0800
 1 file changed, 2 insertions(+)

3.使用 --force-with-lease 提交记录信息到远程分支上:

$ git push --force-with-lease origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 395 bytes | 131.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
To https://e.coding.net/love2157dream/gittest/git-test-demo.git
 + 0c8dc7d...97d50ca master -> master (forced update)

4.查看提交信息,没有新增记录信息,只是 修改了hash值和提交信息内容

97d50ca (HEAD -> master, origin/master, origin/HEAD) add: 参与贡献区域的第九项内容的内容是用户user1增加的
d63ca18 fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
c635285 Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
......

5.第二次使用带 -m 参数修改记录,此时记录hash值是 f67f077

$ git commit --amend -m "add: user2新增了参与贡献区域的内容"
[master f67f077] add: user2新增了参与贡献区域的内容
 Date: Tue Apr 2 10:47:10 2024 +0800
 1 file changed, 2 insertions(+)

6.同样是使用 --force-with-lease 提交记录信息到远程分支上:

$ git push --force-with-lease origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 372 bytes | 372.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
To https://e.coding.net/love2157dream/gittest/git-test-demo.git
 + 97d50ca...f67f077 master -> master (forced update)

7.查看提交信息,没有新增记录信息,只是 修改了hash值和提交信息内容

$ git log --oneline
f67f077 (HEAD -> master, origin/master, origin/HEAD) add: user2新增了参与贡献区域的内容
d63ca18 fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
c635285 Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
......

场景三:修改远程分支上的最近一次提交信息,直接使用 git push 提交

1.查看最近的提交记录日志信息,此时最近一条记录hash值是 f67f077

$ git log --oneline
f67f077 (HEAD -> master, origin/master, origin/HEAD) add: user2新增了参与贡献区域的内容
d63ca18 fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
  1. 修改最近一条提交信息,此时的记录hash值是 a9396fe
$ git commit --amend -m "add: user2在参与贡献区域新增了第九项内容"
[master a9396fe] add: user2在参与贡献区域新增了第九项内容
 Date: Tue Apr 2 10:47:10 2024 +0800
 1 file changed, 2 insertions(+)

3.查看此时的分支状态,提示本地分支和远程分支存在一次不同的提交记录,可以使用 git pull 进行更新:

$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" if you want to integrate the remote branch with yours)

nothing to commit, working tree clean
  1. 使用 git pull 把远程分支和当前分支进行集成, 然后使用 git push 提交到远程分支
$  git pull origin master 
From https://e.coding.net/love2157dream/gittest/git-test-demo
 * branch            master     -> FETCH_HEAD
Merge made by the 'ort' strategy.


$ git push origin master 
Enumerating objects: 2, done.
Counting objects: 100% (2/2), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 477 bytes | 477.00 KiB/s, done.
Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
To https://e.coding.net/love2157dream/gittest/git-test-demo.git
   f67f077..ddb8221  master -> master

5.查看提交记录的日志信息:

$ git log --oneline
ddb8221 (HEAD -> master, origin/master, origin/HEAD) Merge branch 'master' of https://e.coding.net/love2157dream/gittest/git-test-demo
a9396fe add: user2在参与贡献区域新增了第九项内容
f67f077 add: user2新增了参与贡献区域的内容
d63ca18 fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
......

总结: 从提交记录信息上看,修改远程分支上最近一次提交信息的内容,直接使用 git push 提交远程分支时,会新增两条分支的记录,一条是修改后提交记录a9396fe, 一条是合并分支的记录ddb8221,这样会让提交记录变得冗余,因此推荐使用 --force-with-lease 提交远程记录。

写在最后

总之,修改最近一次提交信息 是一种适时修正、完善代码提交历史的有效手段,它强化了版本控制的严谨性,促进了团队沟通与协作效率,确保代码仓库始终保持高质量的文档标准。

喜欢的话帮忙点个赞 + 关注吧,将持续更新 Git 相关的文章,还可以关注我的公众号 梁三石FE ,感谢您的关注~