当使用诸如 git 等版本控制系统维护代码时,不可避免地需要回滚一些错误的提交,这可能是由于错误或临时代码回退导致的。在这种情况下,新手开发人员会非常紧张,因为他们可能会迷失在应该如何回滚更改而不影响其他人的问题上,但对于经验丰富的开发人员来说,这是他们的日常工作,他们可以向您展示不同的方法。
在这篇文章中,我们将介绍开发人员经常使用的两种主要方法。
- git reset
- git revert
它们之间的区别和对应的用例是什么?我们将在下面详细讨论它们。
git reset
假设我们有以下几个提交。
提交 A 和 B 是有效的提交,但提交 C 和 D 是错误的提交。现在我们想回滚到提交 B 并删除提交 C 和 D。当前 HEAD 指向提交 D 5lk4er,我们只需要将 HEAD 指向提交 B a0fvf8 即可实现我们想要的目标。
使用 git reset 命令很容易。
git reset --hard a0fvf8
执行上述命令后,HEAD 将指向提交 B。
但是现在远程 origin 的 HEAD 仍然指向提交 D,如果我们直接使用 git push 来推送更改,它将不会更新远程仓库,我们需要添加一个 -f 选项来强制推送更改。
git push -f
这种方法的缺点是,一旦完成重置,HEAD 之后的所有提交都将消失。万一有一天我们发现其中一些提交是好的,并且想保留它们,那就太晚了。因此,许多公司禁止使用此方法来回滚更改。
git revert
使用 git revert 是为了创建一个新的提交,该提交会还原之前的提交。HEAD 将指向新的还原提交。
对于上面 git reset 的示例,我们需要做的就是还原提交 D,然后还原提交 C。
git revert 5lk4er
git revert 76sdeb
现在它创建了两个新的提交 D' 和 C',
在上面的示例中,我们只有两个提交要还原,因此我们可以逐个还原。但是,如果要还原的提交很多怎么办?我们确实可以还原一个范围。
git revert OLDER_COMMIT^..NEWER_COMMIT
此方法不会有 git reset 的缺点,它会将 HEAD 指向新创建的还原提交,并且可以直接将更改推送到远程,而无需使用 -f 选项。
现在让我们看一个更困难的例子。假设我们有三个提交,但错误的提交是第二个提交。
使用 git reset 回滚提交 B 不是一个好主意,因为我们需要保留提交 C,因为它是一个好的提交。现在我们可以还原提交 C 和 B,然后使用 cherry-pick 再次提交 C。
从上面的解释中,我们可以发现 git reset 和 git revert 之间的最大区别在于,git reset 会通过删除所需提交之后的所有更改将分支的状态重置为之前的状态,而 git revert 会通过创建新的还原提交并保留原始提交来重置为之前的状态。建议在企业环境中使用 git revert 而不是 git reset。
Really hard to take anything you say seriously when you use the entire aplhabet for your hexadecimal SHA1 examples.