git revert
定义
撤销某次提交,此次撤销操作和之前的commit记录都会保留。
git revert
会根据commitid
找到此次提交的变更内容,并撤销这些变更并作为一次新commit
提交。
ps:此次commit
和正常commit
相同,也可以被revert
revert
和reset
有本质的差别,revert
是撤销,即对某次commit
的变更内容进行还原,如下图:
commit 1
: 新增index.js
commit 2
: 删除index.js (操作revert commit1
)
commit 3
: 新增index.js (操作revert commit2
)
用法
撤销某次提交
git revert HEAD 撤销前一次 commit
git revert HEAD^ 撤销前前一次 commit
git revert commit_id (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)
撤销多次连续提交(区间)
git revert -n commit_id_start..commit_id_end
撤销多次不连续提交
git revert -n commit_id_1
git revert -n commit_id_3
特殊用法-撤销合并
git revert
是撤销变化,所以在非合并提交中,git
是明确知道改变和改变之前的内容,但是合并不同,合并是两个分支的代码合并成一个节点,所以git
不知道之前的内容是用那个分支的,所以这种情况下需要调用命令的时候指定。
第一步:
git log
找到合并的提交
第二步:找提交的commit id
以及合并的两个分支中,基于那个分支进行撤销(即撤销后显示的内容),并确定分支序号(1,2)
第三步:
git revert 83e2776 -m 1
ps: git revert
是向前操作,所以该分支相当于已经合并到的master,撤销后再次合并,撤销的变化不会再合并一次,所以当要使用这部分变化的时候,需要手动撤销这次的撤销操作才可以。
git reset
定义
回退版本,可以指定退回某一次提交的版本
reset
和revert
有本质的差别,reset
是重置,即直接回退到某次commit
,并将变更放入暂存区(不一定,参数可控制),如下图:
用法
git reset [--soft | --mixed | --hard] [HEAD]
--mixed
:默认选项,重置到某个节点,并保留此节点到当前节点的改变到工作区,即未git add
状态,所以需要重新git add
和git commit
--soft
:默认选项,重置到某个节点,并保留此节点到当前节点的改变到暂存区,即已git add
状态,所以可以直接git commit
--hard
:当前工作区、暂存区以及此节点到当前阶段的改变都不会保留,直接替换为重置节点的工作区。
–
实例
git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
git reset 052e # 回退到指定版本
ps: git reset
之后推送需要对应分支不处于保护状态,否则无法提交。
差异点
git revert
会撤销某次提交,并就撤销产生的变化生成一次commit
,所以指针head
会“前进”一个节点,并且这个过程中改变撤销的内容,如果撤销节点和当前节点之间有其余的提交内容,不会产生任何影响。因为向前,所以撤销合并会导致合并的内容下次合并会当成已经合并过,需要手动处理。
git reset
会重置到某次提交,通过参数判断是否保留当前提交和重置节点之间的内容,并且保留的情况下,会合并这些(几次commit
)更改。因为是节点直接重置,所以重置合并合普通节点是一样的,下次合并正常操作即可。
使用场景
git revert
:适合跳
着撤销某一次的代码,并保留中间提交的代码。
git reset
: 适合重置当前节点到某个节点这一区间提交的所有代码。