【问题标题】:Git centralized workflowGit 集中式工作流程
【发布时间】:2015-06-22 06:57:10
【问题描述】:

假设开发者正在使用 git 集中式工作流,并且 github 有 2 个文件 a.txt 和 b.txt。

现在 dev1 成功推送 c.txt。 现在如果 dev2 推送 d.txt,它是非快进的,他不能推送,所以,因为他必须先在本地合并 dev1 的更改,然后再推送。

现在另一种情况, 假设 dev1 创建分支 featureC 并在其中包含文件 c.txt 以及 a.txt、b.txt 和推送。 类似的 dev2 创建分支 featureD 并在其中包含文件 d.txt 以及 a.txt、b.txt 和推送。

现在提出了将 featureC 与 master 合并的请求,并且成功了。 再次提出拉取请求以将 featureD 与 master 合并,这不应该成功,但它是。不可能!!怎么会这样?不符合上面的场景吗?

【问题讨论】:

  • dev1 和 dev2 是否在 github 或本地 git 存储库中创建文件
  • 在本地 git repo 并推送到 github。

标签: git workflow centralized


【解决方案1】:

推和拉之间有很大的区别。当您想将提交推送到远程分支时,您的本地仓库需要来自远程的所有提交,当然还有您要推送的提交。当 dev2 推送 d.txt 的提交时,情况并非如此,而对之前的提交一无所知,它引入了 c.txt。

现在有了拉取请求,情况就不同了。您始终可以保存任何不冲突的内容,即提交仅影响不同文件的情况。

实际上这是一个拉取请求,在你的第一种情况下,当 git 告诉 dev2 在他推送之前拉(合并)。

当没有冲突时,您始终可以拉(快进或合并),但只有在您的分支与您想要推送到的远程分支保持最新时,您才能推送。

如何理解被提交的内容

本地存储库中的开发人员很容易查看提交实际请求的更改。假设 dev1 分支到 featureA 以从 master 开发一些功能,今天早上。晚上他想看看他所做的所有更改,当他签到时,他会这样做

git format-patch master..featureA

所有按顺序编号的提交都写入文件NUMBER-TITLE.patch

无论origin/master的状态如何,所有这些补丁都可以合并到origin/master(如果已经有新的更改到origin/master,或者没有),当没有补丁无法应用于origin/master时,订购按数字。

【讨论】:

  • 感谢您回答 Ikrabbe。我刚刚在本地创建了一个 featureE 分支。其中我删除了 a.txt,更改了 b.txt 并添加了 e.txt。现在我成功地将这个分支推送到了 github,然后创建了拉取请求来将该分支合并到 master。现在这必须根据您的意见发生冲突,因为我们正在对同一个文件进行更改,但事实证明,它并不冲突。我想无论我在一些新分支中放入什么并将其推送并通过拉取请求合并它,github 都不会抱怨。这似乎不是适当的行为。
  • @GaurangaRathod:为什么不合适?你在一个分支工作,你说你想把这些改变变成master。为什么会失败?更改是什么,删除,修改,添加,......合并到master是说你想要分支的所有更改到master
  • @GaurangaRathod 我没有说对同一个文件的更改会发生冲突,但我说对不同文件的更改永远不会发生冲突。对同一文件的更改可能会发生冲突,也可能不会。假设您仅在 HEAD 顶部提交,则一个提交也永远不会发生冲突,因为没有任何冲突。但是如果你想合并两个从相同状态创建的提交,它们可能会发生冲突。例如,当您发送拉取请求以删除 a.txt 和拉取请求以更改 a.txt 时,当您想要合并这两者时,您会遇到冲突。
  • 哦,是的,你是对的。我创建了两个拉取请求,它们以不同的方式更改同一个文件,一个拉取请求由于冲突而无法自动合并。再次感谢您的帮助:)
【解决方案2】:

你描述的情况

开发1:

a---b - master
     \
      c - featureC

开发2:

a---b - master
     \
      d - featureD

集中式回购:

a---b - master

在您的第一个场景中(您似乎同意),看起来两个开发人员都试图直接推送到集中式 repo 上的同一个分支:

dev1 将其本地master 推送到集中式后:

a---b---c - master

如果 dev2 在本地有 a---b---d - master 并尝试将其推送到集中式存储库上的 mastergit 会抱怨。应该怎么做?

这个:

a---b---d - master #nope

会出错,因为c 已被丢弃。

这个:

a---b---c    #nope
     \
      +---d

也会出错,master 应该指向哪里? git 没有办法知道。因此,master 的投诉出现了分歧。


现在进入第二个场景。

我会假设拉取请求会导致集中式存储库中的拉取。

"pull request 将 featureC 与 master 合并成功":

集中式回购:

      c - featureC
     / \
a---b---x - master

然后“拉取请求将featureD与master合并”:

      c - featureC
     / \
a---b---x---y - master
     \     /
      +---d - featureD

我看不出为什么这不起作用!由于在集中式仓库中,featureD 被合并到一个最新的master 中,而master 没有分叉。

【讨论】:

  • 感谢您回答 Gauthier。但在场景 2 中,在本地创建功能分支,然后将 featureC 和 featureD 都推送到 github。到目前为止没有问题。但是当这些分支使用拉取请求与 github 中的 master 合并时,仍然没有抱怨并且工作正常,这就是我所关心的。
  • @GaurangaRathod:好的,所以我更新了日志图。在集中式存储库中将D 合并到master 仍然没有问题(在这种情况下pull 实际上是merge,因为D 已经在存储库中)。 masterx 上,你将Dmaster 合并,得到ymaster 不会与此工作流程发生分歧,分歧就是它在您的第一个场景中失败的原因。
  • 我知道master没有分歧,所以它不会冲突,但是你能给我一个场景,我把一些东西放在我新创建的分支中,把它推送到github,当我合并它时通过拉取请求,它抱怨。我认为这是不可能的。
  • 不,这是不可能的。这是它应该工作的方式。只有当您将两个不同的东西推送到同一个分支而不是第二次更新时,您才会遇到问题。
  • “只有当你将两个不同的东西推送到同一个分支而没有第二次更新时,你才会遇到问题”。同意这一点,但创建分支并通过拉取请求合并它们本质上也是合并。那么为什么在那种情况下没有冲突???
猜你喜欢
  • 1970-01-01
  • 2012-11-03
  • 2017-06-09
  • 2010-10-25
  • 2015-05-16
  • 2021-10-11
  • 2012-01-14
  • 2014-11-02
  • 2011-11-23
相关资源
最近更新 更多