【git revert】使用以及理解(详解)

一、

假如git commit 链是

A -> B -> C -> D

如果想把B,C,D都给revert,除了一个一个revert之外,还可以使用range revert

git revert B^…D

这样就把B,C,D都给revert了,变成:

A-> B ->C -> D -> D’-> C’ -> B’

用法就是:

git revert OLDER_COMMIT^…NEWER_COMMIT

如果我们想把这三个revert不自动生成三个新的commit,而是用一个commit完成,可以这样:

git revert -n OLDER_COMMIT^…NEWER_COMMIT
git commit -m “revert OLDER_COMMIT to NEWER_COMMIT”

二、

git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销,作为一次最新的提交。

  • git revert HEAD 撤销前一次 commit
  • git revert HEAD^ 撤销前前一次 commit
  • git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
    git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,
    版本会递增,不影响之前提交的内容

git revert 和 git reset的区别:

git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。
1、在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。
2、git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

revert理解

revert 可以取消指定的提交内容。

当讨论 revert 时,需要分两种情况,因为 commit 分为两种:一种是常规的 commit,也就是使用 git commit 提交的 commit;另一种是 merge commit,在使用 git merge 合并两个分支之后,你将会得到一个新的 merge commit

merge commit 和普通 commit 的不同之处在于 merge commit 包含两个 parent commit,代表该 merge commit 是从哪两个 commit 合并过来的。

clipboard.png

在上图所示的红框中有一个 merge commit,使用 git show 命令可以查看 commit 的详细信息

➜  git show bd86846
commit bd868465569400a6b9408050643e5949e8f2b8f5
Merge: ba25a9d 1c7036f

这代表该 merge commit 是从 ba25a9d 和 1c7036f 两个 commit 合并过来的。

而常规的 commit 则没有 Merge 行

➜  git show 3e853bd
commit 3e853bdcb2d8ce45be87d4f902c0ff6ad00f240a

revert 常规 commit

使用 git revert <commit id> 即可,git 会生成一个新的 commit,将指定的 commit 内容从当前分支上撤除。

revert merge commit

revert merge commit 有一些不同,这时需要添加 -m 选项以代表这次 revert 的是一个 merge commit

但如果直接使用 git revert <commit id>,git 也不知道到底要撤除哪一条分支上的内容,这时需要指定一个 parent number 标识出"主线",主线的内容将会保留,而另一条分支的内容将被 revert。

如上面的例子中,从 git show 命令的结果中可以看到,merge commit 的 parent 分别为 ba25a9d 和 1c7036f,其中 ba25a9d 代表 master 分支(从图中可以看出),1c7036f 代表 will-be-revert 分支。需要注意的是 -m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个。

保留主分支,应该设置主分支为主线,操作如下:

➜ git revert -m 1 bd86846

img

revert 之后重新上线

假设tom在自己分支 tom/feature 上开发了一个功能,并合并到了 master 上,之后 master 上又提交了一个修改 h,这时提交历史如下:

a -> b -> c -> f -- g -> h (master)
           \      /
            d -> e   (tom/feature)

突然,大家发现tom的分支存在严重的 bug,需要 revert 掉,于是大家把 g 这个 merge commit revert 掉了,记为 G,如下:

a -> b -> c -> f -- g -> h -> G (master)
           \      /
            d -> e   (tom/feature)

然后tom回到自己的分支进行 bugfix,修好之后想重新合并到 master,直觉上只需要再 merge 到 master 即可,像这样:

a -> b -> c -> f -- g -> h -> G -> i (master)
           \      /               /
            d -> e -> j -> k ----    (tom/feature)

i 是新的 merge commit。但需要注意的是,这 不能 得到我们期望的结果。因为 d 和 e 两个提交曾经被丢弃过,如此合并到 master 的代码,并不会重新包含 d 和 e 两个提交的内容,相当于只有 goudan/a-cool-feature 上的新 commit 被合并了进来,而 goudan/a-cool-feature 分支之前的内容,依然是被 revert 掉了。

所以,如果想恢复整个 tom/feature 所做的修改,应该先把 G revert 掉:

a -> b -> c -> f -- g -> h -> G -> G' -> i (master)
           \      /                     /
            d -> e -> j -> k ----------    (tom/feature)

其中 G’ 是对 G 的 revert 操作生成的 commit,把之前撤销合并时丢弃的代码恢复了回来,然后再把tom的分支merge到master分支上,把解决 bug 写的新代码合并到 master 分支。

参考

https://stackoverflow.com/questions/9059335/get-parents-of-a-merge-commit-in-git

<think>嗯,用户现在想了解git revert使用方法,还想要教程和示例。首先,我需要回忆一下git revert的基本功能。根据之前的引用内容,git revert是通过创建新的提交来撤销某个历史提交的更改,这样可以保持项目历史的完整性,不会像git reset那样改变提交历史。 用户之前的问题是关于git status -s执行缓慢和UU状态的处理,现在转向了git revert,可能需要撤销某些提交来解决冲突或其他问题。根据引用[3],git revertgit reset的区别在于revert不会改变历史,适合协作环境,而reset会重置历史,可能影响他人。 接下来需要组织回答结构,先介绍命令的作用,然后分步骤讲解使用方法,包括基础使用、撤销多个提交、处理冲突等。引用中的信息提到可以结合分支操作,比如创建临时分支来合并revert的提交,如引用[5]中的示例,可能需要提到这方面的内容。 用户可能需要具体的示例,所以应该提供常见的场景,比如撤销最近的提交、撤销特定提交、处理冲突后的继续操作等。同时要注意使用中文,并正确应用LaTeX格式,比如命令用行内公式,代码块用反引号。 还要考虑用户可能遇到的问题,比如如何撤销多个提交,或者如何处理revert后的冲突。引用[4]提到了选项如--continue、--abort等,这些应该在解决冲突的部分详细说明。 需要确保回答结构清晰,分步骤讲解,并给出示例代码,帮助用户一步步操作。同时要引用正确的参考文献,比如引用[1]、[2]、[3]等,末尾添加引用标识。 最后,生成相关问题,可能包括与其他命令的区别、应用场景、常见错误处理等,这样用户可以进一步学习。检查是否符合之前的系统级指令,比如LaTeX格式是否正确,独立公式是否用$$...$$,但这里可能不需要数学公式,主要用代码块和命令示例。 总结,回答的结构应该是: 1. 命令简介 2. 使用场景 3. 基础使用方法 4. 常用参数 5. 实战示例 6. 注意事项 7. 相关问题 需要确保每个部分都有示例代码和引用标注,语言简洁明了,帮助用户理解和操作。</think>### Git Revert 命令使用教程及示例 --- ### 一、命令核心功能 `git revert` 通过**生成新的提交**来撤销指定历史提交的更改,避免直接修改提交历史,适用于协作开发场景[^1][^3]。 --- ### 二、核心使用场景 1. 安全撤销已推送到远程仓库的提交 2. 协作开发中保留完整历史记录 3. 修复错误提交但需保留原始提交信息[^2] --- ### 三、基础使用方法 #### 1. 撤销单个提交 ```bash # 语法格式 git revert <commit-hash> # 示例:撤销最近一次提交 git revert HEAD # 示例:撤销指定提交(如abc123) git revert abc123 ``` #### 2. 撤销连续多个提交 ```bash # 撤销从提交A到提交B的所有更改(左开右闭区间) git revert A^..B # 示例:撤销从abc123到def456的提交 git revert abc123^..def456 ``` --- ### 四、关键参数详解 | 参数 | 作用 | 示例 | |------|------|------| | `-n` (`--no-commit`) | 撤销更改但不自动提交 | `git revert -n abc123` | | `-m <parent-number>` | 处理合并提交时指定主父节点 | `git revert -m 1 merge_commit` | | `--continue` | 解决冲突后继续操作 | `git revert --continue` | | `--abort` | 终止当前撤销操作 | `git revert --abort` | --- ### 五、实战示例 #### 场景1:撤销错误的功能提交 ```bash # 找到错误提交的哈希值(假设为bad123) git log --oneline # 执行撤销操作(会自动生成新提交) git revert bad123 # 推送修改到远程仓库 git push ``` #### 场景2:批量撤销多个提交 ```bash # 撤销最近3个提交(保留工作区改动) git revert -n HEAD~3..HEAD # 手动检查修改后提交 git add . git commit -m "Revert last 3 commits" ``` #### 场景3:处理合并提交的撤销 ```bash # 查看合并提交的父节点信息 git show merge_commit_hash # 选择要保留的主分支父节点(通常为-m 1) git revert -m 1 merge_commit_hash ``` --- ### 六、注意事项 1. **冲突处理机制** - 若撤销操作导致冲突: ```bash # 手动解决冲突文件 vim conflicted_file.txt # 标记为已解决并继续 git add conflicted_file.txt git revert --continue ``` 2. **与`git reset`的差异** - `git revert`:添加新提交反向操作,历史记录完整[^3] - `git reset`:直接回退到指定提交,修改历史记录 3. **强制推送风险** - 已推送的`revert`提交禁止使用`git push -f`,除非使用独立分支处理[^5] --- ### 七、典型工作流 ```mermaid graph LR A[发现错误提交] --> B{是否已推送?} B -->|是| C[使用git revert生成反向提交] B -->|否| D[使用git reset修改历史] C --> E[推送新提交] D --> F[本地强制推送] ``` --- ### 八、性能优化建议 1. 对大型提交使用`-n`参数批量处理 2. 合并多个`revert`提交: ```bash git revert -n commit1 commit2 git commit -m "Batched reverts" ``` --- ### 九、验证操作结果 ```bash # 查看提交历史中的反向提交 git log --oneline -p # 检查文件状态 git status -s ``` ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值