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