Tim*_*Tim 6 git git-revert git-cherry-pick
我试图理解merge和rebase在数学中的集合操作方面做了什么.
在下文中," - "表示diff(类似于数学中的设定差异,但"AB"表示A中的但不表示B中的表示,而B表示不表示A中的表示,而"+"表示patch(即表示不相交联合)数学.我以前没用过patch,所以我不确定).
从版本控制与Git,由Loeliger,2ed
F'=(FB)+ Z是否正确?
不,这也会引入C,D和E中引入的变化.
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!).
理解起来非常简单:
cherry-pick选择哪些提交(来自任何分支,甚至可以是松散提交)选择此提交并将其放置在我当前的分支中,换句话说 - 从存储库中的任何位置获取任何提交,将其添加到我的分支
revert撤消任何提交。-如果您知道什么是补丁,它将通过撤消提交来“恢复”提交中所做的任何更改,这样您就可以将其视为反转补丁中的符号+,反之亦然。您的更改将被“恢复”并且更改将被撤消。
git revert 命令撤消已提交的快照。
但是,它不是从项目历史记录中删除该提交,而是
弄清楚如何撤消该提交引入的更改,并附加一个包含结果内容的新提交。这
prevents Git from losing history对于修订历史记录的完整性和可靠的协作非常重要。
F' = (FB) + Z 是否正确?
这只是意味着现在在较低的分支中您还拥有在提交 F 中创建的补丁,您的较低分支包含其更改+在提交 F 中所做的更改(并且只有它们除了 F 之外没有其他提交)
D' = G - D 正确吗?
不完全是 - 这意味着现在您已经提交了 D,并且在几次提交之后您可以撤消该提交,在存储库中您仍然拥有 2 个提交,但代码将保持不变(在 2 个单独的提交上进行更改 + 撤消)