我分叉了一个项目,进行了更改,并创建了一个被接受的拉取请求。新的提交后来被添加到存储库中。我怎样才能把这些承诺交给我?


当前回答

在分叉存储库的本地克隆中,可以将原始GitHub存储库添加为“远程”。(“Remotes”就像是存储库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

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


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

git push -f origin master

您只需要在重新启动后第一次使用-f即可。

其他回答

rm -rf oldrepository
git clone ...

可能有更微妙的选项,但这是我唯一有信心的方法,我的本地存储库与上游存储库相同。

尝试此操作,单击“获取上游”以从上游主机同步分叉的回购。

作为对这个答案的补充,我正在寻找一种方法,从上游分支一次性更新我的克隆回购(原始)的所有远程分支。我就是这样做的。

这假设您已经配置了一个指向源存储库(源是从那里分叉的)的上游远程,并将其与git fetch upstream同步。

然后运行:

for branch in $(git ls-remote --heads upstream|sed 's#^.*refs/heads/##'); do git push origin refs/remotes/upstream/$branch:refs/heads/$branch; done

该命令的第一部分列出了上游远程回购中的所有头,并删除了后跟refs/heads/分支名称前缀的SHA-1。

然后,对于这些分支中的每一个,它将上游远程跟踪分支的本地副本(本地侧的refs/remotes/upstream/<branch>)直接推送到源上的远程分支(远程侧的refs/头/<branch>)。

这些分支同步命令中的任何一个都可能由于以下两个原因而失败:上游分支已被重写,或者您已将该分支上的提交推送到您的分叉。在第一种情况下,如果您没有向分叉上的分支提交任何内容,则可以安全地强制推送(在上面的命令中添加-f开关;即git push-f)。在另一种情况下,这是正常的,因为您的fork分支已经分叉,在提交被合并回上游之前,您不能期望sync命令工作。

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

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

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

“拉”应用程序是一个自动设置和忘记的解决方案。它将使fork的默认分支与上游存储库同步。

访问URL,单击绿色的“安装”按钮,然后选择要启用自动同步的存储库。

分支每小时在GitHub上直接更新一次,在本地计算机上,您需要拉动主分支以确保本地副本同步。