在GitHub中合并分支的方法

291

我 fork 了一个 GitHub 存储库,然后将一些更改推送到我的 fork 上。随后原存储库合并了我的更改和其他的更改。现在,我想合并我遗漏的那些更改。我尝试了简单的拉取和推送,但这会导致我的提交重复。有什么最好的方法吗?

2个回答

391

你可能对于每个仓库都有一个“remote”(远程)版本。你需要从一个remote拉取代码并推送到另一个remote中。

如果你最开始是从你的分支(fork)中克隆的,那么这个remote被称为“origin”。如果你还没有将另一个仓库作为另一个remote添加进去,那么你需要先添加它:

git remote add <shortname> git://github.com/<ownerName>/repo.git

设置完成后,你应该可以这样做(由于github已将默认分支从master更改为main,因此必要时请进行更改)。

git pull <shortname> master
git push origin

记住,git pull 实际上只是一个宏,按照这个顺序执行 git fetchgit merge。你只需要从其他存储库中获取提交记录列表,然后将他的分支合并到你的代码树中。合并应该会正确处理你在两个分支上的提交。

Github 在其永恒的卓越中当然给了你一条捷径。如果您完全合并到另一侧,则您的存储库分支上有一个“快进”按钮,您可以使用它来将您的 fork 捕捉到最新状态。


1
有没有一种完全使用远程操作的方法来完成这个任务?如果我理解正确,使用此方法,您将下载所有更改到本地存储库,然后将它们全部上传(推送)回GitHub上的分叉。我更希望直接将所有更改拉取到GitHub上的分叉中。 - Ken Liu
1
不,Git不支持那个。不过幸运的是,Github现在在Web界面中有一个合并按钮。 - cweiske
13
@cweiske - 这个合并按钮在哪里?我已经仔细查看了管理页面和主页面,但是找不到它:(。 - Adam
2
@Adam,它在拉取请求页面上。因此,复刻者将打开一个拉取请求,将他们的分支之一合并到您的一个分支中。在那里,您可以单击合并按钮。 - Rob Barreca
3
似乎不再有"快进"按钮可用。为了提供信息,我在我的命令中使用了另一个Git URL: git remote add snaury git@github.com:snaury/script-runner - oHo
显示剩余4条评论

91

以上被接受的答案对我来说并没有完美地起作用。具体来说,它在工作时似乎丢失了到原始GitHub作者的链接,之后似乎就不能再正常工作了。我认为问题在于答案忽略了远程名称和分支之间的/。因此,它会从远程获取名为master的分支,但随后无法对其执行任何操作。不是很确定原因。

这是GitHub建议的方法

一旦克隆了您fork的存储库,您确实需要添加一个指向原始存储库的远程,就像前面的答案所说的那样。他们喜欢称其为upstream,但并不重要。

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

然后你获取(fetch)数据

git fetch upstream

你将看到可合并的版本。

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

接着你只需要选择要合并的分支。请注意,这些不是本地分支,而是存储在远程的分支。但是只要您没有名为upstream/master的本地分支(允许存在),您应该可以使用以下命令顺利地合并:

git merge upstream/main

或者,您可以通过以下行快捷方式获取/合并(至少在初始获取后):

git pull upstream/main

问题在于,如果您已经有了更改,那么您合并的更改将会创建一个合并提交。在某些情况下很有用,但大多数情况下有点无意义。 - Pablo Olmos de Aguilera C.
2
在这种情况下,使用git rebase会更好,而且可以避免那些难看的空合并提交。 - Fruch

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