我试图理解merge和rebase在数学中的集合操作方面做了什么.
在下文中," - "表示diff
(类似于数学中的设定差异,但"AB"表示A中的但不表示B中的表示,而B表示不表示A中的表示,而"+"表示patch
(即表示不相交联合)数学.我以前没用过patch
,所以我不确定).
从版本控制与Git,由Loeliger,2ed
命令git cherry-pick commit应用当前分支上的命名提交引入的更改.它将引入一个新的,独特的提交.严格来说,使用git cherry-pick不会改变存储库中的现有历史记录; 相反,它增加了历史.
F'=(FB)+ Z是否正确?
git revert commit命令与命令git cherry-pick commit基本类似,但有一个重要区别:它应用给定提交的反转.因此,此命令用于引入反转给定提交的效果的新提交.
D'= G - D是否正确?
Edward Thoms.. 6
F'=(FB)+ Z是否正确?
不,这也会引入C,D和E中引入的变化.
git-cherry-pick
通过隔离提交中的唯一更改来进行挑选(即,在此示例中为FE,忽略包括合并基础的其他祖先),并将它们应用于目标.
这不是通过补丁应用程序完成的,而是通过使用三向合并算法 - 被挑选的提交的父级将被用作共同的祖先,并且被挑选的提交将是合并的一侧,目标为另一方.这个产品的变化包含在樱桃选择的提交和目标中.
例如,如果E是要挑选的提交的父级,并且其内容(充当共同的祖先)是:
Line 1 Line 2 Line 3 Line 4 Line 5
例如,如果F是要挑选的提交,其内容为:
Line 1 Line 2 Line Three Line 4 Line 5
樱桃采摘Z的目标是:
LINE 1 Line 2 Line 3 Line 4 Line 5!
然后是三向合并的结果(带有关于每条线来自哪里的注释):
LINE 1 Line 2 Line Three Line 4 Line 5!还原
D'= G - D是否正确?
是的,粗略地说.D中独有的更改已从G中删除.像git-cherry-pick
,git-revert
使用三方合并来实现,不过这次提交恢复为共同的祖先被处理,一边是当前提交,另一边是致力于恢复的母公司.
这意味着当提交还原和当前提交之间的行相同时,将选择来自其父级的行.
如果是D的内容,则revert的提交作为共同的祖先,其内容为:
Line 1 Line 2 Line THREE Line 4 Line FIVE
和内容Ç(d的父)为:
Line 1 Line 2 Line 3 Line 4 Line 5
G的内容进一步改变,内容如下:
Line One Line 2 Line THREE Line 4 Line FIVE
那么三向合并的结果将是:
Line One Line 2 Line 3 Line 4 Line 5
这是获取父C和目标G中的唯一线的结果.
合并提交至于torek notes(下面),由于这些机制都涉及使用父提交,因此当有多个父提交时这些机制会中断.(即,有问题的提交是一个合并,并且有多个父项.)在这种情况下,您需要指定git 要考虑哪个父项(使用该-m
标志).
当然,这些机制中的任何一个都可能导致冲突.例如,如果当前冲突进一步发生变化,那么您将不得不解决冲突.例如,如果在恢复示例(上面)中,后续提交也改变了第5行,所以G实际上是:
Line One Line 2 Line THREE Line 4 LINE FIVE!
然后就会发生冲突.工作目录(合并文件)将是:
Line One Line 2 Line 3 Line 4 <<<<<<< LINE FIVE! ======= Line 5 >>>>>>>
您需要决定是否需要原始更改(Line 5
)或最新更改(LINE FIVE!
).
F'=(FB)+ Z是否正确?
不,这也会引入C,D和E中引入的变化.
git-cherry-pick
通过隔离提交中的唯一更改来进行挑选(即,在此示例中为FE,忽略包括合并基础的其他祖先),并将它们应用于目标.
这不是通过补丁应用程序完成的,而是通过使用三向合并算法 - 被挑选的提交的父级将被用作共同的祖先,并且被挑选的提交将是合并的一侧,目标为另一方.这个产品的变化包含在樱桃选择的提交和目标中.
例如,如果E是要挑选的提交的父级,并且其内容(充当共同的祖先)是:
Line 1 Line 2 Line 3 Line 4 Line 5
例如,如果F是要挑选的提交,其内容为:
Line 1 Line 2 Line Three Line 4 Line 5
樱桃采摘Z的目标是:
LINE 1 Line 2 Line 3 Line 4 Line 5!
然后是三向合并的结果(带有关于每条线来自哪里的注释):
LINE 1 Line 2 Line Three Line 4 Line 5!还原
D'= G - D是否正确?
是的,粗略地说.D中独有的更改已从G中删除.像git-cherry-pick
,git-revert
使用三方合并来实现,不过这次提交恢复为共同的祖先被处理,一边是当前提交,另一边是致力于恢复的母公司.
这意味着当提交还原和当前提交之间的行相同时,将选择来自其父级的行.
如果是D的内容,则revert的提交作为共同的祖先,其内容为:
Line 1 Line 2 Line THREE Line 4 Line FIVE
和内容Ç(d的父)为:
Line 1 Line 2 Line 3 Line 4 Line 5
G的内容进一步改变,内容如下:
Line One Line 2 Line THREE Line 4 Line FIVE
那么三向合并的结果将是:
Line One Line 2 Line 3 Line 4 Line 5
这是获取父C和目标G中的唯一线的结果.
合并提交至于torek notes(下面),由于这些机制都涉及使用父提交,因此当有多个父提交时这些机制会中断.(即,有问题的提交是一个合并,并且有多个父项.)在这种情况下,您需要指定git 要考虑哪个父项(使用该-m
标志).
当然,这些机制中的任何一个都可能导致冲突.例如,如果当前冲突进一步发生变化,那么您将不得不解决冲突.例如,如果在恢复示例(上面)中,后续提交也改变了第5行,所以G实际上是:
Line One Line 2 Line THREE Line 4 LINE FIVE!
然后就会发生冲突.工作目录(合并文件)将是:
Line One Line 2 Line 3 Line 4 <<<<<<< LINE FIVE! ======= Line 5 >>>>>>>
您需要决定是否需要原始更改(Line 5
)或最新更改(LINE FIVE!
).