Git 如果源(要素)分支不久后被删除,--squash合并和--no ff合并之间有区别吗?

Git 如果源(要素)分支不久后被删除,--squash合并和--no ff合并之间有区别吗?,git,Git,如果源(功能)分支随后立即被删除,那么--squash合并和--no ff合并之间是否存在关于存储库最终状态的差异 --no ff merge commit将包含与挤压合并commit相同的更改,对吗 是的,更改将与生成的代码库相同 不同的是提交历史记录。这可能会影响某些日志输出,挤压路径将使原始提交在要素分支删除后无法检查 另一方面,no-ff路由将具有更详细的历史记录。将提交想象为图形中的节点(因为它们是图形中的节点) 在做任何其他事情之前,您会遇到如下情况: ...--F--G--H

如果源(功能)分支随后立即被删除,那么--squash合并和--no ff合并之间是否存在关于存储库最终状态的差异


--no ff merge commit将包含与挤压合并commit相同的更改,对吗

是的,更改将与生成的代码库相同

不同的是提交历史记录。这可能会影响某些日志输出,挤压路径将使原始提交在要素分支删除后无法检查


另一方面,no-ff路由将具有更详细的历史记录。

将提交想象为图形中的节点(因为它们是图形中的节点)

在做任何其他事情之前,您会遇到如下情况:

...--F--G--H   <-- master
            \
             I--J--K   <-- feature
...--F--G--H   <-- master
         \
          I--J--K   <-- feature
(或类似)。新提交
M
的第一个父级是现有提交
H
:之前是
master
的提示。新提交
M
的第二个父项是现有提交
K
:即过去是,现在仍然是
功能的提示

(如果您的起始图类似于第二个示例,其中
功能
master
共享的第一个提交是
G
,而不是
H
,则不需要
--no ff
参数。Git必须执行真正的合并,因此它会执行。如果您的起始图类似于第一个示例,则
--no ff
强制Git进行真正的合并,即使公共起始点commit已经是
master
的提示)


如果运行的是
git merge--squash
而不是
git merge--no ff
,则会得到以下结果:

...--F--G--H---------S   <-- master
            \
             I--J--K   <-- feature
以及:


这就是压缩合并和真正合并之间的最大区别:真正合并保留完整的历史记录,包括导致生成合并的各个提交。压缩合并丢弃导致生成压缩合并的历史记录,只保留一个提交,该提交达到与编写压缩的人相同的效果合并代码是通过坐下来处理
H
中的代码来完成的,将所有内容编写为一个提交,然后提交。

当使用--no ff路由时,在删除功能分支后,原始提交不是也无法访问吗?@jornvanloofsvlet否,它们将合并到目标分支(master?)中如果我理解正确,功能分支(作为指针)可能被删除,但该功能分支的提交仍将存在,并在运行git日志时显示在主分支的历史记录中。对吗?从TFS中,我希望功能分支的所有更改都在合并提交中压缩。并且主分支的历史记录不会显示功能分支的提交。W如果你检查其中一个提交的变更集,它不会显示它属于哪个分支吗?但是由于该分支已被删除…@jornvanloofsvlet不,分支只是git中的轻量级指针,它们指定了一个提交,仅此而已。最终只有提交才起作用。合并提交不会包含以前的通信带来的更改事实上,它只允许git通过形成祖先链来追溯历史。而且,不,提交从不“属于”任何分支。它被称为“可访问”任何数量的分支,数量也可以为零。很好的解释,git日志在真正合并的情况下是什么样子的?来自两个分支的提交是否可能交错(好像按提交时间排序)。功能分支上的提交会导致合并冲突,但从未发生过,因为主分支在最终合并之前被修改过。那么提交的时间顺序是否仍然有意义?@jornvanloofsvlet:看,但它有点不完整。描述中遗漏的是
git-log
中的实际实现是使用优先级队列。优先级队列最初包含您在开始时指定的每个提交的条目:
git-log-master-dev
选择由
master
dev
标识的两个提交,并将它们放在队列中,或者
git-log
不带参数s选择一个由
HEAD
标识的提交,并将其放入队列中。然后……在从队列中取出一个提交并访问它时,修订行者将该提交的父级添加到队列中(除非它们已经存在/访问过)。队列中父级的优先级以及队列中已存在的所有其他提交(如果有)受排序选项的影响。所有这一切的效果是,对于简单的线性链,
git log
从末尾开始(队列中有1个提交),删除1个提交,显示它,将其1个父级放入,删除1个父级,显示它…因此,只有从多个提交开始或达到合并时,您才能看到此队列的效果。默认排序为“按提交者日期”,因此您的问题的答案(“可能是交错的,就像按提交者时间排序一样”)是的。但是有办法改变这一点。
...--F--G--H---------S   <-- master
            \
             I--J--K   <-- feature
...--F--G--H---------M   <-- master
            \       /
             I--J--K
...--F--G--H---------S   <-- master
            \
             I--J--K
...--F--G--H---------S   <-- master