引言
修改最近一次提交信息
是 Git 工作流程中的一个灵活机制,旨在应对开发过程中出现的提交信息错误、遗漏或需要即时调整的情况。这一操作的应用场景虽相对特定,却对保持代码库历史的准确性和可读性至关重要。
操作步骤
要修改最近一次Git提交的信息(包括提交消息和可能需要更改的文件内容),并且这些更改也应反映在远程仓库上,可以按照以下步骤进行操作:
步骤1:修改最近一次提交的消息
-
确保你当前位于想要修改提交信息的本地分支上。
-
使用
git commit --amend
命令来修改最近一次提交的消息。这会打开一个编辑器(根据你的系统配置),允许你修改提交消息。保存并关闭编辑器以提交更改。
bash
git commit --amend
如果你想直接指定新的提交消息,可以使用 -m
参数,此时不会打开编辑器,来修改信息:
bash
git commit --amend -m "New commit message"
步骤2:推送更改到远程仓库
由于你已经修改了提交历史(即改变了最近一次提交的哈希),直接使用 git push
会导致冲突,因为远程仓库仍然保留着原来的提交。此时,需要使用 --force
或 --force-with-lease
参数强制推送,以覆盖远程仓库的相应提交。
方法一:使用 --force
(慎用)
bash
git push --force origin <your_branch_name>
注意: 使用
--force
会强制更新远程分支,使其与你的本地分支状态完全一致。这意味着如果你或他人在此期间有其他提交到远程,它们将被你的这次推送覆盖。因此,除非你确信没有其他人在此期间推送到该分支,否则应谨慎使用--force
。
方法二:使用 --force-with-lease
(推荐)
bash
git push --force-with-lease origin <your_branch_name>
推荐理由: --force-with-lease
提供了一种更安全的强制推送方式。它会在推送前检查远程分支的状态是否与你预期的一致。如果远程分支在你上次拉取后有其他人的新提交,推送会失败,从而避免意外覆盖他人的工作。在多人协作的环境中,--force-with-lease
是一个更好的选择。
操作步骤总结
修改最近一次Git提交信息并推送到远程仓库的流程如下:
- 修改提交消息:
git commit --amend
或git commit --amend -m "New commit message"
- 强制推送更改到远程:
git push --force-with-lease origin <your_branch_name>
请确保在执行强制推送操作前,与你的团队成员沟通,告知他们你将修改最近的提交,以避免产生不必要的冲突或丢失他人的工作。在多人协作的项目中,修改已公开的历史提交通常应尽量避免,除非确实必要且团队成员达成共识。
应用实践及注意事项
场景一:修改本地分支最近一次提交信息,切记此时没有提交到远程分支。
1.查看下本地分支的日志信息:
bash
$ 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.修改文件,然后往本地分支提交信息:
bash
# 查看本地分支状态
$ 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
:
bash
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
参数,此时会打开编辑器,来修改提交信息内容:
bash
$ git commit --amend
[master 665763e] add: user2增加了参与贡献区域的内容
Date: Tue Apr 2 10:47:10 2024 +0800
1 file changed, 2 insertions(+)
5.查看第一次修改的提交信息后的日志信息,发现没有新增一条提交信息,而是修改了hash值
:
bash
$ 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
参数,此时不会打开编辑器,输入提交信息,而是直接在参数后跟上提交信息:
bash
$ 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值
,
bash
$ 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
(慎用),不会导致新增记录,会覆盖最近一条的记录。
- 查看下提交记录日志信息,此时最近一次记录hash值是
0c8dc7d
:
bash
$ 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
:
bash
$ 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
提交记录信息到远程分支上:
bash
$ 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值和提交信息内容
:
bash
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
:
bash
$ 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
提交记录信息到远程分支上:
bash
$ 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值和提交信息内容
:
bash
$ 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
:
bash
$ git log --oneline
f67f077 (HEAD -> master, origin/master, origin/HEAD) add: user2新增了参与贡献区域的内容
d63ca18 fix: user2看来是真的还原了特技区域的第六项内容
18e8c42 fix:特技区域的第六项内容真的是user2操作的吗
- 修改最近一条提交信息,此时的记录hash值是
a9396fe
:
bash
$ 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
进行更新:
bash
$ 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
- 使用
git pull
把远程分支和当前分支进行集成, 然后使用git push
提交到远程分支
bash
$ 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.查看提交记录的日志信息:
bash
$ 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
,感谢您的关注~