Git 如何解释分支+;合并优于连续拉动+;推动多人参与的分支?

Git 如何解释分支+;合并优于连续拉动+;推动多人参与的分支?,git,Git,假设有一个分支,多个开发人员正在进行工作,称为TestBranch 现在,有两种(主要)方法可以让多人在此分支上工作。(还有重新定基,但我暂时忽略了这一点) 1: 开发人员进行更改 在推送之前,他们使用git pull origin TestBranch(或者只是git pull)从其他人那里获取最新的更改 处理任何合并冲突 git-push-origintestbranch(或者只是git-push),这样其他人都可以得到他们的更改 2: git checkout-b MyBranch(

假设有一个分支,多个开发人员正在进行工作,称为
TestBranch

现在,有两种(主要)方法可以让多人在此分支上工作。(还有重新定基,但我暂时忽略了这一点)

1:

  • 开发人员进行更改
  • 在推送之前,他们使用
    git pull origin TestBranch
    (或者只是
    git pull
    )从其他人那里获取最新的更改
  • 处理任何合并冲突
  • git-push-origintestbranch
    (或者只是
    git-push
    ),这样其他人都可以得到他们的更改
2:

  • git checkout-b MyBranch
    (或一个分支,然后是checkout)来创建自己的个人分支
  • 当他们完成了一个子任务时,他们会执行
    git checkout TestBranch
  • git pull
    获取
    TestBranch
    上的最新更改(不会触发任何合并,因为它们没有触及
    TestBranch
    ,只是一个
    快进
  • git merge MyBranch
  • 处理任何合并冲突
  • git推送origintestbranch
    这样其他人都可以得到他们的更改
第二种方法总体上需要更多的工作,但是option#1的git历史是一场噩梦,特别是对于不止两个开发人员来说。这是一个由纵横交错的线组成的巨大领域,大量的节点不是真正的内容,等等

我该怎么解释呢?有没有一个好的例子,也许是一张图片,可以说明为什么从长远来看做1是个坏主意


(或者,如果我错了,请尽管告诉我)

首先,以下是我的个人观点,我从经验中知道,讨论git工作流可能是一个非常热门的话题,因为有些决定是符合口味的


然而,已经有一些(非常常见的)分支策略(工作流)来处理这个和其他问题。对一些模型有很好的概述

对于您的具体问题,如果您希望有一个干净的git历史记录,并且只处理一个分支,那么您是否考虑过在
git push
之前执行
git pull--rebase
(假设您正在处理
TestBranch
)?这将为您提供一个“良好”且直接的提交历史记录,而不会引入任何开销(无论如何都需要修复合并冲突)

如果人们处理特定的块(比如新特性或错误修复),引入“特性”或“修复”分支通常是个好主意,类似于(2)中的建议。这也为提交增加了一个很好的范围,所以当分支有一个明确的名称时(比如说
功能/工具提示
),您可以立即知道在哪里也可以查找该功能的更改。与您的建议不同的是,分支的范围不是由处理它的用户确定的,而是由它包含的特性/修复程序确定的。因此,这可能会导致多个(但通常很少,因为这些分支应该是短期的)开发人员在一个分支上工作


另外,如果我正确理解了您的两种方法,那么这两种方法将创建相同数量的合并冲突和分支,因此我看不出(2)有什么改进。

使用rebase拉是#1的简单性,没有糟糕的提交历史记录。老实说,对于分支寿命很短的情况,这是一个很好的解决方案。(简单的修复,无需长时间计划就可以来回工作,等等)。我在想这是否会有问题,但我看不出有什么直接的问题。谢谢我以前使用过它,但在这个案例中没有想到。我们目前工作场所的设置是一个名为
develope
的“主”分支,它有一个
git pull--rebase
-
git push
工作流,用于直接提交到分支(通常是短期修复/feaures)。更大的更改会进入它们自己的作用域分支。这是一个非常常见的工作流(称为
gitflow
),使用它一段时间后,我也看不到任何问题,而且有人可能(完全!)不理解重定基址的概念(一开始不容易)。有没有好的方法来论证这种工作流为什么好?这是原始问题的一个重要部分。它正在避免哪些常见的陷阱?或者解释已经在Atlassian上了。我强烈建议阅读Atlassian的文章,但是,我认为最大的优势是非常干净的git历史,便于跟踪更改。如上所述,添加特定于主题的特性和修复分支还增加了另一个级别的范围(在某种意义上通常意味着顺序)。根据您将如何合并功能分支(有几个选项,“最干净”的选项可能是将分支重新定位到
develope
,然后将合并或压缩提交到
develope
,这将产生一个非常容易理解的日志。