Git 在本例中,还原提交的最佳方法是什么?

Git 在本例中,还原提交的最佳方法是什么?,git,Git,所以,也许我误解了回复在这种情况下是如何工作的,但我们可以说 布兰卡BranchBBranchC 所有产品都被合并到发布版/05\u 12\u 2021中 。。。。然后 发布/05\u 12\u 2021-->合并到开发中 。。。然后 开发----合并到主控 现在,让我们假设Master有一个灾难性错误,它是由BranchB引入的。我们可以轻松地将主版回滚到上一版本。伟大的但假设我们只想从Master中获得该承诺(来自BranchB)。。或者如果更容易。。。停止开发(然后将其合并到另一版本的m

所以,也许我误解了回复在这种情况下是如何工作的,但我们可以说

布兰卡BranchBBranchC

所有产品都被合并到发布版/05\u 12\u 2021中

。。。。然后

发布/05\u 12\u 2021-->合并到开发中

。。。然后 开发----合并到主控


现在,让我们假设Master有一个灾难性错误,它是由BranchB引入的。我们可以轻松地将主版回滚到上一版本。伟大的但假设我们只想从Master中获得该承诺(来自BranchB)。。或者如果更容易。。。停止开发(然后将其合并到另一版本的master中)

“git revert-m1{hash}”在这里有效吗

策略是什么?如何将分支一直提交到进入master的发布分支中?

因为,问题本身有点不明确。然而,对于我的一个长答案来说,这是一个很好的跳板。注意:这很长。不过,如果您一直都能做到这一点,您可能会对Git有更好的理解

“git revert-m1{hash}”在这里有效吗

有很多散列,你不说哪一个,所以:也许吧。即使你说了哪一个,答案仍然是“可能”,但至少我们会有更好的方式来谈论它。:-)

无论何时处理Git或任何东西,都必须记住,所有抽象,例如“分支”,最终都有具体的实现(有时只有一个,有时很多)。忘记了这一点,Joel Spolsky在2001年称之为(这是一个更新版本,仍然有效)。认识到并非所有的具体实现都是相互配合的,这一点也很重要。一旦您了解了实际实现级别的内容,以及关键的工作原理,您就可以开始判断将发生什么。那么,让我们看看git revert真正做了什么,以及抽象

revert的抽象是“撤销一些更改”。也就是说,给定一些特定的提交,并注意我们是如何从“分支”移动到“提交”的,而不必费心定义任何一个,我们需要以某种方式将提交视为一种更改。但是,一旦我们费心检查提交是如何工作的,那么,它们根本就不是更改。它们包含快照:软件的图片,或者至少是包含内容的文件的图片,这些内容在时间上被冻结在一个这样的图片流中。他们就像。这就是让我们能够将提交转化为更改的能力:我们不只是拍摄一个快照,而是拍摄两个快照,并排放置,然后玩一个简单的游戏

假设我们在一个分支中进行两个相邻的提交。我们还没有定义分支,但我们现在可以溜冰了。这两个提交,Git称它们为parent和child。您可以
git checkout
some commit(通过某个分支名称),对其执行一些操作,
git add
,以及
git commit
结果。git commit步骤生成一个新的提交——一个新的快照,即子快照。旧的提交现在是父级。子提交包含的文件与父提交中的文件相同,但运行
git add
的文件除外。对于这些文件,它包含您更新的文件。因此,父快照和子快照是相同的,除非您进行了更改并记住了添加它们

如果我们比较父级提交和子级提交,并且假设您记得添加所有更改,那么我们的差异点游戏应该,我们希望,提出我们所做的更改。当然,如果我们是手动完成的,并且从来没有犯过任何错误,而且我们是让孩子犯下错误的人,我们可以自己完成,并得到正确的结果。但做所有这些都是一项艰巨的工作,而我们是人,也许我们一开始甚至没有让那个孩子做出承诺

幸运的是,我们可以让Git为我们做这项工作。不幸的是,当我们这样做的时候。。。嗯,Git不聪明。Git将这些更改视为简单的文本差异。Git包含一个diff引擎(的一个修改版本),它将文件分解为单独的行,它可以将这些行馈送到a,以提出一组要应用的更改:对左侧文件进行这些更改,您将得到右侧文件。该算法本身试图提出一个最小的变化,这是如此频繁的工作,它应该是令人惊讶的。但我们已经习惯了。不过,我们确实需要记住,它并不总是有效的

这也是答案仍然是“也许”的部分原因。你的机会很好,但这取决于差异引擎。它们还取决于其他变化,以及这些变化是否会产生干扰

git revert
涉及三次提交 现在我们知道了如何比较两个提交,让我们更仔细地看一下revert,它比较了三个提交。这三个承诺是什么?它们是如何工作的

让我们从父和子部分开始。事实上,让我们来讨论一下分支的定义。(有不止一个定义,这是我们在讨论Git中的提交时遇到的问题之一。另请参见)我们首先需要了解关于提交的另一个事实:虽然它们包含快照,但它们也包含一些元数据,我们指的是关于此提交本身的信息。元数据包括提交作者的姓名以及一些日期和时间戳。但是,为了查找某个提交的父提交,元数据正好包括:父提交的标识。1

这一切都意味着,对于普通提交,普通作为一个形容词,我们还没有正确定义,但有一个单亲和提交关联。这些承诺,
... <-F <-G <-H
...--F--G--H--...--W   <-- you-are-here
          I--J
         /    \
...--G--H      M   <-- some-branch
         \    /
          K--L   <-- other-branch
          I--J
         /    \
...--G--H      M--N--O--P   <-- some-branch (HEAD)
         \    /
          K--L   <-- other-branch