Pull new updates from original GitHub repository into forked GitHub repository
我在GitHub上分叉了某人的存储库,并希望使用原始存储库中的提交和更新来更新我的版本。这些是我把复印件分出来后做的。
如何将源站中所做的更改拉入并将它们合并到我的存储库中?
- 可能是重复的,也可能只是相关的:在Github中合并分叉。
- 如果您可能需要同步其他标签,请在建议的解决方案之后执行git push --force origin --tags!
- 如何更新Github分叉存储库的可能副本?
您必须将原始存储库(您分叉的存储库)添加为远程存储库。
从Github Fork手册页:
。
Once the clone is complete your repo will have a remote named"origin" that points to your fork on GitHub.
Don’t let the name confuse you, this does not point to the original repo you forked from. To help you keep track of that repo we will add another remote named"upstream":
号
1 2 3 4 5 6 7 8 9 10
| $ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream
# then: (like"git pull" which is fetch + merge)
$ git merge upstream/master master
# or, better, replay your local work on top of the fetched branch
# like a"git pull --rebase"
$ git rebase upstream/master |
您还拥有一个RubyGem,它可以促进这些Github操作。
氧化镁
另请参见"git fork is git clone?".
- 另请参见bassistance.de/2010/06/25/git-fu-updating-your-github-fork以获得一个很好的摘要。
- 需要在git fetch upstream后加git merge。
- @Syedrakib我更喜欢git rebase upstream/master,但我在答案中增加了两种可能性。
- 如果您有本地提交,这是否会在每次尝试从上游获取更新时都创建难看的"合并分支"github.com:user/repo"提交"?当然可以重新设置基,但是如果您将更改推送到Github上的分叉回购,意味着下一次如果不重新生成每次提交的哈希值,就无法重新设置基,从而使所有内容变得一团糟。
- @pablox如果你已经分叉了一个回购,你就在做你的回购,在你的分支中:重新平衡并强制推动:不涉及混乱。即使正在进行的拉请求也会正确更新。
- @VONC是的,但是如果我尝试使用"上游"来保持更新,那么在不创建Merge branch 'master' of github.com:user/repo的情况下就不能(至少是afaik)。也许我解释得不够好。
- @pablox不是如果你是pull --rebase:那里没有"合并分支"的主人。
- @也许我错过了什么…当我第一次进行局部更改时,我会执行一个pull --rebase upstream master(站在我的分支上),将更改移动到尖端,并从上游进行更改(保留其散列)。然后我用叉子叉了一下,一切都很好。下一次我尝试从上游pull --rebase将更改(再次)移动到tip,因此更改散列。现在我不可能不经强迫就进入Github,造成混乱。(我的意思是,"如果你有公开的历史,就不要重新平衡了")。
- @pablox你不会造成混乱:你的git push --force,将你在Github的分支历史替换为你刚刚重新平衡的本地分支。因为只有你用的是悲伤的树枝,所以不涉及混乱。
- @VONC如果你使用的是Github,你假设有一天可能有人会使用你的作品(如果没有…将修改推送到公共存储库的想法是什么?)。这就是维护分叉的关键,添加您的更改,但保持上游更新。
- @pablox不是,不是用于fork,不是用于用于pull请求的分支。不用担心,重新平衡。这就是"保持上游更新"的方法。如果你有其他的贡献者,他们需要从自己的分叉工作,而不是直接靠你自己。这是你的分支,你的请求。根据你的需要随时调整它。
- @我明白。我是说如果有人想跟着我的叉子…他们将在我的岔路口拉历史时遇到问题(上游+我的变化)。因为每次我执行提交哈希时,它都会有所不同。不管怎么说,我每次都要去江湖,这似乎有点荒谬吗?fwiw,我发现的最接近的东西是:blog.bleeds.info/sofa/_design/sofa/_list/post/…
- "我每次都要用力推,这看起来并不是有点荒谬":绝对不是。这就是为什么拉请求会自动更新的原因:允许您重新平衡并停留在上游分支的站点上。如果有人跟踪你的叉子…他/她应该把它叉起来,把他/她自己的分支重新放在你的上面(这是可能的,使用git 1.9:stackoverflow.com/a/20423029/6309会更容易)
- 我理解。我仍然认为这是困难的,非琐碎的和非直觉的。但奇怪的是,我的更改总是在最上面(最后一个),而实际上它们是以前做的。我之前发布的解决方案看起来更好(仍然很重要)。问题是提交散列值会改变(很明显,因为有一个新的父对象),并且在调用问题时会在GitHub内部产生很多噪声。不过,让我惊讶的是,没有一种方法可以在不创建毫无意义的合并提交或历史"谎言"的情况下保持上游的更新并管理自己的分叉。
- Pablox"Lie"about the history?But the author date doesn't change:stackoverflow.com/A/6340994/6309
- @vonc my bad.你是对的这是一个微不足道的问题,因为它看上去像是在吉普赛人的命令中,看到我的变化是最新的。我在你的链接里读到了你的评论,我还是不喜欢,似乎对一些应该很简单的事情做了太多的工作。但我理解"问题"是吉楚布和数据模型(在其他词汇中,不是太多要做)。
- 感谢您:)So"remotes"actually used to identify forks from orginal repo?
- @Sangimed yes,you can have many remote as you want,to reference different rest.在这里,应该参照原始Repo which was forked.
- @Chinmayab to do what?别忘了你不是原始地下室的主人所以你不能直接推它这就是你所拥有的。
- @Chinmayab ok.复制这个网站码到您的网站上以设置一个投票箱在您的网站上。你想避开This will be clear than buried in comments;)
- @chi在你的案件中一定有些不同。所以这应该是好的
- 这是一个问题stackoverflow.com/q/44583721/3734690
除了VONC的答案,你还可以根据自己的喜好进一步调整。
从远程分支提取之后,您仍然需要合并提交。我会替换的
号
具有
1
| $ git pull upstream master |
因为git pull本质上是git fetch+git合并。
- 如果我知道上流分支机构没有任何改变,但只增加了少量的资源文件——我仍然需要一个合并的文件,那又怎么办?What if I know that upstream branch doesn't have any changes to existing files,but only few resource files added-do I st
- 肯定会很快的
- 如何使所有局部文件(所以没有冲突)上流硕士在本案中以密码为主,所以我们信任100%…管理好这个
- 注意,如果你从upstream/master中有足够的分歧,这不是冲突。See GIT-SCM.com/docs/GIT-Rebase(TL;Dr:this hard resets your local master to that of upstream,and then tries to remerge all of the local commits from the point of divergence forward)
此视频演示如何直接从GitHub更新fork
步骤:
在Github上打开你的叉子。
点击Pull Requests。
点击New Pull Request。默认情况下,Github会将原始数据与您的fork进行比较,如果您没有进行任何更改,则不应该有任何可比较的内容。
点击switching the base。现在,Github将把您的fork与原始fork进行比较,您将看到所有最新的更改。
点击Create a pull request进行比较,并为您的请求分配一个可预测的名称(例如,从原始更新)。
点击Create pull request。
向下滚动并单击Merge pull request,最后单击Confirm合并。如果您的fork没有任何更改,则可以自动合并它。
- 不幸的是,这是一种很好的图形方法,在你的圈套中添加噪音,作为在评注中提及的被接受的答案。Therefore the command-line method is recommended:help.github.com/articles/syncing-a-fork
用途:
1
| git remote add upstream ORIGINAL_REPOSITORY_URL |
。
这会将您的上游设置为您的分叉存储库。然后这样做:
这将从原始存储库中提取包括master在内的所有分支。
在本地主分支中合并此数据:
1
| git merge upstream/master |
。
将更改推送到分叉存储库,即源站:
。
喂!完成了对原始存储库的同步。
- 如何使所有局部文件(所以没有冲突)上流硕士在本案中以密码为主,所以我们信任100%…管理好这个
如果您使用的是Github桌面应用程序,在右上角有一个同步按钮。单击它,然后单击左上角附近的Update from 。
如果没有要同步的更改,这将处于非活动状态。
以下是一些简单的截图。