我可以将对派生的提交合并到原始项目吗?

问题描述

尽管已经进行了几年编程,但我仍在尝试围绕Git的一些概念进行探讨。为了说明我的要求,让我们以一种假设的情况为舞台做准备:

  • 无论出于何种原因,我都创建了Flappy Bird的开源克隆,并根据MIT许可在GitHub上提供了代码
  • 有人找到了我的从零开始的代码,并决定分叉该项目(注意:不是为拉取请求而分叉),然后继续进行有益的改进

使用Git系统,是否可以合并上游派生的提交?

解决方法

要添加到hellyale的注释中,如果您看到一个分支(例如,master分支具有一些更改,您想要测试/进入您自己的原始存储库(比较“上游”)到那个分叉),您不必等待请求请求。

您可以在自己的存储库的本地克隆中执行以下操作:

git remote add fork https://url/fork
git fetch fork
git merge fork/master
# test,and if good
git push
,

有几种方法可以解决此问题(假设我正确解释了您的问题):

  1. 假设其他人的存储库的分支版本是公开的,则您可以从GitHub UI的存储库中创建一个拉取请求,从他们的存储库中返回您的存储库。您可能要从包含所需更改的分支创建一个拉取请求,然后将PR打开到您的仓库的master分支中。

这会将它们的更改集成到您的版本库的master分支中。通常这是一种反模式,但是如果您不希望使用命令行,则在这种情况下可能有意义。

  1. 就像上面提到的hellyvale一样,您可以使用命令行:
cd <directory_containing_local_clone_of_your_repo>
git checkout master
git remote add fork git@github.com:user_who_forked/forked_repo_name.git # adds forked repo as a remote called "fork" 
git remote -v # verify the user's fork is listed
git fetch fork
git merge fork/master # make sure you're on your master branch first
git push # assuming your remote is the default remote,otherwise you can call it by name

如果您要合并的更改与代码冲突并且Git无法自动解决差异,则可能必须整理出一些合并冲突。必须通过交互式变基或手动选择要更改的提交来清除此问题。如果发生这种情况,建议您查看git-rebase的文档。

,

尽管git并不是一个经常使用的系统,但它是一个完全分散的系统:它不会将任何存储库视为比任何其他存储库“更中央”或“更正式”的存储库。诸如“ fork”和“ upstream”之类的概念只是约定,就git而言,Github和本地PC上的副本之间甚至没有区别。

因此,简单的答案是,如果您具有对存储库A的读取访问权限,并且具有对存储库B的写访问权限,则始终可以将提交内容从A复制到B。

在您的示例中,您对“上游”存储库具有写权限(因为已创建),而对其他人的fork则具有读取权限(因为他们已将其发布在某个地方)。最通用的方法是这样的:

  • 在本地克隆存储库(所以现在我们有了三个存储库!)
  • 为A和B添加“远程”(这是git术语,用于关联三个URL,您可以使用本地名称访问存储库;克隆时,会为您添加一个名为“ origin”的远程对象)
  • 从这些遥控器中获取要合并的分支
  • 签出这些分支,将它们合并或合并为新分支,就像只存在本地仓库一样。
  • 将结果上推到B(复制那里不存在的所有相关提交,并更新分支点指向的远程服务器记录)

如果A和B都在同一托管服务(Github,Gitlab,BitBucket等)上,则可以使用该服务直接创建合并,但是记住这只是它们提供的便捷工具非常有用,并且git与其他任何合并都不会区别对待。