侧边栏壁纸
  • 累计撰写 90 篇文章
  • 累计创建 95 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录
Git

Git学习-如何修改已经提交的记录

汤圆学Java
2022-01-22 / 0 评论 / 0 点赞 / 219 阅读 / 5,970 字
温馨提示:
本文最后更新于 2022-01-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

平时开发经常会遇到手误或者短路,导致提交的描述信息不准确或者文件有误的情况,这时我们就可以采取必要的措施进行补救;

不同的场景有不同的补救措施,常见的场景有两种:

提交记录远程仓库
场景一最后一次提交没有推到远程仓库
已经推到远程仓库
场景二历史提交(非最后一次)没有推到远程仓库
已经推到远程仓库

下面我们就针对不同场景进行分析;

目录

  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表示进行交互式变基,运行后,显示如下图:

image-20220121181558406

这里的顺序是按照提交时间,正序排列的,所以最新提交的会显示在下面;

下面我们输入i切换到INSERT模式

  • 如果只是想要修改描述信息,则用reword模式即可,将第一行的pick改为reword,如下所示:

image-20220121182143558

编辑完后,先ESC,再键入:wq保存退出;

退出后会进入下一个vim窗口,就是让你修改描述信息:

image-20220121182315304

这里我们改成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模式;

    image-20220121183625256

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

    $ git rebase -i 72c17
    Stopped at cb965c7...  update a.txt
    You can amend the commit now, with
    
      git commit --amend
    
    Once you are satisfied with your changes, run
    
      git rebase --continue
    

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

    $ git log
    commit cb965c752b6a522e11d9fd3729688d04af805b81 (HEAD)
    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
    
    

    现在我们就可以修改文件的内容,然后提交:

    $ 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.
    
    

    注意:上面的git commit --amend,表示修改最后一次提交,如果没加--amend,那么会被当作一次新的记录被提交

3. 推到远程仓库

  • 如果上面的1和2在修补之前,记录还没推到远程仓库,那么修补完后,直接推即可;

此时推到远程仓库,不会有问题,可以推成功:

$ git push origin master
Enumerating 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 0
To github.com:Jalon***
   23f9682..ad65ea1  master -> master
  • 但是上面的1和2在修补之前,记录已经推到了远程仓,那么我们在修补之后进行推时,会报错提示:
$ git push origin master
To 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 behind
hint: 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.

这是因为 本地的记录比远程的记录冲突了(本地的记录在远程记录的后面),所以会提示让我们先拉新的代码再提交;

现在的状态如下所示:

image-20220121180147581

但是我们自己知道,这里的冲突只是描述信息的不同,所以解决办法就是强推git push -f

$ git push -f origin master
Enumerating 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 0
To github.com:Jalon***
 + ad65ea1...1e33018 master -> master (forced update)

现在的状态如下:

image-20220121180512328

总结

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

评论区