原文:Keeping GitHub Forks in Syncgit
做者:beejjorgensen 发表时间:2018/1/13github
译者:陈 昌茂 发表时间:2018/8/29bash
(转载请注明出处)fetch
不少时候,你在 GitHub 上 Fork
了某个上游项目,还但愿同步原项目做者在此后所作的变动。ui
虽然用户很早就提交了 功能提议,但GitHub 到目前为止还不支持在 Web 界面上的同步操做。遗憾的是,可能之后也不会。spa
这很正常。本文经过命令界面操做,几条命令能够就解决项目同步的问题。日志
为方便行文,咱们将项目的三个别名介绍以下:code
origin
:表明远程项目,即 GitHub Fork
项目(克隆自上游项目,即 upstream
)local
表明本地项目,即电脑上的本地项目(克隆自远程项目)upstream
:表明上游项目,即被 Fork
的 GitHub 项目。有两种方法使 origin
与 upstream
保持同步:cdn
upstream
,上游项目的做者能在 GitHub 的 Web 界面上操做是否接受你的 PR。固然这一般不多发生,由于一般有成百上千的人克隆了他的项目,他不得不这么作。(译者认为「有用」的PR通常是会被接受的)upstream
的更新获取并合并到 local
,而后推送到你的 origin
。这是最经常使用的方法。upstream
upstream
是很重要的设置,只需进行一次。blog
upstream
是远程项目地址的别名,表明一个远程项目的 URL 地址(相似 DNS 之于 IP 地址,可用 git remote
查看,译者注)。虽然能够每次在引用远程项目的时候都使用完整的 URL 地址,但这是一个痛苦的体验,因此咱们用「别名」。
如你所见,origin
也是一个远程项目的别名,在克隆项目的时候 git
命令会自动设置为被克隆项目 URL 地址。
若是你已经克隆了一个项目,可使用 git remote -v
命令来查看。
$ git clone git@github.com:MyName/My-Forked-Repo.git
[...cloning output...]
$ git remote -v
origin git@github.com:MyName/My-Forked-Repo.git (fetch)
origin git@github.com:MyName/My-Forked-Repo.git (push)
复制代码
能够设置多少个远程项目别名,由于它们仅仅表明一些远程项目的 URL 地址而已。让咱们来加一个「引用 」到上游项目,别称为 upstream
。
$ git remote add upstream https://github.com/LambdaSchool/Original-Repo.git
$ git remote -v
origin git@github.com:MyName/My-Forked-Repo.git (fetch)
origin git@github.com:MyName/My-Forked-Repo.git (push)
upstream https://github.com/LambdaSchool/Original-Repo.git (fetch)
upstream https://github.com/LambdaSchool/Original-Repo.git (push)
复制代码
如今能够看到有2个远程项目别名。
你可能注意到,远程项目 URL 地址是 HTTPS 的。这是由于咱们(大概)没有上游项目的 SSH 访问权限,但这不要紧,由于咱们只须要读取权限便可,并不须要写入权限。
Fork
如上图所示,咱们把 upstream
的更新获取并合并到 local
,而后推送到 GitHub 上的 origin
。操做完成后,local
和 origin
就与upstream
保持同步了。
下述操做,是假设将 local
的 master
分支与 origin
的 master
分支合并。若是合并其余分支,调整成对应的分支便可。
upstream
获取更新命令 git fetch
与 git pull
功能一致,区别是前者只获取不合并。
有趣的是:
git pull
便是git fetch
命令和git merge
命令的简写。
执行以下命令,从 upstream
获取更新:
$ git fetch upstream
[...fetch output...]
复制代码
master
分支与 upstream/master
分支上一步获取了 upstream
的全部更新。这一步是如何合并这些更新。
1,执行以下命令,查看本地是否已经提交了所有变动。
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
复制代码
若是提示有暂存的变动,请参考这提交以后再继续。
2,确保切换到本地的 master
分支,由于 master
分支是准备要合并的分支。(*号代表是当前的分支)
$ git checkout master
$ git branch
* master
复制代码
3,执行合并操做。下述命令中的 upstream/master
指 upstream
的 master
分支。(区别本地的 master
分支)
$ git merge upstream/master
[...merge output...]
复制代码
注意,若是提示输入修订日志,请输入「合并分支」或任何其余内容。(若是是 fast-forward
方式合并,无需输入修订日志)
若是在合并过程当中没有看到任何冲突提示信息,合并成功,那这会是合并过程当中最开心的时刻。
不然在进行下一步前,先解决合并冲突。限于篇幅本文不涉及 如何解决合并冲突,但那会也不会是世界末日。
一个有用的快捷命令 git up
,如何设置请查阅 git-config 文档。
up = "!git remote update -p; git merge --ff-only
@{u}
"
使用快捷命令或多或少会令人忘记如何正确的使用 git pull
命令──不像 git pull
,git up
永远不会让你到一个提示,但愿你解决一个合并冲突。
git up
从全部上游分支下载全部最新提交(修剪死分支),并尝试将本地分支快速转发到上游分支上的最新提交。若是成功,则没有本地提交,所以没有合并冲突的风险。若是存在本地(未刷新)提交,则快进将失败,从而能够在执行操做以前查看上游提交。
origin
在获取和合并操做后,本地项目已经和上游项目保持同步。要使远程项目也保持同步,还得执行以下命令:
$ git push
[...push output...]
复制代码
至此,这次同步工做完成!