我在 GitHub 上分叉了某人的存储库,并希望使用在原始存储库中进行的提交和更新来更新我的版本。这些是在我分叉我的副本之后制作的。
如何提取在源中所做的更改并将它们合并到我的存储库中?
git push --force origin --tags
!
您必须将原始存储库(您分叉的存储库)添加为远程。
从 GitHub documentation on forking a repository:
https://i.stack.imgur.com/ztqaV.jpg
克隆完成后,您的 repo 将有一个名为“origin”的远程指向您在 GitHub 上的 fork。不要让这个名字混淆你,这并不指向你分叉的原始仓库。为了帮助您跟踪该仓库,我们将添加另一个名为“upstream”的远程: $ cd PROJECT_NAME $ git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git $ git fetch upstream # then: (like pull" 即 fetch + merge) $ git merge upstream/master master # 或者,更好的是,在获取的分支之上重放你的本地工作
还有一个 command-line tool (gh
) which can facilitate the operations above。
这是它如何工作的视觉效果:
https://i.stack.imgur.com/cEJjT.png
另请参阅“Are Git forks actually Git clones?”。
除了 VonC 的答案之外,您还可以根据自己的喜好进一步调整它。
从远程分支获取后,您仍然需要合并提交。我会替换
$ git fetch upstream
和
$ git pull upstream master
因为 git pull 本质上是 git fetch + git merge。
git rebase upstream master
请注意,如果您与 upstream/master
有足够的分歧,这并不是没有冲突的。请参阅 git-scm.com/docs/git-rebase(tl;dr:这会将您的本地 master 硬重置为上游的 master,然后尝试从分歧点重新合并所有本地提交)
利用:
git remote add upstream ORIGINAL_REPOSITORY_URL
这会将您的上游设置为您从中分叉的存储库。然后这样做:
git fetch upstream
这将从原始存储库中获取包括 master 在内的所有分支。
在本地 master 分支中合并这些数据:
git merge upstream/master
将更改推送到您的分叉存储库,即到源:
git push origin master
瞧!您已完成原始存储库的同步。
此 video 显示 how to update a fork directly from GitHub
脚步:
在 GitHub 上打开你的 fork。单击拉取请求。单击新的拉取请求。默认情况下,GitHub 会将原始版本与您的 fork 进行比较,如果您未进行任何更改,则不应有任何可比较的内容。点击切换底座。现在 GitHub 会将您的 fork 与原始版本进行比较,您应该会看到所有最新的更改。单击为此比较创建拉取请求并为您的拉取请求分配一个可预测的名称(例如,从原始更新)。单击创建拉取请求。向下滚动并单击合并拉取请求,最后单击确认合并。如果您的 fork 没有任何更改,您将能够自动合并它。
switching the base
选项
如果你想在没有 cli 的情况下完成,你可以在 Github 网站上完全完成。
转到您的 fork 存储库。单击新的拉取请求。确保将您的 fork 设置为基本存储库,并将原始(上游)存储库设置为头存储库。通常,您只想同步主分支。创建一个新的拉取请求。选择合并按钮右侧的箭头,并确保选择变基而不是合并。然后单击按钮。这样,就不会产生不必要的合并提交。完毕。
如果您使用的是 GitHub 桌面应用程序,右上角有一个同步按钮。点击它,然后点击左上角附近的 Update from <original repo>
。
如果没有要同步的更改,这将处于非活动状态。
这里有 some screenshots 可以简化此操作。
如果没有什么可丢失的,您也可以删除您的分叉,只需转到设置...转到下面的危险区域部分,然后单击删除存储库。之后它将要求您输入存储库名称和密码。之后,您只需再次分叉原始文件。
git rebase upstream/master
,但我在答案中添加了两种可能性。git push --force
,将您在 GitHub 上的分支历史记录替换为您刚刚重新建立的本地分支。由于只有你在使用悲伤的分支,因此不会涉及任何混乱。