#yyds干货盘点#Git学习-如何修改已经提交的记录

临文乍了了,彻卷兀若无。这篇文章主要讲述#yyds干货盘点#Git学习-如何修改已经提交的记录相关的知识,希望能为你提供帮助。
前言平时开发经常会遇到手误,导致提交的描述信息不准确或者文件有误的情况,这时我们就可以采取必要的措施进行补救;
不同的场景有不同的补救措施,常见的场景有两种:

提交记录 远程仓库
场景一 最后一次提交 没有推到远程仓库
已经推到远程仓库
场景二 历史提交(非最后一次) 没有推到远程仓库
已经推到远程仓库
下面我们就针对不同场景进行分析;
目录
  1. 最后一次提交的记录有问题
  2. 历史提交的记录有问题(非最后一次)
  3. 推到远程仓库
正文 1. 最后一次提交的记录有问题
项目的目录如下所示:
$ 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表示进行交互式变基,运行后,显示如下图:
#yyds干货盘点#Git学习-如何修改已经提交的记录

文章图片

下面我们输入i切换到INSERT模式
  • 如果只是想要修改描述信息,则用reword模式即可,将第一行的pick改为reword,如下所示:
#yyds干货盘点#Git学习-如何修改已经提交的记录

文章图片

编辑完后,先ESC,再键入:wq保存退出;
退出后会进入下一个vim窗口,就是让你修改描述信息:
#yyds干货盘点#Git学习-如何修改已经提交的记录

文章图片

这里我们改成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模式;
    #yyds干货盘点#Git学习-如何修改已经提交的记录

    文章图片

    此时保存退出后,会给出下面的提示:
    $ 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.

3. 推到远程仓库
  • 如果上面的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.

这是因为 本地的记录比远程的记录冲突了(本地的记录在远程记录的后面),所以会提示让我们先拉新的代码再提交;
现在的状态如下所示:
#yyds干货盘点#Git学习-如何修改已经提交的记录

文章图片

但是我们自己知道,这里的冲突只是描述信息的不同,所以解决办法就是强推: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学习-如何修改已经提交的记录】
#yyds干货盘点#Git学习-如何修改已经提交的记录

文章图片

总结
  • 如果只是修改最后一次的提交记录,则可以通过 git commit --amend 实现
  • 如果需要修改前几次的提交记录,则需要通过 git rebase -i 变基进行实现(配合git commit --amend)

    推荐阅读