一、背景
使用git开发过程中,我们可能遇到提交多个commit的情况,如下图所示,但当做测试的时候察觉某次commit有bug,此时又不想新提一个commit来解决这个问题,这时候该怎么办?
public class Test {
public void test(){
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("D");
}
}
提交记录:A->B(存在bug需要修改)->C->D(存在bug需要修改)
二、解决方式
git log 查看历史提交,可以看到A、B、C、D的提交记录

2.1.最近的一次提交D存在问题
①修改问题代码:
public class Test {
public void test(){
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("D(修复D的Bug)");
}
}
②使用命令:
- git add .
- git commit --amend
此时进入vim编辑器,如左图所示;输入"i"进行修改,"esc"键退出修改,修改完输入":wq"进行保存,如右图所示:


此时可以使用git log查看修改:

2.2.中间的提交B存在问题
①使用git rebase -i HEAD~n或者git rebase -i 7位的head头^
- it rebase -i HEAD~3
进入左图的vim编辑器,输入"i"进行修改,将要修改的commit记录的pick修改成"e"或者"edit","esc"键退出修改,":wq"保存修改,如右图:


②修改问题代码
public class Test {
public void test(){
System.out.println("A");
System.out.println("B(修复B的Bug)");
}
}
③使用命令
- git add .
- git commit --amend
此时进入了vim编辑器,输入"i"进行修改,"esc"键退出修改,修改完输入":wq"进行保存,如下图所示。

④git rebase --continue

此时如果有冲突, 需要先解决冲突:
- 编辑冲突文件, 解决冲突
git add .git rebase --continue




此时进入左图的vim编辑器,直接输入":wq"即可,如右图:


此时显示成功变基并更新如左图示,代码更新如右图示:


此时使用git log查看历史记录如下图所示:

三、将工作空间的改动追加到某次commit上
在工作空间中将System.out.println("A")做出了部分修改

①使用git stash将工作空间的改动就行保存或者使用Shelve Changes进行保存



②git rebase -i HEAD~n找到需要更改的commit, 将行首的pick改成edit, 按esc, 输入:wq退出

③使用git stash pop或者Unshelve还原工作空间的改动

修改存在的冲突


④git add .和git commit --amend提交修正

⑤git rebase --continue

修复冲突
使用git add .和git rebase --continue不断修复冲突

git log查看

一些小知识
①HEAD^的表示上一个版本,也可以写成HEAD~1,如果你进行了2次commit,都想撤回的话,可以使用HEAD~2,以此类推。
②如果是commit注释写错了,只是想改一下注释,只需要执行命令行:git commit --amend。此时会进入默认Vim编辑器,修改完之后保存即可。
③撤回commit后又后悔了,不想撤回了…。此时可以通过版本号来回退,先使用 git reflog 命令来获取版本号,再使用 git reset --hard 版本号 命令来恢复。
本文介绍了如何在Git中修改历史提交记录,包括使用git commit --amend修改最近提交,通过git rebase -i编辑中间提交,以及将工作空间的改动追加到特定commit上。同时分享了关于git stash、解决冲突和回退commit的小知识。
1828

被折叠的 条评论
为什么被折叠?



