【问题标题】:How to contribute to a project you've forked?如何为您分叉的项目做出贡献?
【发布时间】:2015-01-16 16:03:41
【问题描述】:

假设我已经 fork https://github.com/user/proj.git 并在我的 fork(主分支)上进行了重大开发。

我想解决上游遇到的问题(我没有在我的 fork 中解决)。如果我理解正确的话,我应该从上游的最后一次签入到他们的 master 上创建一个特性分支:

git fetch upstream
git checkout upstream/master
git checkout -b my_new_feature

这些命令中的第二个让我知道我处于“分离 HEAD”状态。这是我需要关心的任何事情(了解执行此任务)吗?

现在我进行更改,然后是 git addgit commit 更改的文件,然后是 git push 到 github,但是当我创建拉取请求时,我被告知我的拉取请求无法自动合并,因为我所做的更改与在我执行git fetch 后签入upstream/master 的更改之间存在冲突。

冲突的更改在语义上是等效的,所以我想推迟到upstream/master 的版本。在解决冲突时,我如何从upstream/master 拉取请求(这就是我想要做的,对吗?)? (如果这有助于回答,我精通 Subversion 和 git 新手..)

【问题讨论】:

    标签: git github


    【解决方案1】:

    这个拉取请求是否有问题,因为它包含与我分支后对上游/主服务器所做的更改的冲突

    “为他提供一个适当的 rebase 分支”所需的步骤?

    “正确的 rebased 分支”是指基于 upstream/master 的分支(其中 upstream 是您 fork 的原始 repo 的名称)

    git fetch upstream
    git checkout myBranch
    git rebase upstream/master
    

    (我也在“Pull new updates from original Github repository into forked Github repository”中描述了该步骤)

    如果您想清理一下分支的历史记录,您也可以进行变基交互 (git rebase -i)

    这样,您可以解决本地克隆中的任何冲突,并 git push --force 您的分支到您的 fork。
    如果您已经有一个 PR(拉取请求)正在进行中,它将自我更新,以考虑到您的重新定位分支的修订历史记录。

    目标仍然是原始项目的维护者将您的分支合并到他/她的主分支中,并通过简单的合并(0 冲突)来实现。

    【讨论】:

      【解决方案2】:

      完成 Thorbjørn Ravn Andersen 的回答和评论:

      首先,您应该为维护者提供一个无痛的合并,这意味着保持最新的 master 分支。

      当维护者合并一个拉取请求时,他可以选择以下方式:

      • 将其压缩为一个提交。
      • 将拉取请求树合并为一个整体。

      在第一个选项中,提交的大小/cmets/分隔并不重要,因为所有内容都是由维护者评论的一次提交。

      在第二个选项中,分支的每次提交都很重要。因此,每个提交必须代表一个逻辑工作单元(例如,您不应该提交修复您在分支中引入的错误,或者提交导致非功能项目的提交)。你总是可以强制你的 pull request 分支让它变得漂亮。

      关于在主分支上保持最新,您应该应用相同的逻辑。提交“Merge master into Pipo”根本没有用,你应该重新设置分支以使“merge”不可见。

      最后但同样重要的是,每个维护者都有自己的习惯,所以如果代码、测试和文档总是分开提交或分组提交,你也应该这样做。无论如何,当您发布拉取请求时,如果维护者发现有什么要说的,您可以与他讨论并按照他认为适合合并的方式进行更改。

      【讨论】:

      • 发生冲突时,我的分支变基的步骤是什么?
      • @thebjorn 我在回答中描述的那些:目标是检测本地克隆中的冲突,而不是被原始仓库的维护者告知存在冲突(当他/她尝试将您的 PR 合并到原始存储库中)
      【解决方案3】:

      当您在 github 上创建一个项目时,您会创建自己的并行存储库。

      Github 在原始项目上使用“拉取请求”,允许您请求具有提交权限的人从您的分叉中拉取更改。

      【讨论】:

      • 是的,我想我明白了。我有我自己的叉子,我的叉子连接到上游,我获取上游,所以我的 wc 知道那里所做的更改,然后我在叉子中创建一个新分支,但关闭上游的最新签入。我推到我的叉子,然后创建一个拉取请求。正是这个拉取请求是有问题的,因为它包含在我分支之后对上游/主服务器所做的更改的冲突。
      • 然后您需要合并上游所做的更改并使代码正常工作,然后然后创建拉取请求。这实际上是一件非常好的事情,因为它将负担放在提交者而不是合并身上。
      • 所以在这种情况下你不应该变基..?
      • Rebase 使 git 树更漂亮,如果维护者简单地合并你的分支,这样做是件好事。他还可以决定将其压缩为一次提交。但既然是维护者的决定,你应该为他提供一个合适的 rebase 分支。
      • @BenoîtLatinier 您能否对此进行扩展(在回答中),最好是“为他提供适当的重新定位分支”所需的步骤?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多