Git/Gitflow 同一文件中的不同特征
Git/Gitflow different features in the same file
最近我开始使用 gitflow
,我非常喜欢它的功能方法。大多数情况下我会做这样的事情:我开始一个新功能,我在一个单独的文件中实现它的逻辑,我 git add > commit
等。然后我完成我的功能并合并回来做 develop
。完全没问题。
但过了一段时间我遇到了一些问题。例如,我有一个文件 FormMain.cs
,它基本上类似于 WinForms
中我的 GUI 的 Controller
。所以有很多像buttonABC_Click
或buttonXYZ_Click
这样的事件。
假设我的 GUI 上只有两个按钮(但非常重要)-> ABC 和 XYZ。我想实现点击按钮 ABC 的逻辑。没问题。我开始一个新功能,我做了一些提交。如果我完成它、推送、合并等等,那么开始处理按钮 XYZ 的功能就没有问题了。
但是如果我没有完成该功能 -> f.e。它需要一些测试,或者它甚至必须以某种方式处理单击按钮 XYZ 的逻辑,我没有 finish
该功能。麻烦来了。如果我开始一项新功能,我基本上会从 develop
开始(它仍未与 feature/buttonABC
合并)。所以我没有之前在 feature/buttonXYZ
上为 buttonABC 编写的任何代码。然后如果我 f.e 想完成 feature/buttonXYZ
-> 没问题,它会起作用。但是如果我想完成 feature/buttonABC
-> 合并会有问题,因为在 feature/buttonABC
上 buttonXYZ_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
只字未提。所以没有冲突,合并工作就像它应该的那样。
最近我开始使用 gitflow
,我非常喜欢它的功能方法。大多数情况下我会做这样的事情:我开始一个新功能,我在一个单独的文件中实现它的逻辑,我 git add > commit
等。然后我完成我的功能并合并回来做 develop
。完全没问题。
但过了一段时间我遇到了一些问题。例如,我有一个文件 FormMain.cs
,它基本上类似于 WinForms
中我的 GUI 的 Controller
。所以有很多像buttonABC_Click
或buttonXYZ_Click
这样的事件。
假设我的 GUI 上只有两个按钮(但非常重要)-> ABC 和 XYZ。我想实现点击按钮 ABC 的逻辑。没问题。我开始一个新功能,我做了一些提交。如果我完成它、推送、合并等等,那么开始处理按钮 XYZ 的功能就没有问题了。
但是如果我没有完成该功能 -> f.e。它需要一些测试,或者它甚至必须以某种方式处理单击按钮 XYZ 的逻辑,我没有 finish
该功能。麻烦来了。如果我开始一项新功能,我基本上会从 develop
开始(它仍未与 feature/buttonABC
合并)。所以我没有之前在 feature/buttonXYZ
上为 buttonABC 编写的任何代码。然后如果我 f.e 想完成 feature/buttonXYZ
-> 没问题,它会起作用。但是如果我想完成 feature/buttonABC
-> 合并会有问题,因为在 feature/buttonABC
上 buttonXYZ_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
只字未提。所以没有冲突,合并工作就像它应该的那样。