如何在GitHub上创建一个项目的第二个分支?

50

我想fork一个GitHub项目以解决一些问题,然后发送一个pull请求。

我遇到的问题是,我已经为另一个用户群体适应了该项目进行了fork。

是否可以创建第二个fork?如果可以,怎么做?

现在尝试fork时,它只会将我带到先前创建的fork。


6
为什么不直接从主分支创建一个新的分支,修复问题并将该分支提交到原始项目的主分支中呢? - noMAD
3
我能想到的最丑陋的解决方案是创建一个新的GitHub账户。我并不认真建议这样做。正如@noMAD所建议的那样,我怀疑这是一个分支的工作,而不是一个fork的工作。 - Keith Thompson
1
@noMAD 那应该可以,因为我是一位贡献者。只是好奇,如果我不是贡献者,那么这个解决方案是否可行? - pixelfairy
@pixelfairy,你所说的“贡献者”是什么意思?如果你提交了一个拉取请求,那不就是符合贡献的定义吗? - Chris
@Chris...我的意思是我可以直接提交和推送而不需要创建一个拉取请求,但我想按照官方的方式来做,并且在将更改推送到公共项目之前,我希望有其他人来审查这些更改。 - pixelfairy
6个回答

22

除非您使用两个不同的GitHub帐户,否则无法拥有同一GitHub项目的两个分支。

因此:

  1. 创建一个单独的GitHub帐户(并验证电子邮件)

  2. 分叉项目

  3. 邀请您的主GitHub帐户作为“合作者”(从设置中)

您可能需要添加额外的步骤,即使用新的GitHub帐户创建组织,并将您的主GitHub帐户邀请为该组织的所有者(还要确保您的新分支位于该新组织中)。这将使您能够执行诸如自动部署到连接到您的主GitHub帐户的Heroku应用程序等操作。

为什么我们不能只有多个fork???


8
根据 Github 的服务条款,您不得拥有第二个免费账户。这肯定会限制您分叉项目的选项,除非您支付费用。 - Liggliluff
3
@Liggliluff -- 感谢您阅读Github的条款和条件并告知我们。 - pixelfairy
3
这个回答已经三年了,有没有更新? - SantoshGupta7
@SantoshGupta7 https://dev59.com/a2Ik5IYBdhLWcg3wbtub#19279822 或许可以看一下这个答案。 - awadhesh14
创建一个组织似乎比创建第二个账户要容易。然后,您可以在新的组织中创建分支。 - undefined

7
我的意思是,我可以直接提交和推送而不需要创建一个拉取请求,但我想按照官方的方式来做,并且在将更改推送到公共项目之前,我想让其他人审核这些更改。
GitHub拉取请求不需要从fork中提交;它们也可以在单个存储库内使用
拉取请求在fork和pull模型中特别有用,因为它们提供了一种通知项目维护者你的更改的方法。然而,在共享存储库模型中,它们也很有用,因为它们用于启动关于一组更改的代码审查和一般讨论,以便在合并到主线分支之前进行。
即使你没有技术上的必要,也没有什么阻止你创建一个拉取请求。这通常被认为是最佳实践,GitHub自己的Flow模型大部分基于拉取请求。
在单个存储库中创建拉取请求与从fork创建拉取请求非常相似:
1. 创建一个功能分支,并将你的工作推送到GitHub上的该分支。
2. 在GitHub网页界面上切换到你的功能分支。
3. 点击“比较和审核”按钮。

谢谢!这是非常好的信息。这绝对有助于我实现我的即时目标。...官方答案是我不能创建多个分支吗?如果我想为另一个用户群体创建一个分支,会发生什么?我需要先转让其他(第一个)分支的所有权吗? - pixelfairy
2
@pixelfairy,官方答案是“有点”。据我所知,没有办法使用Web UI的fork按钮在您的帐户下创建另一个分支。(您可能需要调查组织。)但归根结底,分支只是存储库的副本。您可以轻松地创建一个新的空存储库,将其命名为project-fork并推送到其中。请参见https://dev59.com/_Wct5IYBdhLWcg3wHZ1q以获取更详细的答案。 - Chris
我喜欢这个解决方案!对于手头的工作,我将遵循GitHub Flow模型,然后如果我想为新用户群体分叉代码库,我只需创建一个新的repo并将其推送。谢谢!! - pixelfairy
4
有时候你只需要两个叉子。 - pixelfairy
有时候你可以用一把叉子来完成你想要做的事情,但是使用两把叉子会更加简单。 - Mars
1
@pixelfairy,你真的不需要。分支是免费的,但派生不是。 - éclairevoyant

3
按照github官方手册推荐的最佳做法是使用命令行Git,先镜像克隆您的存储库,然后将其推送到您的GitHub。如果您更喜欢GitHub Web界面而不是命令行,一种友好的GUI解决方案是创建一个新组织并将其分叉到该新组织中。我能想到的另一种GUI方法是使用存储库的设置将分叉声明为模板存储库,这样您就可以创建所需数量的分叉。参考链接:https://docs.github.com/zh-cn/github/creating-cloning-and-archiving-repositories/duplicating-a-repository

3
技巧在于不要使用master分支创建拉取请求。这样,您就不需要创建多个分叉,因为您可以根据需要创建任意多的分支,并针对每个分支独立地发起拉取请求。
给定一个干净的分叉存储库,请创建一个专用分支并将其用于拉取请求。
您可以从Web UI中创建分支(虽然不太明显)。
单击分支选择下拉菜单,在输入字段中键入新分支名称,然后您将看到如下所示的创建分支:<new-branch-name>可点击链接。棘手的UI部分是可能不太明显您应该单击"create branch: xyz..." - 它未显示为按钮或超链接,并且没有指示这是可点击的链接。此外,直到您在搜索框中键入内容之前,也没有任何暗示可以创建分支 - 任何人都可能认为搜索框仅用于搜索分支而不是用于创建分支。

github web create branch

如果您已经直接在分叉的master分支中进行了更改,请考虑将这些更改移动到专用分支并且硬重置master分支以使其保持干净,以便与上游存储库同步。
另请参阅:

我将此标记为答案,因为它听起来最直观且最少麻烦。如果有人成功使用它(或尤其是它不起作用),请评论一下。(我不会测试它,因为我只是一时兴起登录了StackOverflow,看到了这个...而且我应该已经睡觉了。)感谢这个技巧! - pixelfairy

1

你可以通过使用多个远程的概念轻松实现你的目的。

快速答案

在你的代码库中执行以下命令序列:

git remote add upstream https://github.com/user_or_org_of_upstream_repo/upstream_repo
git fetch upstream
git checkout upstream/main
git checkout -b name_of_branch_you_want_to_track_in_your_repo

进行修改、添加和提交,然后使用以下命令将更改推送回您的 GitHub 分支:

git push --set-upstream origin name_of_branch_you_want_to_track_in_your_repo

该分支与您的存储库中的其他分支完全断开连接(除了任何源树父级关系,一直到最近的共同祖先为止),现在可以在GitHub上用于拉取请求。

大功告成!

解释

git remote add upstream https://github.com/user_or_org_of_upstream_repo/upstream_repo

添加另一个远程存储库并将其标记为upstream。标签可以是任何东西--upstream更或多或少是您分叉的父级的公认标准名称,但它也可以是“bob”、“mary”、“dirt”或任何其他名称。此外,远程可以是任何存储库,尽管我只尝试过从至少是相同上游远程的平行分叉中获取。

git fetch upstream 实际上获取新存储库的主要和其他分支,并将它们克隆到本地。它们现在只是坐在那里,等待您对它们进行操作。

git checkout upstream/main 检出您在远程列表中标记为“upstream”的存储库的主分支。当然,您也可以检出存储库中的任何其他分支。

git checkout -b name_of_branch_you_want_to_track_in_your_repo 创建一个本地分支,可以跟踪您的更改。

git push --set-upstream origin name_of_branch_you_want_to_track_in_your_repo 将您的新分支推回默认远程仓库origin。同样,您可以将该分支推送到任何其他具有写入权限的远程仓库。

更多解释:

当您fork并克隆您的存储库时,默认远程存储库是您的fork,并且标签为“origin”。git remote命令显示了这一点--例如,这是我制作的一个有趣的小存储库(未能)掌握在线游戏“Wordle”的输出。

> git remote -v
origin  https://github.com/jameshalgren/wordle_analyst_ideas (fetch)
origin  https://github.com/jameshalgren/wordle_analyst_ideas (push)

当你在使用你的分支时,你本地仓库中的分支很可能是基于远程仓库中的主分支。当你对分支进行添加/提交/推送操作时,这些分支的远程版本将会在GitHub上更新你的分支。 这就是为什么第一次尝试推送新分支时会看到这条消息的原因。
fatal: The current branch test_new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin test_new_branch

请注意指令中的“origin”标签。这是远程操作的提示。只要您拥有适当的权限,实际上可以将代码推送到任何其他远程存储库。在第一个命令git remote中,您还可以看到origin标签。如果您在上面的示例中派生了存储库,并为您的上游和可能的几个其他协作者添加了远程存储库,则git remote命令将开始像这样:
> git remote -v
origin  https://github.com/youruser/wordle_analyst_ideas (fetch)
origin  https://github.com/youruser/wordle_analyst_ideas (push)
upstream    https://github.com/jameshalgren/wordle_analyst_ideas (fetch)
upstream    https://github.com/jameshalgren/wordle_analyst_ideas (push)
collaborator    https://github.com/collaboratoruser/wordle_analyst_ideas (fetch)
collaborator    https://github.com/collaboratoruser/wordle_analyst_ideas (push)

0
正如其他人提到的那样,您不能在同一个账户下拥有同一个项目的两个分支。
快速解决方法:
1. 您可以创建一个 GitHub 组织。 2. 然后,在您 fork 项目时,您可以将其分配给您的组织。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接