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

Posted 汤圆学Java

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#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 +0800

    3

commit 23f9682e238e146eb2e09b82e27e5e692f3a0126
Author: jalon2015 <1121263265@qq.com>
Date:   Fri Jan 21 17:27:50 2022 +0800

    更新 a.txt

commit 72c17db1e70b1399a35ae64c114112ae890d98e4 (dev)
Author: jalon2015 <1121263265@qq.com>
Date:   Wed Jan 19 15:56:10 2022 +0800

    update 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 +0800

    3

commit cb965c752b6a522e11d9fd3729688d04af805b81
Author: jalon
Date:   Fri Jan 21 17:27:50 2022 +0800

    update a.txt

commit 72c17db1e70b1399a35ae64c114112ae890d98e4 (dev)
Author: jalon
Date:   Wed Jan 19 15:56:10 2022 +0800

    update a.txt 2
  • 如果还想要修改文件内容,比如修改a.txt的内容,则需要用edit模式;

    此时保存退出后,会给出下面的提示:

    $ git rebase -i 72c17Stopped at cb965c7...  update a.txtYou can amend the commit now, with  git commit --amendOnce you are satisfied with your changes, run  git rebase --continue

    此时git会把你带到edit的那个提交版本上,即HEAD指向edit的那个提交,通过git log可以看到,如下所示:

    $ git logcommit cb965c752b6a522e11d9fd3729688d04af805b81 (HEAD)Author: jalon***Date:   Fri Jan 21 17:27:50 2022 +0800    update a.txtcommit 72c17db1e70b1399a35ae64c114112ae890d98e4 (dev)Author: jalon***Date:   Wed Jan 19 15:56:10 2022 +0800    update 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..ad65ea1  master -> 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)

现在的状态如下:

总结

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

以上是关于#yyds干货盘点#Git学习-如何修改已经提交的记录的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点# 超全面Git知识总结!

#yyds干货盘点# 保存并提交修改后的容器镜像

#yyds干货盘点#Git实现分支管理

#yyds干货盘点# MySQL RC事务隔离级别的实现

#yyds干货盘点#Git学习-存档区,Git中的一个隐藏区

#yyds干货盘点#Git版本回退的方式