本文转载自微信公众号《程序新视野》,作者为二哥。转载本文请联系程序新视界公众号。前言我们在使用GitHub的时候,看到一个好的项目或者想为某个项目做贡献。这个时候,我们一般会把代码仓库fork到自己的账号上。如果在此期间,如果源仓库的代码发生变化,需要与源仓库代码进行同步。本文将向您展示如何在实践中做到这一点。配置项目的上游仓库,首先需要在本地克隆fork仓库代码,后续所有操作均基于本地代码库。比如可以先通过gitclone将fork代码下载到本地:gitclonegit@github.com:secbr/nacos.git后面的一步步操作都是基于本地仓库。进入本地仓库目录,通过cd操作进入克隆的本地仓库的根目录:cd/Users/apple/develop/nacos-request/nacos后面的操作没有特别说明,都是在这个本地的目录下操作仓库。查看远程仓库路径执行命令gitremote-v查看远程仓库路径:appledeMacBook-Pro-2:nacosapple$gitremote-voriginhttps://github.com/secbr/nacos.git(fetch)originhttps://github.com/如果secbr/nacos.git(push)只显示2行内容,说明该项目还没有搭建upstream(中文名:upstreamcodebase)。一般来说,upstream设置一次后,就不需要重复设置了。通过比较远程仓库的路径和clone的路径,会发现远程仓库的路径还是fork项目的路径。添加upstream路径,执行命令gitremoteaddupstreamhttps://xxx.git,将fork的源仓库设置为upstream。这里的项目是从阿里巴巴的nacos仓库fork出来的,所以对应的upstream就是阿里巴巴源码仓库的地址。执行上面的命令,这里执行gitremote-v查看是否成功。appledeMacBook-Pro-2:nacosapple$gitremoteaddupstreamhttps://github.com/alibaba/nacos.gitappledeMacBook-Pro-2:nacosapple$gitremote-vooriginhttps://github.com/secbr/nacos.git(fetch)originhttps://github.com/secbr/nacos.git(push)upstreamhttps://github.com/alibaba/nacos.git(fetch)upstreamhttps://github.com/alibaba/nacos.git(push)通过上面可以看到output如果多了两个upstream地址,说明upstream添加成功。查看本地代码的状态由于我们的实例是直接从仓库克隆过来的,所以本地没有修改代码。如果你的本地项目修改了一些代码,你不确定代码是否已经提交,你需要执行gitstatus查看一下。appledeMacBook-Pro-2:nacosapple$gitstatusOnbranchdevelopYourbranchsuptodatewith'origin/develop'.nothingtocommit,workingtreeclean上面说明没有本地代码需要提交(commit)。如果有本地修改,需要先从本地仓库推送到GitHub仓库。然后,再做一次gitstatus检查。推送到github仓库对应的基本操作步骤如下:gitadd-Aorgitaddfilenamegitcommit-m"yournote"gitpushoriginmastergitstatus完成以上基本操作后,确认代码已经提交,然后就可以开始之间的合并操作了源仓库和本地仓库。抓取源码仓库的更新经过以上步骤的准备,我们就可以更新源码仓库的代码了。执行命令gitfetchupstream抓取原仓库的更新:appledeMacBook-Pro-2:nacosapple$gitfetchupstreamremote:Enumeratingobjects:2646,done.remote:Countingobjects:100%(2593/2593),done.remote:Compressingobjects:100%(1157/1157),done.remote:Total2646(delta731),reused2404(delta682),pack-reused53Receivingobjects:100%(2646/2646),1.67MiB|1.47MiB/s,done.Resolvingdeltas:100%(734/734),completedwith37localobjects。来自https://github.com/alibaba/nacos*[newbranch]0.2.1->upstream/0.2.1*[newbranch]0.2.2->upstream/0.2.2*[newbranch]0.3。0->upstream/0.3.0//...省略一部分执行完上面的命令后,upstream仓库的更新(commit)会被存储为一个本地分支,通常命名为:upstream/BRANCHNAME。例如上面的upstream/0.3.0。切换分支完成上游仓库分支的拉取后,首先查看本地仓库当前在哪个分支,也就是需要更新合并的分支。比如这里我需要更新develop分支的内容,使其与上游仓库代码保持一致。然后先切换到develop分支:appledeMacBook-Pro-2:nacosapple$gitcheckoutdevelopAlreadyon'develop'Yourbranchisuptodatewith'origin/develop'。上面的提示已经是develop分支了。执行merge,执行命令gitmergeupstream/develop合并远程develop分支。比如你合并的可能是master,你可以根据需要把develop的名字换成对应的master。appledeMacBook-Pro-2:nacosapple$gitmergeupstream/developRemovingtest/src/test/java/com/alibaba/nacos/test/naming/DeregisterInstance_ITCase.java//...省略一部分Removingnaming/src/test/java/com/alibaba/nacos/naming/core/PushServiceTest.javaAuto-mergingclient/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.javaCONFLICT(content):Mergeconflictinclient/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.javaRemovingclient/src/main/java/com/alibaba/nacos/client/naming/core/HostReactor.javaRemoving.editorconfigAutomaticmergefailed;fixconflictsandthencommittheres.执行以上命令后,会发现上游代码指定分支的修改内容已经反映到本地代码中了。上一步将代码上传到fork分支并进行merge操作后,还会有一些后续处理,比如代码冲突等。如果在本地修改内容,在上游仓库修改对应的代码,可能会产生冲突。这时需要修改比较代码。我比较习惯使用IDEA中的可视化插件来解决代码冲突,大家也可以选择自己喜欢的方式来解决。冲突解决后,可以进行正常的代码添加、提交、推送操作。这里的一系列操作都是针对自己fork的仓库的。对应的操作示例如下:appledeMacBook-Pro-2:nacosapple$gitadd.appledeMacBook-Pro-2:nacosapple$gitcommit-m'mergefromnacos'[develop8601c1791]mergefromnacosappledeMacBook-Pro-2:nacosapple$gitpushEnumeratingobjects:4,done.Countingobjects:100%(4/4),done.Deltacompressionusingupto12threadsCompressingobjects:100%(2/2),done.Writingobjects:100%(2/2),281bytes|281.00KiB/s,done.Total2(delta1),reused0(delta0)),pack-reused0remote:Resolvingdeltas:100%(1/1),completedwith1localobject.到https://github.com/secbr/nacos.git76a4dcbb1..8601c1791develop->develop上面的操作,通过add、commit等一系列操作,并推送,将源仓库中修改的内容提交到自己fork的分支。这个时候查看你fork的github仓库,发现代码已经更新了。总结本文介绍了我们fork一个仓库代码后,如何用自己的仓库更新上游仓库的最新代码。如果你喜欢fork一些优秀的代码,需要为GitHub上的开源项目做贡献,那么这个基本操作一定要懂。
