Git/Gitflow 同一文件中的不同特征

Git/Gitflow different features in the same file

最近我开始使用 gitflow,我非常喜欢它的功能方法。大多数情况下我会做这样的事情:我开始一个新功能,我在一个单独的文件中实现它的逻辑,我 git add > commit 等。然后我完成我的功能并合并回来做 develop。完全没问题。

但过了一段时间我遇到了一些问题。例如,我有一个文件 FormMain.cs,它基本上类似于 WinForms 中我的 GUI 的 Controller。所以有很多像buttonABC_ClickbuttonXYZ_Click这样的事件。

假设我的 GUI 上只有两个按钮(但非常重要)-> ABC 和 XYZ。我想实现点击按钮 ABC 的逻辑。没问题。我开始一个新功能,我做了一些提交。如果我完成它、推送、合并等等,那么开始处理按钮 XYZ 的功能就没有问题了。

但是如果我没有完成该功能 -> f.e。它需要一些测试,或者它甚至必须以某种方式处理单击按钮 XYZ 的逻辑,我没有 finish 该功能。麻烦来了。如果我开始一项新功能,我基本上会从 develop 开始(它仍未与 feature/buttonABC 合并)。所以我没有之前在 feature/buttonXYZ 上为 buttonABC 编写的任何代码。然后如果我 f.e 想完成 feature/buttonXYZ -> 没问题,它会起作用。但是如果我想完成 feature/buttonABC -> 合并会有问题,因为在 feature/buttonABCbuttonXYZ_Click 函数是空的,但是在之前合并的 develop 上(与feature/buttonXYZ) 有一些代码,所以我们有合并冲突。

所以我的问题是:我能以某种方式解决这个问题吗?或者也许我不应该在一个文件中执行多个功能?

您概述的场景不应导致合并冲突;事实上,这正是合并的目的。

因此您在 ABC 开始工作(从 develop),后来您在 XYZ 开始工作(从 develop)。

            X -- Y <--(featureXYZ)
           /
x -- x -- D <--(develop)
           \
            A -- B <--(featureABC)

两个分支都没有另一个分支的工作 - 这就是分支的意义所在。

你完成 XYZ 并合并它。

            X -- Y -- Z <--(featureXYZ)
           /           \
x -- x -- D ----------- M1 <--(develop)
           \          
            A -- B <--(featureABC)

现在你完成了 ABC 并且想合并它,同样得到

            X -- Y -- Z<--(featureXYZ)
           /           \
x -- x -- D ----------- M1 -- M2<--(develop)
           \                 /
            A ----- B ----- C <--(featureABC)

现在 featureABC 确实没有 XYZ 函数中的代码。但更重要的是,featureABC 并没有 改变 XYZ 功能。所以合并是这样的:

就在合并之前

            X -- Y -- Z<--(featureXYZ)
           /           \
x -- x -- D ----------- M1 <--(develop)
           \                 
            A ----- B ----- C <--(featureABC)

您已经签出 develop 并且您说 git merge featureABC。所以 git 说想要识别三个提交:一个是 "ours",一个是 "theirs",一个是 "base"。您在 develop,所以 develop 是 "ours"。而你说合并到featureABC,所以featureABC就是"theirs".

合并基础(或多或少)是 "ours" 和 "theirs" 最近的共同祖先。查看我们的图表,我们可以看到这是 D - 创建任一分支之前的 develop 提交。

那么git就是要计算"our changes"——"base"和"ours"的差,也就是"add code to function XYZ"。然后它会找到"their changes"——"base"和"theirs"的区别,也就是"add code to function ABC".

现在它将尝试将 "our changes" 和 "their changes" 应用到 "base",其结果将是合并结果。只有当 "our changes" 之一触及与 "their changes".

之一相同的代码时,才会存在冲突

好吧 "our changes" 将代码添加到 XYZ 但不要说 ABC; "their changes" 向 ABC 添加代码,但对 XYZ 只字未提。所以没有冲突,合并工作就像它应该的那样。