【问题标题】:Best practice for Pull Requests on GitHubGitHub 上拉取请求的最佳实践
【发布时间】:2015-05-06 22:47:44
【问题描述】:

我已阅读 this 和 this 的讨论,但仍然无法理解在 GitHub 上进行协作的最佳方式。

假设我已经分叉了一个 repo 并独立开发它(原始 repo 有一段时间没有激活)。所以我确实有自己的develop 分支,我在其中进行所有更改:从feature 分支,在那里开发,然后合并回develop。有时我想向原始仓库提交 PR。但是我不能从feature 做 PR,因为它会包含develop 的所有历史记录。所以我就是这样做的:

  • 结帐master 跟踪原始回购
  • 分支
  • 从feature 挑选樱桃并将其推送到 GitHub
  • 提交 PR

当这些 PR 合并到原始 repo 的 master 时,我会从中提取,然后将 master 合并到 develop。

它工作得很好,但它会导致在我自己的 repo 中多次提交相同的提交,所以我不确定挑选樱桃是否是最好的方法?

从master 分支可能会更好,但通常情况下,我完成了依赖于功能1 的功能2;并且 feature-1 仍在等待 PR 被合并,但还没有在 master 中。

如果有任何建议和示例,我将不胜感激。

【问题讨论】:

  • 不是一个真正的答案,但这也是我一直在使用拉取请求的方式。如果您自己的 repo 在 upstream 之前,您必须分支 upstream 的 master 分支以避免拉入所有更改。我还使用cherry-picking在我的fork和pull request的分支之间移动更改。

标签: git github pull-request git-fork


【解决方案1】:

理论上,这始终取决于您正在从事的项目以及项目负责人。

一般来说,您只有在发布版本或可以至少无错误编译的东西时才提交 master。但是有些项目只是把所有东西都扔给master。

真的,在我自己的项目中,你的拉取请求应该放在主项目的 develop 分支中,然后到时候,所有来自 develop 的东西都会合并到 ma​​ster。

您的工作流程基本上会保持不变。从 develop 分支创建一个新的 feature-X,提交到 feature-X,然后您将在 上提交拉取请求功能-X。一旦合并到 develop 中,您将把它拉下来,然后继续工作;或者只是将它合并到您的个人叉子上并继续工作,git 应该明白。一旦项目负责人认为项目处于下一个版本中,他/她就会将开发合并为 master。

看看这 5 分钟的阅读:Understanding the GitHub Flow。

【讨论】:

  • Ryen,感谢您的回答。也许我不够清楚 - 主/开发分离并不是一个真正的问题 - 通常我遵循 gitflow 范式。我感兴趣的是 - 如何仅为 feature-X 发送拉取请求,因为我的 develop 远远领先于原始存储库?我使用樱桃采摘,但这是最好的方法吗?
【解决方案2】:

我同意 Ryen 的观点,这取决于什么项目。

在我的工作中,我们提出了一个我们都同意的非常好的系统。

  1. 从最新的 master 开始。
  2. 从事您的开发或功能工作
  3. git add -p(用于您的更改)或git add <filename> 用于新增功能
  4. git checkout -b new-branch-name
  5. git commit -m "whatever you feel should be said"
  6. git pull -r origin master
  7. git push origin new-branch-name
  8. 打开一个公关,等待2个批准
  9. 合并到master
  10. 删除新的分支名称

之后,我们只需回到 master 并重复。如果有人请求更改,我们将存储我们正在处理的任何内容并 checkout new-branch-name,进行请求的更改,再次执行 git pull -r origin master,然后执行 git push -f origin new-branch-name,然后是 checkout master 和 git stash pop。有时您确实会遇到需要所做更改的地方,在这种情况下,我们只是继续处理该新分支名称,而不是在本地删除它,仅在 github 或您使用的任何地方删除它。

我知道我有点打破了巴尼风格,但我不想错过任何东西。随意使用它。它对我们也很有效,因为我们经常交谈和合作。至于分叉的 repos 和 prs,只要你对你所做的工作感到满意,就打开一个 pr。我不完全同意整体,将 master 分支到 dev 分支,然后再分支。 Master应该随时准备好,然后如果你坚持那些prs,你就不用担心了。此外,如果您害怕大型公关,请随意要求多个人对其进行审核,而不必只是两个人。我们只有 6 人,所以 2 人为我们工作。希望对您有所帮助。

【讨论】:

    【解决方案3】:

    鉴于 OP 对 Ryen Nelsen 的回答发表的评论:

    ... master/develop 分离并不是一个真正的问题——通常我遵循 gitflow 范例。我感兴趣的是 - 如何仅发送功能 X 的拉取请求,因为我的开发远远领先于原始存储库?我使用樱桃采摘,但这是最好的方法吗?

    我会问 - 你的 develop 分支远远领先于原始存储库是什么意思(从现在开始我将称之为 master 分支)?您的develop 分支中的所有其他内容是什么?

    听起来您正在完成develop 的重大开发,短期内不会进入master。在这种情况下,为您正在处理的每个 Pull Request/issue/enhancement 创建一个单独的功能分支,并将其提交给master。

    如果你小心,你可以最小化你的各个特性分支之间的差异,包括引用中讨论的相互依赖关系。例如,假设您正在维护develop 并尝试向master 提交拉取请求以获取fea1 和fea2。

    • 设置 2 个功能分支 off of master 和 Cherry-pick 或 Rebase out of development 到 fea1 和 fea2 直到它们拥有您需要的基础现有的develop 更改以进行修复。
    • 如果存在相互依赖关系,这仅意味着您将为每个功能分支挑选一些相同的提交,或者最终开发将在两个功能分支之间合并或重新定位的新代码。
    • 为fea1 和fea2 开发新的修复程序,并根据需要合并(或变基/压缩)develop。在这种情况下合并,你是唯一在这个 repo 中开发的人,这很简单——你一次只能处理develop、fea1 或fea2 之一,所以合并真的会是处理无论如何都必须解决的冲突...

    准备好拉取请求后,您可以将 fea1 和 fea2 留在各自的分支中,并继续分别处理 develop。同时,随着 Pull Requests 获得反馈,您可以随时检查 fea1 或 fea2 并更新它们,可能需要从 fea1 合并到 fea2 或反之亦然,并且可能还需要合并新的提交(s ) 回退以进行开发,使其保持最新状态。

    一旦 PR 被接受,您就可以在您的存储库中的相应私有功能分支上清理您需要的任何内容,并确保任何最终合并到另一个分支和 develop 都已完成。

    然后您可以删除功能分支,但就个人而言,我会标记最后一次提交,以便将来如果需要我可以返回它,然后删除分支引用。这样你就可以回到一个可能比develop 更接近master 的提交,尽管取决于过去了多少时间,也许不是——至少你会有一个选择。例如,如果您的 PR 中的缺陷进入 master, 并且打开了一个您可以快速解决的新问题,但其他人需要更长的时间,就会发生这种情况。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2020-04-19
      相关资源
      最近更新 更多