解决大型项目团队中的冲突

Resolving conflicts in a team with a big project

我有兴趣了解在大团队中解决冲突的最佳方法。

例如我有一个 master 分支,团队在其中做了很多更改,然后我从上游 rebase 最新更改(master 和上游没有连接)。我有冲突。问题是团队中有人更了解如何解决一个文件中的冲突,而其他人更了解另一个文件。

所以问题是:是否可以将未解决的分支推送到远程等到同事解决他们本地环境中的冲突并将它们推送回去,然后 git rebase --continue。

如果不是,解决这个问题的最佳方法是什么?

Git 有效,因此您的服务器永远不会发生冲突。

如果在您的本地项目中,当您拉取远程新提交时在一个文件上发生冲突,那是因为您更改了该文件。所以你是最懂得解决矛盾的人。

这就是为什么 git 希望您在推送到服务器之前解决冲突。

简短的回答是否定的,您不能推送有冲突的合并。

稍微长一点的答案是,合并发生在(并通过)git 的 index(也称为 暂存区).索引具有双重作用,作为 next 提交的暂存区,以及作为加速扫描工作树的缓存。出于合并目的,缓存方面大部分可以忽略。

在索引中,每个工作树文件对应的条目最多有四个"slots"(最多三个正在使用),称为stages:

  • 阶段 0 是一个正常的、无冲突的文件。
  • 阶段 1 是冲突文件的共同祖先版本;
  • 第 2 阶段是 "target branch" 版本(基本上是您进行合并时所在分支的版本);和
  • 阶段 3 是 "merge branch" 版本(来自您要合并的分支)。

如果文件没有冲突,阶段1-3为空;如果一个文件有合并冲突,阶段 0 是空的,并且部分或全部插槽 1-3 被填充(取决于特定的合并冲突,一些可能是空的,例如,冲突可能是 "both created" 其中在没有共同祖先的情况下,或者可能是 "modified by them but removed by us" 在这种情况下没有第 2 阶段条目)。

要将文件标记为已解决,您 git addgit rm 它的路径;这将删除阶段 1-3 条目并放入阶段 0 条目(对于 git rm,阶段 0 条目是 "this file is to be gone once we make a commit")。

进行新提交时,git 将暂存区转换为一组 "tree" 对象,这些对象将描述该提交中的所有文件。要从暂存区制作树,它只能有 stage-0 条目;只有那些条目进入树。

当您使用 git pushgit fetch 时,您在存储库之间传输 提交 。只有整个提交(及其树和其他相关对象)才能以这种方式转移。因此,发生在索引中并使用阶段 1-3 的冲突的进程内合并不能跨机器传输。这是今天实施的 git 的基本设计限制。