从GitHub的一个分支中派生出一个新分支

37

有没有办法在GitHub上从特定的分支进行fork?例如,Moodle有许多分支(1.9、2.0等)。是否可以仅克隆1.9分支,而不总是克隆主分支?是否可以将特定分支克隆到我的PC上?


不清楚是否需要克隆或分叉一个分支。 - Lucio Crusca
你正在提出两个不同的问题:1. 在Github上分叉,也就是从Github到Github 2. 克隆到你的PC,也就是从Github到PC。对于第二个问题,你可以随心所欲,只需检查 git help clone。也许缩小你的问题并集中在第一个问题上会更好? - MarcH
10个回答

28

我现在还不知道一种本地的方法,但是您可以按照以下步骤操作:

  1. 在GitHub网站上将要复制的存储库(名为“upstream”)派生到您的工作区。
  2. 运行GitHub桌面应用程序并将存储库克隆到您的电脑上。
  3. 使用GitHub桌面应用程序在存储库中打开一个shell。(除非手动配置,否则默认PowerShell不支持git命令。)
  4. 将源存储库设置为upstream:

  5. git remote add upstream https://github.com/{user}/{source-repo}.git
    
  6. 获取完整的上游存储库。(现在,您只有其主分支的副本。)

  7. git fetch upstream
    
  8. 让你的文件系统复制你想要的分支并给它任何名称:

  9. git checkout upstream/{branch-in-question}
    git checkout -b temporary
    
  10. 使用GitHub桌面应用程序发布您的存储库。

  11. 在GitHub网站上,打开您的存储库并单击“设置”。
  12. 将“默认分支”更改为“temporary”。(只需更改下拉菜单即可,无需单击“重命名”按钮。)
  13. 返回到您的存储库,转到“分支”选项卡,现在可以删除“master”分支。
  14. 在shell中删除主分支并创建一个新的主分支:

  15. git branch -d master
    git branch master
    git checkout master
    git -d temporary
    
  16. 再次使用GitHub桌面应用程序发布您的存储库。

  17. 在GitHub网站上,打开您的存储库并单击“设置”。
  18. 将“默认分支”更改回(新的)'master'分支。
  19. 返回您的存储库,转到“分支”选项卡,现在可以删除“临时”分支。

这应该是您要找的内容。也许GitHub将来会提供更方便的方法来完成这个过程(例如,从项目的分支中点击“Fork”将导致完全相同的行为)。


3
哇,好多的台阶啊,蝙蝠侠!两年后(2015年)有更新或更简明的方法吗? - WestCoastProjects
我又没有做它... - Matthias Ronge
我有一个分叉的 Github 存储库。在我 fork 它之后,原始存储库所有者创建了一个新的分支。我无法弄清楚如何将该分支复制到我的 fork 中。这些步骤起作用了。谢谢。 - Lane Rettig
1
五年过去了,还是没有更简单的方法吗? - Ralf

7

克隆意味着您在自己的账户中创建了整个仓库的副本,包括所有分支和标签。但是,您可以自由地切换和跟踪分支。


1
甚至可以稍后删除分支。 - Fred Foo
6
如果整个代码仓库已经被克隆,那么为什么执行 'git branch' 命令时只显示主分支,而不是在 GitHub 上看到的所有分支? - jan
@jan 试试 git branch -a(迟做总比不做好)。 - Viktor Dahl
@MarcH 在 Git 和 GitHub 中,克隆(Cloning)的意思是完全一样的。我从未写过关于分叉(forking)的内容。 - iltempo
@iltempo,你正在回答一个标题和描述中都有“分叉”(Forking)的问题,虽然这个问题有点令人困惑。 - MarcH
显示剩余2条评论

5

不需要命令行。

只需在你的 GitHub 分支库中创建一个新分支 (1),GitHub 将会询问你是否要将此新分支克隆或镜像自上游分支库中的任何分支 (2)。你可以为新分支取任何名称。

GitHub new branch dialog, with upstream repository branches option


1
对我来说最好的解决方案 - Stefino76
1
对我来说,最好的解决方案 - Stefino76
然后:使用VScode/GitLens,打开Repositories -> YourRepo -> branches;选择并切换到新分支。很容易! - Jack Punt
糟糕:应该是打开存储库-> YourRepo-> Remotes; 选择并切换到新分支。很容易!(然后它会显示在“分支”中) - Jack Punt

1

是的,您可以克隆单个分支。例如,您有一个名为release1.0的分支。如果您想将此分支克隆到您的计算机上,则使用以下代码行:

$ git clone git@bitbucket.org:git_username/git_repository_example -b release1.0 --single-branch

这是用于克隆,而不是分叉。 - Sigfried
问者问道:是否可以只克隆分支1.9而不是主分支?是否有可能将特定分支克隆到我的计算机上?请在评论之前阅读完整的问题。谢谢。 - Ishwor Khanal
抱歉,你是对的。虽然更改问题标题会很好,但我尝试了你的解决方案,然后意识到它对我的问题没有帮助。 - Sigfried

1
对于不喜欢使用命令行的人,这里是使用GitHub桌面客户端的简单指南:
  1. 在GitHub.com上单击repo的fork按钮: step1

  2. 确保安装了桌面客户端

  3. 单击此按钮:step2

  4. 克隆repo

step3

在桌面客户端中,选择所需的分支。

step4

  1. 选择您想要工作的分支,然后完成

step5


1
很好的图解指南。+1 - VonC
我相信这仍然会在服务器端留下大量的错误分支。不清楚问题是关于什么的,但 git clone --single-branch 并不是真正的问题。 - MarcH
@MarcH 是的,如果使用此方法创建的分支不再需要,则需要手动删除。 - Timo Ernst

1
我在这里发布我使用的方法。 像OP一样,我想只复制/分叉一个分支。 但是找不到简单的方法。
  • 在您的存储库中创建一个新分支。 它不需要与您想要分叉的分支名称相同
  • 创建后,请验证它是否为所选分支,然后单击“比较”
  • 反转比较顺序(我有一个用户脚本,如果您想测试,请参见我的个人资料)。
  • “基本”存储库必须是您自己的,具有您创建的分支
  • “head”存储库是原始存储库,分支是您想要分叉的分支
  • 点击“创建拉取请求”,并继续直到PR被应用
那就是了。 您已经分叉了该分支。

0
一个快速的替代方法是创建自己的新存储库
前往https://github.com/new并创建一个新的存储库。不要初始化README。
向下滚动以获取您的git remote

enter image description here

然后:

git remote rm origin
git config master.remote origin
git config master.merge refs/heads/master
// Run code from above image
git push --set-upstream origin yourbranchname

您将拥有一个新的仓库,其中包含原始仓库的代码和一个可以转换为拉取请求的分支。


0

我正在使用Bitbucket,但我相信这对GitHub也适用。

  1. 创建一个新的存储库
  2. 使用GitExtensions检出分支
  3. 单击“推送”以打开推送对话框
  4. 将目标URL设置为新存储库
  5. 将目标分支设置为“master”
  6. 推送

您的新存储库将仅具有一个分支的完整历史记录(不像分叉会具有所有分支)。

GitExtensions Push Dialog


0

解决方案:

针对 GitHub 上的远程存储库和本地存储库

在将所有分支 fork 到您的 GitHub 存储库后,您可以删除 GitHub 存储库中多余的分支。

然后,您只能克隆需要的分支到本地。

步骤一

步骤二

仅适用于本地存储库

git clone -b <branch name> --single-branch <repository>

如果您想进一步节省磁盘空间,可以克隆远程存储库而不包含历史记录:

git clone -b <branch name> --depth 1 <repository>

注意:--depth 参数意味着 --single-branch,除非给出 --no-single-branch 参数。

https://git-scm.com/docs/git-clone


-2

切换到你需要的源仓库分支。点击“Fork”。你会得到一个复制的主分支和你所在的分支。 我不知道多个分支是如何工作的,但对于我的需求而言效果非常好。


当我点击“Fork”时,它只是将我发送到我的自己的存储库,其中包含现有的分支,没有新的分支被创建。 - Ralf
这个不起作用,"Fork"按钮总是克隆所有分支。 - MarcH

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