Git撤销已合并提交的多种姿势

#Git撤销已合并提交的多种姿势

在Git中,合并分支是一个常见的操作,但有时候可能会意外地将错误的提交合并到了主分支。这时候需要撤销已合并的提交并恢复到正确的状态。本文将介绍的是如何在Git中撤销已合并的提交,无论这个提交记录是最新的还是中间的某一个。

撤销最新合并的一次提交

如果要撤销最新的合并提交,可以使用git revert命令来创建一个新的提交,撤销错误的变更。

  1. 首先使用git log命令查看提交历史,找到最新的合并提交。

$ git log
commit c3d2e9a4e2a1e285ff4d8f06e01d4e3f19b532ea (HEAD -> master)
Author: Hanmeimei <hanmeimei@example.com>
Date:   Fri Jun 30 15:26:43 2023 +0800

    Incorrect merge commit

commit 3e5fb8a7b631eb6492ef32e28a813084d4d3de2b
Author: Lilei <Lilei@example.com>
Date:   Thu Jun 29 18:20:56 2023 +0800

    Correct commit

...

在上面的示例中,大家可以看到最新的错误合并提交(Incorrect merge commit)。

  1. 使用git revert命令撤销合并提交,并创建一个新的提交来还原到正确的状态。

$ git revert c3d2e9a4e2a1e285ff4d8f06e01d4e3f19b532ea

Git将自动创建一个新的提交,撤销错误的合并提交。

  1. 使用git loggit show命令验证新的提交历史,确认错误的变更已经被撤销。

$ git log
commit b254d0f063b4ab4e7b78fb42015e0c55e0e98712 (HEAD -> master)
Author: Hanmeimei <hanmeimei@example.com>
Date:   Fri Jun 30 15:46:28 2023 +0800

    Revert "Incorrect merge commit"

    This reverts commit c3d2e9a4e2a1e285ff4d8f06e01d4e3f19b532ea.

commit 3e5fb8a7b631eb6492ef32e28a813084d4d3de2b
Author: Lilei <lilei@example.com>
Date:   Thu Jun 29 18:20:56 2023 +0800

    Correct commit

...

在这里可以看到一个新的提交(Revert "Incorrect merge commit")被创建,它撤销了最新的错误合并提交。

撤销最新合并的多次提交

如果要撤销最新合并的多次提交,可以使用git reset命令来回滚到某次提交。以下是步骤:

  1. 首先使用git log命令查看提交历史,找到要回滚的哈希值。

$ git log
commit c5b890eee2edf9a353ec6bba0543e41d2529a8f8 (HEAD -> master)
Author: Hanmeimei <hanmeimei@example.com>
Date:   Mon Jul 3 15:12:10 2023 +0800

    Incorrect merge commit

commit 82bcf43083a4dc8c87091ebde4dd5374f0c6e274
Author: Hanmeimei <hanmeimei@example.com>
Date:   Mon Jul 3 15:11:54 2023 +0800

    Incorrect merge commit2
    
commit 60a52b00d0ee2703156231e209e8aad115919aee
Author: Hanmeimei <hanmeimei@example.com>
Date:   Mon Jun 26 06:32:35 2023 +0000

    Correct commit

...

在这里需要回滚到(Correct commit)。

  1. 使用git reset 命令撤销合并提交,并创建一个新的提交来还原到正确的状态。

$ git reset --soft 60a52b00d0ee2703156231e209e8aad115919aee // 暂存区
$ git reset --hard 60a52b00d0ee2703156231e209e8aad115919aee // HEAD 指向此次提交记录
$ git push origin HEAD --force // 强制推送远端

注意:此次提交之后的修改不做任何保留,git status查看工作区是没有记录的。

  1. 最后,使用git loggit show命令验证提交历史,确认错误的变更已经被撤销。

$ git log
commit 60a52b00d0ee2703156231e209e8aad115919aee (HEAD -> master)
Author: Hanmeimei <hanmeimei@example.com>
Date:   Mon Jun 26 06:32:35 2023 +0000

    Correct commit

...

如果出现了误删,可以用以下办法来恢复:

$ git reset --hard 82bcf43083a4dc8c87091ebde4dd5374f0c6e274 // 误删的哈希值

 HEAD is now at 82bcf4308 feat: Incorrect merge commit2
 
$ git push origin HEAD --force // 强制推送远端

撤销中间合并某一个提交

如果要撤销中间的某一个合并提交,可以使用git revert命令,并指定要撤销的提交哈希值。

  1. 首先使用git log命令查看提交历史,并找到要撤销的中间合并提交。

$ git log
commit 3e5fb8a7b631eb6492ef32e28a813084d4d3de2b (HEAD -> master)
Author: Lilei <lilei@example.com>
Date:   Wed Jun 21 12:00:00 2023 +0000

    Correct commit
    
commit a1b2c3d4e5f6a7b8c9d0e1f2g3h4i5j6k7l8m9n0
Author: Hanmeimei <hanmeimei@example.com>
Date:   Fri Jun 18 12:00:00 2023 +0000

    Incorrect merge commit
    
...

在这里可以看到一个中间的错误合并提交(Incorrect merge commit)。

  1. 然后使用git revert命令撤销合并提交,并创建一个新的提交来还原到正确的状态。

$ git revert a1b2c3d4e5f6a7b8c9d0e1f2g3h4i5j6k7l8m9n0

Git将自动创建一个新的提交,撤销错误的合并提交。

  1. 最后使用git loggit show命令验证新的提交历史,确认错误的变更已经被撤销。

$ git log
commit b254d0f063b4ab4e7b78fb42015e0c55e0e98712 (HEAD -> master)
Author: Hanmeimei <hanmeimei@example.com>
Date:   Mon Jun 28 12:10:00 2023 +0000

    Revert "Incorrect merge commit"

    This reverts commit a1b2c3d4e5f6a7b8c9d0e1f2g3h4i5j6k7l8m9n0.

commit 3e5fb8a7b631eb6492ef32e28a813084d4d3de2b
Author: Lilei <lilei@example.com>
Date:   Wed Jun 21 12:00:00 2023 +0000

    Correct commit
    
commit a1b2c3d4e5f6a7b8c9d0e1f2g3h4i5j6k7l8m9n0
Author: Hanmeimei <hanmeimei@example.com>
Date:   Fri Jun 18 12:00:00 2023 +0000

    Incorrect merge commit

...

可以看到之前的提交仍会保留在git log中,而此次撤销会做为一次新的提交(Revert "Incorrect merge commit")。

注意

在执行撤销操作之前,请一定要确保你了解操作的后果,并在进行任何更改之前创建备份或保存重要的数据。

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

674c30eac365c8a69f26f440bb362217.png

Git 中回退一个合并提交(merge commit)需要特别注意,因为合并提交涉及两个父节点,Git 无法自动判断要保留哪一部分历史。通常有两种方式可以实现这一目标:**使用 `git revert` 回退合并提交** 和 **使用 `git reset` 回退到合并前的状态**。以下详细介绍这两种方法及其适用场景。 ### 使用 `git revert` 回退合并提交(推荐) `git revert` 会创建一个新的提交撤销指定提交的更改。对于合并提交,必须使用 `-m` 参数指定保留哪一个父提交。 例如,假设合并提交的哈希值为 `1234567`,该合并提交将 `fix` 分支合并到 `sit` 分支,要回退此合并提交并保留 `fix` 分支的代码状态,可以执行以下命令: ```bash git checkout sit git revert -m 1 1234567 git push origin sit ``` 其中 `-m 1` 表示保留第一个父提交(即合并前的 `sit` 分支状态),`-m 2` 则表示保留被合并的 `fix` 分支状态[^1]。 这种方法不会修改提交历史,适合用于公共分支上的回退操作,避免影响其他协作者的工作。 ### 使用 `git reset` 回退合并提交(适用于私有分支) 如果合并提交尚未推送到远程仓库,或者你确定其他协作者不会受到影响,可以使用 `git reset` 直接回退到合并前的状态。 ```bash git checkout sit git reset --hard 1234567 git push origin sit --force ``` 其中 `1234567` 是合并前的最后一个提交哈希。该命令会将当前分支的指针移动到指定提交,并丢弃之后的所有更改。由于此操作会重写提交历史,因此必须使用 `--force` 强制推送至远程仓库[^1]。 > ⚠️ 注意:强制推送可能会影响其他协作者,务必确保其他协作者不会基于旧的历史进行开发。 ### 选择合适的方法 - **使用 `git revert`**:适用于多人协作的公共分支,保留提交历史,安全可靠,但会增加提交记录。 - **使用 `git reset`**:适用于本地或私有分支,彻底清除提交历史,操作风险较高,需谨慎使用。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值