我们可以说 git 还原将旧的先前提交合并到还原的提交之上吗?

Can we say that a git revert merges the old previous commits on top of the reverted commit?

我正在努力思考 git revert

我来自 Clearcase 背景,要撤消错误的提交,您可以:

  1. 在提交错误的文件之上检查旧版本的文件(Clearcase 上只有文件级提交)
  2. 删除作为提交的元素
  3. 在版本树中,将以前的版本合并到当前版本中,以创建与最新提交之前的版本相同的新版本。

现在在我看来,git 还原是自动等同于 (3) 中的手动工作。

我的问题是:我们可以说 git 还原将旧的先前提交合并到还原的提交之上吗?

不完全是。 git revert 将为您选择还原的每个提交创建一个新的提交对象,并且每个提交对象将分别与您选择还原的每个提交完全相反。

意思是,如果您 git revert C1,那么 git 将创建 C1R,它完全反转 C1 所做的所有更改。

不要忘记那些 ClearCase 选项是逐个文件的。

git revert 按提交工作(有点像 UCM activity),这意味着它将还原该提交中引用的所有文件。

要仅还原特定文件,您在“Reset or revert a specific file to a specific revision using Git?”中有其他选项。

简而言之

git revert 创建要撤消的提交的倒数。然后将新的变更集提交到存储库中。

请参阅 2.4 Git Basics - Undoing Things.

中的 取消修改已修改文件 部分

所以,不,你不能说:

Can we say that a git revert merges the old previous commits on top of the reverted commit?

因为您可以还原存储库历史记录中的任何提交。

例子

假设您有以下历史记录:

C1 <-- C2 <-- C3 (HEAD)

这意味着,如果您想还原提交 C2,则您不会提交 "old previous commit",这将是 C1。因为那样你最终会得到

C1 <-- C2 <-- C3 <-- C1 (HEAD)

你不知道。你最终得到

C1 <-- C2 <-- C3 <-- C2' (HEAD)

其中 C2'C2 的倒数,并且 C3 仍然是您历史的一部分。

插图

上面的解释有图解,taken from here.