一、背景
使用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 版本号 命令来恢复。