我fork了一个项目,做了一些更改,并创建了一个被接受的拉取请求。后来该存储库添加了新的提交。如何将这些提交合并到我的fork中?
我fork了一个项目,做了一些更改,并创建了一个被接受的拉取请求。后来该存储库添加了新的提交。如何将这些提交合并到我的fork中?
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
git merge upstream/master
。但是,为了使进一步的拉取请求尽可能干净,重新设置基础可能更好。
upstream/master
,则需要强制推送才能将其推送到GitHub上自己的派生存储库中。可以使用以下命令进行强制推送:git push -f origin master
在重新设置基准后,您只需要第一次使用-f
。
git merge --no-ff upstream/master
代替rebase命令,这样你的提交记录就不再在最上面了。 - Steckdoserich从2014年5月开始,可以直接从GitHub更新分支。截至2017年9月,这仍然有效,但会导致一个混乱的提交历史。
Update from original
)。This branch is X commits ahead, Y commits behind <original fork>
。因此,是的,您可以使用GitHub Web UI使您的存储库与其上游保持更新,但这样做会玷污您的提交历史。相反,请坚持使用 the command line - 这很容易。
以下是GitHub关于同步分叉的官方文档:
同步分叉
设置
在同步之前,您需要添加一个指向上游仓库的远程分支。您在最初分叉时可能已经完成了此操作。
提示:同步分叉仅会更新你本地仓库的副本,不会更新你在 GitHub 上的仓库。
$ git remote -v # List the current remotes origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) $ git remote add upstream https://github.com/otheruser/repo.git # Set a new remote $ git remote -v # Verify new remote origin https://github.com/user/repo.git (fetch) origin https://github.com/user/repo.git (push) upstream https://github.com/otheruser/repo.git (fetch) upstream https://github.com/otheruser/repo.git (push)
同步
同步您的存储库与上游需要完成两个步骤:首先,您必须从远程获取,然后您必须将所需分支合并到本地分支中。
获取
从远程存储库获取将带入其分支及其各自的提交。这些存储在您的本地存储库中的特殊分支下。
$ git fetch upstream # Grab the upstream remote's branches remote: Counting objects: 75, done. remote: Compressing objects: 100% (53/53), done. remote: Total 62 (delta 27), reused 44 (delta 9) Unpacking objects: 100% (62/62), done. From https://github.com/otheruser/repo * [new branch] master -> upstream/master
现在我们将上游的主分支存储在本地分支中,即upstream/master
$ git branch -va # List all local and remote-tracking branches * master a422352 My local commit remotes/origin/HEAD -> origin/master remotes/origin/master a422352 My local commit remotes/upstream/master 5fdff0f Some upstream commit
合并
现在我们已经获取了上游仓库,我们希望将其更改合并到我们的本地分支中。这将使该分支与上游同步,而不会丢失我们的本地更改。
如果您的本地分支没有任何独特的提交,Git 将执行“快进”操作:
$ git checkout master # Check out our local master branch Switched to branch 'master' $ git merge upstream/master # Merge upstream's master into our own Updating a422352..5fdff0f Fast-forward README | 9 ------- README.md | 7 ++++++ 2 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 README create mode 100644 README.md
$ git merge upstream/master Updating 34e91da..16c56ad Fast-forward README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
提示:如果您想在GitHub上更新您的代码库,请按照这里的说明操作。
Tip: 如果你想在GitHub上更新你的仓库,遵循这里的指示。
git push origin master
。 - jumpnettgit merge upstream/master
,然后切换到 develop 分支并执行 git merge upstream/develop
。 - Shobigit checkout master
2. 添加父存储库作为远程存储库:git remote add upstream <repo-location>
3. 执行 git fetch upstream
4. 执行 git rebase upstream/master
- 在此阶段,您可以通过键入git status
来检查将要合并的提交。git push origin master
有关这些命令的更多信息,请参阅 第3步。如果像我一样,你从不直接向主分支提交任何内容(其实你真应该这么做),可以按照以下步骤操作。
从本地克隆的分叉中创建上游远程。 这只需要做一次:
git remote add upstream https://github.com/whoever/whatever.git
每当您想要追上上游存储库的主分支时,您需要执行以下操作:
git checkout master
git pull upstream master
假设您从未在主分支上提交过任何内容,则应该已经完成了。现在,您可以将本地主分支推送到您的原始远程GitHub分支。您还可以在现在已更新的本地主分支上对开发分支进行变基操作。
在完成最初的上游设置和主分支检出后,您需要运行以下命令来将您的主分支与上游同步:git pull upstream master。
git checkout my-dev-branch
切换到你的开发分支,然后运行 git rebase master
。 你也可以直接运行 git rebase master my-dev-branch
,这相当于将这两个命令合并在一起。参见 git rebase文档。 - Slion前言:你的分支是“origin”,而你从中派生的仓库则是“upstream”。
假设你已经使用类似以下命令将你的分支克隆到了本地电脑上:
git clone git@github.com:your_name/project_name.git
cd project_name
如果已经给出这个条件,那么你需要按照以下顺序继续执行:
将 "upstream" 添加到你的克隆仓库("origin")中:
git remote add upstream git@github.com:original_author/project_name.git
从"upstream"获取提交记录(和分支):
git fetch upstream
切换到你 fork 的 "origin" 的 "master" 分支:
git checkout master
将您的“主”分支的更改藏起来:
git stash
将"upstream"仓库的"master"分支的更改合并到您自己"origin"仓库的"master"分支中: git merge upstream/master
如果有合并冲突,请解决它们并提交您的合并
git commit -am "Merged from upstream"
将更改推送到您的派生分支
git push
取回您隐藏的更改(如果有)
git stash pop
你完成了!恭喜你!
GitHub还提供了有关此主题的说明:同步 fork
git remote add upstream git@github.com:original_author/project_name.git
只是 git remote add upstream https://github.com/original_author/project_name.git
的别名吗? - Wolfgit stash
和git stash pop
部分非常有帮助。 - Krishna选项1 - Web UI
审查上游代码库提交的详细信息,然后点击“获取并合并”。
在GitHub上,导航到您想要与上游存储库同步的分叉存储库的主页面。
选择“获取上游”下拉菜单。
选项 2 - GitHub CLI
要从父仓库更新远程分支,请使用gh repo sync
子命令并将您的分支名称作为参数提供。
$ gh repo sync owner/cli-fork
-force
标志以覆盖目标分支。
选项3 - 命令行
在将自己的分支与上游存储库同步之前,必须在Git中配置指向上游存储库的远程。
1 打开Git Bash。
2 将当前工作目录更改为本地项目。
3 从上游存储库获取分支及其各自的提交。 BRANCHNAME的提交将存储在本地分支upstream / BRANCHNAME中。
$ git fetch upstream
> remote: Counting objects: 75, done.
> remote: Compressing objects: 100% (53/53), done.
> remote: Total 62 (delta 27), reused 44 (delta 9)
> Unpacking objects: 100% (62/62), done.
> From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY
> * [new branch] main -> upstream/main
4 检查您的分支库的本地默认分支 - 在这种情况下,我们使用 main。
$ git checkout main
> Switched to branch 'main'
5 将上游默认分支中的更改-在本例中,是upstream/main-合并到您的本地默认分支。这将使您的分支与上游存储库同步,而不会丢失本地更改。
$ git merge upstream/main
> Updating a422352..5fdff0f
> Fast-forward
> README | 9 -------
> README.md | 7 ++++++
> 2 files changed, 7 insertions(+), 9 deletions(-)
> delete mode 100644 README
> create mode 100644 README.md
$ git merge upstream/main
> Updating 34e91da..16c56ad
> Fast-forward
> README.md | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
GitHub现在推出了一个一键同步派生项目的功能
进入你的派生项目,点击获取上游
,然后点击获取并合并
以直接将你的派生项目与其父级仓库同步
你也可以点击比较
按钮,在合并之前比较更改
参考资料: GitHub的文档
自2013年11月以来,GitHub一直存在一个非官方的功能请求,要求他们添加一种非常简单和直观的方法来使本地分支与上游同步:
https://github.com/isaacs/github/issues/121
注意:由于该功能请求是非官方的,建议联系support@github.com
,以便支持实现这样的功能。上述非官方功能请求可以用作证明,表明人们对实现这一功能的兴趣程度。
support@github.com
发送请求,以便为此添加您的投票。