如何为你分叉的项目做出贡献?

How to contribute to a project you've forked?

假设我已经分叉 https://github.com/user/proj.git 并且在我的分叉(的主分支)上做了重要的开发。

我想解决上游遇到的问题(我还没有在我的 fork 中修复)。如果我理解正确,我应该在上游最后一次签入他们的主人的基础上创建一个功能分支:

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

这些命令中的第二个让我知道我处于 'detached HEAD' 状态..有什么我需要关心的吗(了解执行此任务)?

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

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

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

Github 在原始项目上使用 "pull requests" 以允许您请求那些具有提交权限的人从您的复刻中提取更改。

is this pull request that is problematic, since it includes a conflict with changes done to upstream/master after I branched off of it

the steps needed to "provide him a proper rebased branch"?

一个“适当的 rebased 分支”是指在 upstream/master 之上的一个分支 rebased(上游是你分叉的原始 repo 的名称)

git fetch upstream
git checkout myBranch
git rebase upstream/master

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

如果你想稍微清理一下你的分支的历史,你也可以做一个 rebase interactive (git rebase -i)

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

原始项目的维护者的目标仍然是将您的分支合并到 his/her master 分支中,并通过简单的合并(0 冲突)来完成。

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

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

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

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

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

在第二个选项中,分支的每次提交都很重要。所以每个提交都必须代表一个逻辑工作单元(例如,你不应该提交修复你在分支中引入的错误,或者提交导致非功能性项目)。您可以随时推动您的拉取请求分支使其变得漂亮。

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

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