#yyds干货盘点#Git学习-如何修改已经提交的记录
Posted 汤圆学Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#yyds干货盘点#Git学习-如何修改已经提交的记录相关的知识,希望对你有一定的参考价值。
前言
平时开发经常会遇到手误,导致提交的描述信息不准确或者文件有误的情况,这时我们就可以采取必要的措施进行补救;
不同的场景有不同的补救措施,常见的场景有两种:
提交记录 | 远程仓库 | |
---|---|---|
场景一 | 最后一次提交 | 没有推到远程仓库 |
已经推到远程仓库 | ||
场景二 | 历史提交(非最后一次) | 没有推到远程仓库 |
已经推到远程仓库 |
下面我们就针对不同场景进行分析;
目录
- 最后一次提交的记录有问题
- 历史提交的记录有问题(非最后一次)
- 推到远程仓库
正文
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学习-如何修改已经提交的记录的主要内容,如果未能解决你的问题,请参考以下文章