如何挑选和恢复工作?

Tim*_*Tim 6 git git-revert git-cherry-pick

我试图理解merge和rebase在数学中的集合操作方面做了什么.

在下文中," - "表示diff(类似于数学中的设定差异,但"AB"表示A中的但不表示B中的表示,而B表示不表示A中的表示,而"+"表示patch(即表示不相交联合)数学.我以前没用过patch,所以我不确定).

从版本控制与Git,由Loeliger,2ed

  1. 命令git cherry-pick commit应用当前分支上的命名提交引入的更改.它将引入一个新的,独特的提交.严格来说,使用git cherry-pick不会改变存储库中的现有历史记录; 相反,它增加了历史.

    在此输入图像描述

    在此输入图像描述

    F'=(FB)+ Z是否正确?

  2. git revert commit命令与命令git cherry-pick commit基本类似,但有一个重要区别:它应用给定提交的反转.因此,此命令用于引入反转给定提交的效果的新提交.

    在此输入图像描述

    在此输入图像描述

    D'= G - D是否正确?

Edw*_*son 6

摘樱桃

F'=(FB)+ Z是否正确?

不,这也会引入C,DE中引入的变化.

git-cherry-pick通过隔离提交中的唯一更改来进行挑选(即,在此示例中为FE,忽略包括合并基础的其他祖先),并将它们应用于目标.

这不是通过补丁应用程序完成的,而是通过使用三向合并算法 - 被挑选的提交的父级将被用作共同的祖先,并且被挑选的提交将是合并的一侧,目标为另一方.这个产品的变化包含在樱桃选择的提交和目标中.

例如,如果E是要挑选的提交的父级,并且其内容(充当共同的祖先)是:

Line 1
Line 2
Line 3
Line 4
Line 5
Run Code Online (Sandbox Code Playgroud)

例如,如果F是要挑选的提交,其内容为:

Line 1
Line 2
Line Three
Line 4
Line 5
Run Code Online (Sandbox Code Playgroud)

樱桃采摘Z的目标是:

LINE 1
Line 2
Line 3
Line 4
Line 5!
Run Code Online (Sandbox Code Playgroud)

然后是三向合并的结果(带有关于每条线来自哪里的注释):

LINE 1
Line 2
Line Three
Line 4
Line 5!
Run Code Online (Sandbox Code Playgroud)

还原

D'= G - D是否正确?

是的,粗略地说.D中独有的更改已从G中删除.像git-cherry-pick,git-revert使用三方合并来实现,不过这次提交恢复为共同的祖先被处理,一边是当前提交,另一边是致力于恢复的母公司.

这意味着当提交还原和当前提交之间的行相同时,将选择来自其父级的行.

如果是D的内容,则revert的提交作为共同的祖先,其内容为:

Line 1
Line 2
Line THREE
Line 4
Line FIVE
Run Code Online (Sandbox Code Playgroud)

和内容Ç(d的父)为:

Line 1
Line 2
Line 3
Line 4
Line 5
Run Code Online (Sandbox Code Playgroud)

G的内容进一步改变,内容如下:

Line One
Line 2
Line THREE
Line 4
Line FIVE
Run Code Online (Sandbox Code Playgroud)

那么三向合并的结果将是:

Line One
Line 2
Line 3
Line 4
Line 5
Run Code Online (Sandbox Code Playgroud)

这是获取父C和目标G中的唯一线的结果.

合并提交

至于torek notes(下面),由于这些机制都涉及使用父提交,因此当有多个父提交时这些机制会中断.(即,有问题的提交是一个合并,并且有多个父项.)在这种情况下,您需要指定git 要考虑哪个父项(使用该-m标志).

冲突

当然,这些机制中的任何一个都可能导致冲突.例如,如果当前冲突进一步发生变化,那么您将不得不解决冲突.例如,如果在恢复示例(上面)中,后续提交也改变了第5行,所以G实际上是:

Line One
Line 2
Line THREE
Line 4
LINE FIVE!
Run Code Online (Sandbox Code Playgroud)

然后就会发生冲突.工作目录(合并文件)将是:

Line One
Line 2
Line 3
Line 4
<<<<<<<
LINE FIVE!
=======
Line 5
>>>>>>>
Run Code Online (Sandbox Code Playgroud)

您需要决定是否需要原始更改(Line 5)或最新更改(LINE FIVE!).

  • 这里还值得补充的是,您不能挑选或恢复合并提交*除非*您告诉 git 将多个父提交中的哪一个用作(假装的单个)前驱节点。当选择“E”或恢复“D”时,您不需要执行此操作,因为它们已经只有​​一个前驱节点。 (2认同)

Cod*_*ard 3

理解起来非常简单:

cherry-pick

选择哪些提交(来自任何分支,甚至可以是松散提交)选择此提交并将其放置在我当前的分支中,换句话说 - 从存储库中的任何位置获取任何提交,将其添加到我的分支


revert

撤消任何提交。-如果您知道什么是补丁,它将通过撤消提交来“恢复”提交中所做的任何更改,这样您就可以将其视为反转补丁中的符号+,反之亦然。您的更改将被“恢复”并且更改将被撤消。

git revert 命令撤消已提交的快照。

但是,它不是从项目历史记录中删除该提交,而是
弄清楚如何撤消该提交引入的更改,并附加一个包含结果内容的新提交。

prevents Git from losing history对于修订历史记录的完整性和可靠的协作非常重要。


F' = (FB) + Z 是否正确?

这只是意味着现在在较低的分支中您还拥有在提交 F 中创建的补丁,您的较低分支包含其更改+在提交 F 中所做的更改(并且只有它们除了 F 之外没有其他提交)


D' = G - D 正确吗?

不完全是 - 这意味着现在您已经提交了 D,并且在几次提交之后您可以撤消该提交,在存储库中您仍然拥有 2 个提交,但代码将保持不变(在 2 个单独的提交上进行更改 + 撤消)