在GitHub中的分叉之间合并


259

我分叉了一个GitHub存储库。然后,我对叉子进行了一些更改。然后,原始存储库合并了我的更改和其他更改。现在,我想合并那些我缺少的更改。我尝试了一次简单的拉动,然后再进行推压,但这会导致重复提交。最好的方法是什么?

Answers:


352

您可能对每个存储库都有一个“远程”。您需要从一个遥控器拉出,然后推到另一个。

如果您最初是从分叉中克隆的,则该远程将被称为“起源”。如果尚未添加,则需要将第一人称的存储库添加为另一个远程存储库:

git remote add firstrepo git://github.com/first/repo.git

完成所有设置后,您确实应该能够

git pull firstrepo master
git push origin

请记住,git pull无非就是按该顺序执行git fetch和的宏git merge。您只需要从第一人称存储库中获取提交列表,然后将其分支合并到您的树中即可。合并应该对两个分支上的提交执行正确的操作。

当然,GitHub具有永久的强大功能,为您提供了一个捷径。如果您完全合并到另一端,则存储库的分支上有一个“快进”按钮,您可以使用它来补上分支。


1
有没有办法完全通过远程操作来做到这一点?如果我正确理解,则可以使用此方法将所有更改下载到本地存储库,然后将所有更改上传(推送)回github上的fork。我宁愿以某种方式将所有更改直接拉到github上的fork中。
刘坚

1
不,Git不支持。幸运的是,Github现在在Web界面中有一个合并按钮。
cweiske 2011年

13
@cweiske-合并按钮在哪里?我已经浏览了管理页面和主页,但找不到它了:(。–
Adam

2
@Adam,在“拉取请求”页面上。因此,分叉者将打开“拉取请求”,以将其分支之一合并到您的分支中。在那里,您可以单击合并按钮。
罗布·巴雷卡

2
按钮“ 快进 ”似乎不再可用。有关信息,我在命令中使用了另一个git URL:git remote add snaury git@github.com:snaury/script-runner
olibre 2013年

72

因此,上面接受的答案对我而言并不完美。也就是说,当它工作时,似乎失去了与原始github作者的链接,然后在此之后似乎不再起作用。我认为问题在于答案在远程名称和分支之间省略了/。因此它将从远程获取一个称为master的分支,但随后将无法对其进行任何操作。不太确定为什么。

这是github从其网站推荐的方式。

克隆分叉的存储库后,您确实需要像前面的答案一样添加指向原始文件的远程指向。他们喜欢将其称为上游,但这无关紧要。

git remote add upstream git://github.com/octocat/Spoon-Knife.git

然后你拿

git fetch upstream

您将看到可用于合并的版本

From git://github.com/octocat/Spoon-Knife.git
 * [new branch]      gh-pages   -> upstream/gh-pages
 * [new branch]      master     -> upstream/master

然后,您只需要选择要合并的分支即可。请注意,这些不是本地分支,它们存储在远程目录下。但是,如果您没有名为上游/主站点的本地分支(允许使用),则应与以下行合并:

git merge upstream/master

或者,您可以使用以下行来缩短获取/合并操作(至少在初始获取之后):

git pull upstream/master

问题是,如果您已经进行了更改,则合并的更改将创建合并提交。在某些情况下很有用,但多数情况下毫无意义。
Pablo Olmos de Aguilera C.

1
在那种情况下,git rebase它会更好地工作,并且省去那些难看的空合并提交
Fruch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.