-1

我有一个关于 GitHub 流程的问题,特别是关于如何管理同时开发的多个功能的问题。

假设我们有一个简单的 CSS 文件。

.container{
    height: 500px;
    width: 500px;
    background-color: blue;
    color: white;
}

假设开发人员 A 负责将背景颜色更改为红色,而开发人员 B 负责将字体颜色更改为黑色。

开发人员 A 创建其功能分支“red-background”,更新 CSS 文件并在其分支中提交更改。“red-background”分支中的 CSS 文件现在是:

.container{
    height: 500px;
    width: 500px;
    background-color: red;
    color: white;
}

开发人员 B 创建其功能分支“black-font”,更新 CSS 文件并在其分支中提交更改。“black-font”分支中的 CSS 文件现在是:

.container{
    height: 500px;
    width: 500px;
    background-color: blue;
    color: black;
}

现在,如果审阅者将“red-background”合并到 main,然后将“black-font”合并到 main,则会出现 git-merge 冲突:

.container{
    height: 500px;
    width: 500px;
<<<<<<< HEAD
    background-color: red;
    color: white;
=======
    background-color: blue;
    color: black;
>>>>>>> black-font
}

在这些情况下如何避免冲突?

4

2 回答 2

1

在这些情况下如何避免冲突?

不要使用 Git 进行协作。

说真的,这就是 Git 所做的。如果您想“避免”它,请避免使用 Git,除非是退化的用途,例如只有一个人可以访问存储库。如果您要进行协作,有时您会遇到合并冲突。一个人换一条线,另一个人换一条相邻的线,这就是冲突。这就是生活。

但冲突也不错。它们不是要避免的事情。因此,忽略您的实际问题,另一种解决方案是:不要避免它们。解决冲突。Git 正在寻求您的帮助。帮助 Git,继续生活。

一种使历史更清晰的常用技术是在合并 PR 之前反向合并。这样,可能仍然存在要解决的冲突,但是您在反向合并期间解决它,在 PR 分支上的提交中,并且实际合并到主分支,关闭 PR,没有冲突。但是,再一次,你并没有“避免”冲突。你正在管理它,这不是你要求做的。

于 2021-09-08T10:09:00.600 回答
0

@Matt 提供了一个部分正确的答案。它指出你不应该避免合并,你应该解决它们,这是正确的。

但是,它还指出,如果您想避免合并冲突,则应避免使用 git。这是错误的一点。如果两个用户编辑同一个文件,那么您就有合并冲突。Git 只是强调该冲突并试图帮助您解决它。扔掉 Git 并不能解决根本问题,即 2 个人编辑了同一个文件。

实际上,您可以做一些事情来让您的生活更轻松,但首先您必须承认您的工具是可用的最好的工具之一,并且被数百万使用它们成功开发系统的开发人员使用。这些工具不应该受到责备,您必须学会使用它们而不觉得它们是问题所在。

避免持续冲突的一种方法是拆分文件。使用 CSS 非常简单,因为 CSS 类会自动合并。这可能会使找到进行更改的位置变得更加困难,但是使用现代工具,搜索代码并找到正确的位置非常容易。

另一种方法是将文件的控制权分配给单个开发人员,例如,一个文件中的所有 CSS 更改都交给一个人,另一个文件中的所有 CSS 更改都交给另一个人。或者,您可以将所有 CSS 更改分配给一个人,让另一个人处理其他事情。

您总是可以让处理同一个文件的工程师实际配对并一起进行更改。无论如何,这将提高质量和吞吐量,并且配对被认为是避免错误的最有效方法之一。最终,这实际上是预合并:一种避免冲突的技术。

我曾经与一个由 10 名工程师组成的团队一起工作,他们的代码库小而密集。我们将通过在更改中心文件时调用来避免重大冲突,例如主 CSS,以防止其他人发布更新,直到原始更改集合并到 main.css 中。然后他们可以将 main 合并到他们的功能分支中(根据 git-flow),然后发出他们的拉取请求。

最终,所有避免合并冲突的努力都注定会失败,因此有必要学习如何快速有效地合并。这并不难。如果你们两个人在处理同一个文件,其中一个与 main 合并,然后第二个工程师将 main 合并到他们的代码中,然后结果再次快速转发到 main。大多数情况下,它既不难也不费时。

于 2021-09-08T19:13:03.410 回答