如何更新或同步 GitHub 上的分叉存储库?

问题描述:

我分叉了一个项目,进行了更改,并创建了一个被接受的拉取请求。新的提交后来被添加到存储库中。我如何将这些提交放入我的分叉中?

解决方案1:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

在分叉存储库的本地克隆中,您可以将原始 GitHub 存储库添加为“远程”。 (“远程”就像存储库 URL 的昵称 - 例如,origin 就是其中之一。)然后您可以从该上游存储库中获取所有分支,并重新调整您的工作以继续在上游版本上工作。就可能看起来像这样的命令而言:

# Add the remote, call it "upstream":

git remote add upstream https://github.com/whoever/whatever.git

# Fetch all the branches of that remote into remote-tracking branches

git fetch upstream

# Make sure that you're on your master branch:

git checkout master

# Rewrite your master branch so that any commits of yours that
# aren't already in upstream/master are replayed on top of that
# other branch:

git rebase upstream/master

如果您不想重写您的 master 分支的历史记录(例如因为其他人可能已经克隆了它),那么您应该将最后一个命令替换为 git merge upstream/master。但是,为了进一步提出尽可能干净的拉取请求,最好重新设置基准。

如果您已将分支重新定位到 upstream/master,您可能需要强制推送,以便将其推送到您自己在 GitHub 上的分叉存储库。你会这样做:

git push -f origin master

您只需在重新定位后第一次使用 -f。

huntsbot.com – 高效赚钱,自由工作

由于您的 fork 仅存在于 github 上,而 github 没有通过 Web 界面进行合并的工具,因此正确的答案是在本地进行上游合并并将更改推送回您的 fork。

这是我在使用 github 时发现的一个很棒的教程:gun.io/blog/how-to-github-fork-branch-and-pull-request

快速注意,不必重新设置自己的主分支以确保您从干净状态开始,您可能应该在单独的分支上工作并从中发出拉取请求。这可以让您的 master 保持干净,以便将来进行任何合并,并且您不必使用 -f 重写历史记录,这会弄乱所有可能克隆您的版本的人。

我没有使用 rebase 命令,而是使用了以下命令:git merge --no-ff upstream/master 这样您的提交就不再是最重要的了。

@jww:您问为什么需要告知 Git 原始 GitHub 存储库。这是因为 Git 是一个去中心化的版本控制系统,并没有以任何方式与 GitHub 绑定;很明显,Git 是在 GitHub 之前创建的。当你在 GitHub 上创建一个 fork 的仓库并克隆它时,GitHub 知道这个仓库是一个 fork; Git没有理由,也没有。 (为什么克隆不复制 Git 遥控器?Git 是分散的;不同的人会想要不同的遥控器;这样做没有意义。)请参阅 github.com/github/hub,了解 Git 中的 GitHub 集成。

解决方案2:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

从 2014 年 5 月开始,可以直接从 GitHub 更新分叉。这在 2017 年 9 月仍然有效,但它会导致一个肮脏的提交历史。

在 GitHub 上打开你的 fork。单击拉取请求。单击新的拉取请求。默认情况下,GitHub 会将原始版本与您的 fork 进行比较,如果您未进行任何更改,则不应有任何可比较的内容。如果您看到该链接,请单击切换基础。否则,手动将基叉下拉设置为您的前叉,将头叉设置为上游。现在 GitHub 会将您的 fork 与原始版本进行比较,您应该会看到所有最新的更改。创建拉取请求并为您的拉取请求分配一个可预测的名称(例如,从原始更新)。向下滚动到合并拉取请求,但不要单击任何内容。

现在您有三个选项,但每个选项都会导致提交历史不太干净。

默认将创建一个丑陋的合并提交。如果您单击下拉菜单并选择“压缩并合并”,则所有介入的提交都将被压缩为一个。这通常是您不想要的。如果你点击 Rebase and merge,所有的提交都会“和”你一起进行,原来的 PR 会链接到你的 PR,GitHub 会显示 This branch is X commits ahead, Y commits behind 。

所以是的,你可以使用 GitHub Web UI 让你的 repo 更新到它的上游,但是这样做会破坏你的提交历史。请改用 the command line - 这很简单。

这一次效果很好。第二次这个过程没有以同样的方式工作:“切换基础”链接没有出现。当我点击“单击以创建拉取请求”时,它在 SOURCE 存储库上创建了一个 PR。不是我想要的..

仍然有效(Marchi 2015),尽管“切换基础”链接不再存在。您必须更改“Base”下拉菜单,以便它们都指向您的 fork,然后您会收到“Compare across repos”的提示,这会将您带到您想要的位置。

2015 年 4 月。作品。谢谢。我确实得到了“切换到基地”。但是,第 6 步是“创建拉取请求”-> 输入评论->“创建拉取请求”。最终在原始提交之前提交 1 次。

@cartland(或其他人) - 是的,它说“这个分支是 1 提交之前......”这有什么要担心的吗?是否有可能摆脱该消息?

使用简单的更新或同步按钮会不会更好!

解决方案3:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

这是 GitHub 在 Syncing a fork 上的官方文档:

同步一个 fork 设置 在同步之前,您需要添加一个指向上游存储库的远程。当你最初分叉时,你可能已经这样做了。提示:同步你的 fork 只会更新你的本地仓库副本;它不会更新您在 GitHub 上的存储库。 $ git remote -v # 列出当前遥控器 origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) $ git remote add upstream https 😕/github.com/otheruser/repo.git # 设置一个新的远程 $ git remote -v # 验证新的远程源 https://github.com/user/repo.git (fetch) origin https://github. com/user/repo.git (push) upstream https://github.com/otheruser/repo.git (fetch) upstream https://github.com/otheruser/repo.git (push) 同步 需要两步将您的存储库与上游同步:首先您必须从远程获取,然后您必须将所需的分支合并到您的本地分支中。从远程存储库中获取将引入其分支及其各自的提交。这些存储在特殊分支下的本地存储库中。 $ git fetch upstream # 抓取上游远程的分支 remote: Counting objects: 75, done。远程:压缩对象:100% (53/53),完成。远程:总共 62 个(增量 27),重复使用 44 个(增量 9) 拆包对象:100% (62/62),完成。来自 https://github.com/otheruser/repo * [new branch] master -> upstream/master 我们现在将上游的 master 分支存储在本地分支中,upstream/master $ git branch -va # 列出所有本地和远程-tracking branches * master a422352 我的本地提交 remotes/origin/HEAD -> origin/master remotes/origin/master a422352 我的本地提交 remotes/upstream/master 5fdff0f 一些上游提交 Merging 现在我们已经获取了上游存储库,我们想要将其更改合并到我们的本地分支中。这将使该分支与上游同步,而不会丢失我们的本地更改。 $ git checkout master # 查看我们本地的 master 分支 Switched to branch ‘master’ $ git merge upstream/master # 合并上游的 master 到我们自己的 Updating a422352…5fdff0f Fast-forward README | 9 -------- 自述文件.md | 7 ++++++ 2 个文件更改,7 个插入(+),9 个删除(-)删除模式 100644 README 创建模式 100644 README.md 如果您的本地分支没有任何唯一提交,git 将改为执行“快进”:$ git merge upstream/master 更新 34e91da…16c56ad 快进 README.md | 5 ++±- 1 个文件更改,3 个插入 (+),2 个删除 (-) 提示:如果您想在 GitHub 上更新您的存储库,请按照此处的说明进行操作

这更新了我的本地分叉,但我在 Github.com 上的分叉仍然显示“落后 43 次提交”。我不得不使用 lobzik 的技术为自己创建一个拉取请求,以将主更改合并到我的 Github.com 分支中。

@MichaelMcGinnis 在本地合并后,您必须将更改推送到 github。 git push origin master

使用 --follow-tags 推送可能很聪明:stackoverflow.com/a/26438076/667847

我必须为所有分支分别做git merge upstream/master,然后签出开发分支并做git merge upstream/develop

这有帮助。合并章节对我很重要。

解决方案4:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

很多答案最终会将您的 fork 一个提交提前移到父存储库。此答案总结了 here 找到的步骤,这些步骤将将您的 fork 移动到与父级相同的提交。

将目录更改为您的本地存储库。如果您不是 git checkout master 则切换到 master 分支将父级添加为远程存储库, git remote add upstream 发出 git fetch upstream 发出 git rebase upstream/master 在此阶段,您检查提交的内容将由输入 git status 问题 git push origin master

有关这些命令的更多信息,请参阅 step 3。

@MT:不过,您在哪里输入这些命令?据我了解,这个问题的要点是如何将您的个人 GitHub 分支与主项目重新同步,并从 GitHub 完成这一切。换句话说,如何在没有本地存储库的情况下更新远程分支?

@JohnY 使用 GitHub 将始终创建一个额外的提交。您需要在本地 repo 的 shell 中完成所有这些操作,以避免额外的提交。

解决方案5:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

如果像我一样,你从来没有直接向 master 提交任何东西,你真的应该这样做,你可以执行以下操作。

从 fork 的本地克隆,创建上游远程。你只需要这样做一次:

git remote add upstream https://github.com/whoever/whatever.git

然后,每当您想赶上上游存储库主分支时,您需要:

git checkout master
git pull upstream master

假设你自己从来没有在 master 上做过任何事情,你应该已经完成了。现在,您可以将本地 master 推送到您的源远程 GitHub 分支。您还可以在您现在最新的本地 master 上重新设置您的开发分支。

通过初始上游设置和 master 结帐,您需要做的就是运行以下命令将 master 与上游同步:git pull upstream master。

“您还可以在您现在最新的本地 master 上重新定位您的开发分支。”我怎样才能做到这一点?

首先运行 git checkout my-dev-branch 切换到您的开发分支,然后运行 git rebase master。您也可以只运行 git rebase master my-dev-branch,它基本上结合了这两个命令。请参阅git rebase docs。

解决方案6:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

前言:你的 fork 是“起源”,而你 fork 的存储库是“上游”。

假设您已经使用以下命令将 fork 克隆到您的计算机:

git clone git@github.com:your_name/project_name.git
cd project_name

如果给出了,那么您需要按以下顺序继续:

将“上游”添加到您的克隆存储库(“origin”): git remote add upstream git@github.com:original_author/project_name.git 从“上游”获取提交(和分支): git fetch upstream 切换到“ master”分支(“origin”): git checkout master 存储“master”分支的更改:git stash 将“upstream”的“master”分支的更改合并到你的“master”分支中"origin": git merge upstream/master 解决合并冲突(如果有)并提交你的合并 git commit -am “Merged from upstream” 将更改推送到你的 fork git push 取回你隐藏的更改(如果有的话) git stash pop 你是完毕!恭喜!

GitHub 还提供了有关此主题的说明:Syncing a fork

部分帮助:git remote add upstream git@github.com:original_author/project_name.git 只是 git remote add upstream https://github.com/original_author/project_name.git 的别名吗?

Wolf,猜你现在已经知道了,但是为了后代......它是 ssh 的格式。 help.github.com/articles/configuring-a-remote-for-a-fork

非常感谢。 git stash 和 git stash pop 部分非常有帮助

这行得通。在 git merge upstream/master 之后,由于未合并的路径,自动合并失败,我必须运行 git add -A 然后 git commit -m "message" 然后它是最新的。

解决方案7:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

自 2013 年 11 月以来,GitHub 收到了一个非官方的功能请求,要求他们添加一种非常简单直观的方法来保持本地分支与上游同步:

https://github.com/isaacs/github/issues/121

注意:由于该功能请求是非官方的,因此建议您联系 support@github.com 以添加您对要实施的此类功能的支持。上面的非官方功能请求可以用作对此正在实施的兴趣量的证据。

解决方案8:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

GitHub 现在引入了一项功能,只需单击按钮即可同步分叉。

转到您的 fork,点击 Fetch upstream,然后点击 Fetch and merge 直接将您的 fork 与其父 repo 同步。

https://i.stack.imgur.com/NKEzt.png

您也可以点击 Compare 按钮来比较合并前的更改。

参考:GitHub 的 documentation

我试过了,没有创建 PR,太棒了!如果您的分支可以与快进合并同步,则不会发生分歧。

目前,此函数将首先比较原始存储库和分叉存储库之间的分支名称。如果找到同名的,则fork中分支的上游是原来同名的分支;如果没有找到,上游将是原始的默认分支(HEAD)。这在大多数情况下都可以正常工作,但是如果在原始存储库中发生了一些分支修改(例如,添加或删除已存在于分叉存储库中的同名分支,或者更改默认分支),则同步的结果可能不符合您的期望。

解决方案9:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

有三种方法可以做到这一点:从 Web UI(选项 1)、从 GitHub CLI(选项 2)或从命令行(选项 3)。

选项 1 - 网页界面

在 GitHub 上,导航到要与上游存储库同步的分叉存储库的主页。选择获取上游下拉菜单。

https://i.stack.imgur.com/KrwzJ.png

查看来自上游存储库的提交的详细信息,然后单击 Fetch and merge。

https://i.stack.imgur.com/Yzcz1.png

选项 2 - GitHub CLI

要从其父级更新远程分叉,请使用 gh repo sync 子命令并提供您的分叉名称作为参数。

$ gh repo sync owner/cli-fork

如果上游存储库的更改导致冲突,则 GitHub CLI 无法同步。您可以设置 -force 标志来覆盖目标分支。

如何安装 GitHub CLI

GitHub CLI 手册

选项 3 - 命令行

在将自己的分叉与上游存储库同步之前,必须在 Git 中configure a remote that points to the upstream repository。

1 打开 Git Bash。

2 将当前工作目录更改为您的本地项目。

3 从上游存储库获取分支及其各自的提交。对 BRANCHNAME 的提交将存储在本地分支 upstream/BRANCHNAME 中。

$ git fetch upstream
> remote: Counting objects: 75, done.
> remote: Compressing objects: 100% (53/53), done.
> remote: Total 62 (delta 27), reused 44 (delta 9)
> Unpacking objects: 100% (62/62), done.
> From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
>  * [new branch]      main     -> upstream/main

4 检查你的 fork 的本地默认分支 - 在这种情况下,我们使用 main。

$ git checkout main
> Switched to branch 'main'

将上游默认分支(在本例中为 upstream/main)中的更改合并到本地默认分支中。这将使您的 fork 的默认分支与上游存储库同步,而不会丢失您的本地更改。

$ git merge upstream/main
> Updating a422352..5fdff0f
> Fast-forward
>  README                    |    9 -------
>  README.md                 |    7 ++++++
>  2 files changed, 7 insertions(+), 9 deletions(-)
>  delete mode 100644 README
>  create mode 100644 README.md

如果一个本地分支没有任何独特的提交,Git 将改为执行“快进”:

$ git merge upstream/main
> Updating 34e91da..16c56ad
> Fast-forward
>  README.md                 |    5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)

注意:同步一个人的分叉只会更新一个人的本地副本。要在 GitHub.com 上更新一个分支,必须推送一个更改。

来源:GitHub Docs - Syncing a fork

这个对我来说很好用。 Github GUI 工具真的很棒

解决方案10:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

截至本答案发布之日,GitHub 尚未 (or shall I say no longer?) 在 Web 界面中提供此功能。但是,您可以要求 support@github.com 对此投票。

与此同时,GitHub 用户 bardiharborow 创建了一个工具来执行此操作: https://upriver.github.io/

来源在这里:https://github.com/upriver/upriver.github.io

虽然我确实觉得这个工具是个好主意,但现实是它已经坏了。它确实从我的帐户中仅加载了 20 个存储库,甚至页脚也重定向到了一个不存在的网站。如果那是固定的,我将成为一个大倡导者。

到今天为止,我已经成功地使用上游将分叉与上游存储库同步,所以它符合我的目的,我将继续使用它。

@sorin 这 20 个 repo/branch 限制(现在是 30 个)来自 GitHub 默认分页设置。为了处理这个问题,需要对代码进行一些调整。

解决方案11:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

如果您使用 GitHub for Windows 或 Mac,那么现在它们具有一键更新 forks 的功能:

在 UI 中选择存储库。单击顶部的“从用户/分支更新”按钮。

一步一步:github.com/desktop/desktop/issues/1785#issuecomment-483011281

原文链接:https://www.huntsbot.com/qa/3Vdj/how-do-i-update-or-sync-a-forked-repository-on-github?lang=zh_CN

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值