临文乍了了,彻卷兀若无。这篇文章主要讲述#yyds干货盘点#Git学习-如何修改已经提交的记录相关的知识,希望能为你提供帮助。
前言平时开发经常会遇到手误,导致提交的描述信息不准确或者文件有误的情况,这时我们就可以采取必要的措施进行补救;
不同的场景有不同的补救措施,常见的场景有两种:
提交记录 | 远程仓库 | |
---|---|---|
场景一 | 最后一次提交 | 没有推到远程仓库 |
已经推到远程仓库 | ||
场景二 | 历史提交(非最后一次) | 没有推到远程仓库 |
已经推到远程仓库 |
目录
- 最后一次提交的记录有问题
- 历史提交的记录有问题(非最后一次)
- 推到远程仓库
项目的目录如下所示:
$ ls -a
./../.git/a.txt
这里我们修改a.txt的内容,然后提交到本地仓库,如下所示:
$ vim a.txt
$ git status
On branch 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:a.txt
$ git add a.txt
$ git commit -m "更新"
[master ff7bc85] 更新
1 file changed, 1 insertion(+), 1 deletion(-)
提交之后,我们发现之前的描述信息不完整,没有具体说明更新了啥东西;
这时我们就可以通过
git commit --amend
命令来修补:amend就是修补的意思$ git commit --amend -m "更新 a.txt"
[master 23f9682] 更新 a.txt
Date: Fri Jan 21 17:27:50 2022 +0800
1 file changed, 1 insertion(+), 1 deletion(-)
然后通过
git log
查看提交记录:$ git log
commit 23f9682e238e146eb2e09b82e27e5e692f3a0126 (HEAD ->
master)
Author: jalon***
Date:Fri Jan 21 17:27:50 2022 +0800更新 a.txt
可以看到,之前的
commit -m 更新
那条记录不见了,只有最新修补的记录,而且修补之后提交记录的时间还是上次的时间;2. 历史提交的记录有问题(非最后一次)
如果是前几次提交的记录有问题,那么就不能单纯地用上面的
--amend
进行修补了,此时需先用 git rebase
进行变基操作;git rebase 可以修改任意一次的提交记录,下面我们用实例来演示下;
我们先用git log看下当前的记录:
$ git log
commit 1e33018a3dcafbfe3443b1edba44045de274b0d8 (HEAD ->
master, origin/master)
Author: jalon2015 <
1121263265@qq.com>
Date:Fri Jan 21 17:46:15 2022 +08003commit 23f9682e238e146eb2e09b82e27e5e692f3a0126
Author: jalon2015 <
1121263265@qq.com>
Date:Fri Jan 21 17:27:50 2022 +0800更新 a.txtcommit 72c17db1e70b1399a35ae64c114112ae890d98e4 (dev)
Author: jalon2015 <
1121263265@qq.com>
Date:Wed Jan 19 15:56:10 2022 +0800update a.txt 2
可以看到,提交记录的描述信息不统一,有的英文,有的中文;
我们的目标是把倒数第二次(commit 23f96)的描述信息改为英文;
那我们就需要以它的前一次提交(commit 72c17)为基准,进行变基:
$ git rebase -i 72c17
这里我们用了
git rebase -i
表示进行交互式变基,运行后,显示如下图:文章图片
下面我们输入
i
切换到INSERT模式- 如果只是想要修改描述信息,则用
reword
模式即可,将第一行的pick
改为reword
,如下所示:
文章图片
编辑完后,先
ESC
,再键入:wq
保存退出;退出后会进入下一个vim窗口,就是让你修改描述信息:
文章图片
这里我们改成
update a.txt
保存退出,就可以了,控制台显示如下:$ git rebase -i 72c17
[detached HEAD cb965c7] update a.txt
Date: Fri Jan 21 17:27:50 2022 +0800
1 file changed, 1 insertion(+), 1 deletion(-)
Successfully rebased and updated refs/heads/master.
此时git log查看记录,可以看到,已经修改成功:
$ git log
commit 2af842db58c9c6eed08150d9157e131a7b4fb688 (HEAD ->
master)
Author: jalon
Date:Fri Jan 21 17:46:15 2022 +08003commit cb965c752b6a522e11d9fd3729688d04af805b81
Author: jalon
Date:Fri Jan 21 17:27:50 2022 +0800update a.txtcommit 72c17db1e70b1399a35ae64c114112ae890d98e4 (dev)
Author: jalon
Date:Wed Jan 19 15:56:10 2022 +0800update a.txt 2
- 如果还想要修改文件内容,比如修改a.txt的内容,则需要用
edit
模式;
文章图片
此时保存退出后,会给出下面的提示:
$ git rebase -i 72c17Stopped at cb965c7...update a.txtYou can amend the commit now, withgit commit --amendOnce you are satisfied with your changes, rungit rebase --continue
此时git会把你带到edit的那个提交版本上,即HEAD指向edit的那个提交,通过git log可以看到,如下所示:
$ git logcommit cb965c752b6a522e11d9fd3729688d04af805b81 (HEAD)Author: jalon***Date:Fri Jan 21 17:27:50 2022 +0800update a.txtcommit 72c17db1e70b1399a35ae64c114112ae890d98e4 (dev)Author: jalon***Date:Wed Jan 19 15:56:10 2022 +0800update a.txt 2
现在我们就可以修改文件的内容,然后提交:
$ vim a.txt # 修改文件内容$ git add a.txt # add到暂存区$ git commit --amend -m "update a.txt 3" [detached HEAD ac5ac1e] update a.txt 3 Date: Fri Jan 21 17:27:50 2022 +0800 1 file changed, 1 insertion(+), 1 deletion(-) $ git rebase --continue # 继续变基,到此修改就算完成了Successfully rebased and updated refs/heads/master.
- 如果上面的1和2在修补之前,记录还没推到远程仓库,那么修补完后,直接推即可;
$ git push origin masterEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Writing objects: 100% (3/3), 233 bytes | 233.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0), pack-reused 0To github.com:Jalon***23f9682..ad65ea1master ->
master
- 但是上面的1和2在修补之前,记录已经推到了远程仓,那么我们在修补之后进行推时,会报错提示:
$ git push origin masterTo github.com:Jalon*** ! [rejected]master ->
master (non-fast-forward)error: failed to push some refs to github.com:Jalon***hint: Updates were rejected because the tip of your current branch is behindhint: its remote counterpart. Integrate the remote changes (e.g.hint: git pull ...) before pushing again.hint: See the Note about fast-forwards in git push --help for details.
这是因为 本地的记录比远程的记录冲突了(本地的记录在远程记录的后面),所以会提示让我们先拉新的代码再提交;
现在的状态如下所示:
文章图片
但是我们自己知道,这里的冲突只是描述信息的不同,所以解决办法就是强推:
git push -f
$ git push -f origin masterEnumerating objects: 5, done.Counting objects: 100% (5/5), done.Writing objects: 100% (3/3), 234 bytes | 78.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0), pack-reused 0To github.com:Jalon*** + ad65ea1...1e33018 master ->
master (forced update)
现在的状态如下:
【#yyds干货盘点#Git学习-如何修改已经提交的记录】
文章图片
总结
- 如果只是修改最后一次的提交记录,则可以通过 git commit --amend 实现
- 如果需要修改前几次的提交记录,则需要通过 git rebase -i 变基进行实现(配合git commit --amend)
推荐阅读
- 微信小程序环境共享,多个小程序共享一个云开发数据库
- Java8新特性Optional类在处理空值判断场景的应用 回避空指针异常 编写健壮的应用程序
- docker 批量删除 none 镜像
- #yyds干货盘点#在element-ui中使用dialog的时候只有遮罩,看不见内容的问题
- Redis发布订阅原理与实践
- Mac系统安装ELK环境踩坑记录
- 一文掌握oracle19c之离线情况下命令行安装和建库(下)- 本文干货满满,记得收藏哈
- ??苏州程序大白解析Linux 中的虚拟网络接口??《??记得收藏??》
- uni-app技术分享| uni-app常见问题