在团队开发的时候, 经常会出现某次commit导致整个项目出现无法名状的错误, 这个时候, 最好的解决办法就是删除错误的commit
场景复现一
1.假设有2个提交记录
1 | commit def5adef853da4cc05752bdb36577c127be71ba5 |
2.现在需要回滚到上一次提交
那么 我们可以使用
1 | git reset --hard HEAD^ |
或者
1 | git reset --hard HEAD~1 |
或者
1 | git reset --hard f36801544670e00b2f59a28e19017d2786c4085e |
3.执行完后 查看日志,就会发现只剩下一个提交了
1 | git log |
4.如果这个时候,你突然发现回退版本错了,那么就用git reflog查看提交记录
1 | git reflog |
5.然后找出想要回退的版本,进行回退
1 | git reset --hard def5ade |
6.如果此时需要同步远程仓库, 需要使用强推
1 | git push -f |
因为我们本地库HEAD指向的版本比远程库的要旧
由此可见, git reset
可以很方便的回滚到指定的历史commit,
但是它的劣势也很明显, 一旦回滚到指定commit, 那么后面提交的commit都会一并删除
*为了保留后面需要的的commit内容, 咱们可以使用另一种指令 *git revert
场景复现二
1.假设有3个提交记录
1 | commit def5adef853da4cc05752bdb36577c127be71ba5 |
2.现在我们不需要第二个commit的操作,也就是不需要 增加文件 这个操作
那么, 我们可以使用git revert -n
+版本号 命令进行反做
1 | git revert -n 853dadef5adef4cc05752bdb36577c127be71ba5 |
注意: 这里可能会出现冲突,那么需要手动修改冲突的文件, 然后重新add提交
1 | git add . |
3.执行完后 查看日志,会发现原来的commit记录还在,同时新增了一个commit版本
1 | git log |
4.如果此时需要同步远程仓库
1 | git push |
使用git revert
这种方式既可以清除指定的commit操作, 同时可以保留后面的commit
但是也存在一个让人不舒服的地方, 虽然操作被重写了,但是记录还在, 而且由新增了一个记录,感觉有些冗余
为了解决这个问题, 最后我选择了第三种方式, 也就是使用 git rebase
节点切片
场景复现三
1.假设有3个提交记录
1 | commit def5adef853da4cc05752bdb36577c127be71ba5 |
2.现在我们不需要第二个commit的操作,也就是不需要 增加文件 这个操作
假设是master分值那么, 我们可以使用git rebase --onto [startpoint] [endpoint]
1 | git rebase --onto master~853dade master~def5ade master |
或者
1 | git rebase --onto master~2 master~1 master |
或者使用
1 | git rebase i f368015 /把 需要改动那条 commit 前面的 pick 改成drop 然后, 保存退出即可 |
3.执行完后 查看日志 指定的commit已被切除
1 | git log |
4.如果此时需要同步远程仓库
1 | git push -f |
要注意的是,这样做会 彻底 删掉那条 commit。唯一的找回方式是通过 git reflog
。
5.如果你只是想改下那条 commit 的 author
这样就行:
1 | git rebase -i f368015 |
把 需要改动那条 commit 前面的 pick 改成 edit
然后
1 | git commit --amend --author="xxxxxxxx" |
然后
1 | git rebase --continue |
最后保存退出即可
总结
- git reset
适用场景: 如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法。
- git revert
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,记录下这整个版本变动流程,就可以用这种方法。
- git rebase –onto和git rebase i
适用场景: 如果我们想撤销之前的某一版本,但是又想保留该目标版本后面的版本,彻底清除commit记录, 而又不增加新的commit记录, 就可以用这种方法
本帖附件
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站