「译」如何保持 GitHub Fork 项目同步

如何保持 GitHub Fork 项目同步

原文: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 项目。

有两种方法使 originupstream 保持同步:cdn

  1. 提交合并建议(PR)给 upstream ,上游项目的做者能在 GitHub 的 Web 界面上操做是否接受你的 PR。固然这一般不多发生,由于一般有成百上千的人克隆了他的项目,他不得不这么作。(译者认为「有用」的PR通常是会被接受的)
  2. upstream 的更新获取并合并到 local ,而后推送到你的 origin这是最经常使用的方法。

GitHub Fork 项目

什么是 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 。操做完成后,localorigin 就与upstream 保持同步了。

下述操做,是假设将 localmaster 分支与 originmaster 分支合并。若是合并其余分支,调整成对应的分支便可。

upstream 获取更新

命令 git fetchgit 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/masterupstreammaster 分支。(区别本地的 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 pullgit up 永远不会让你到一个提示,但愿你解决一个合并冲突。

git up 从全部上游分支下载全部最新提交(修剪死分支),并尝试将本地分支快速转发到上游分支上的最新提交。若是成功,则没有本地提交,所以没有合并冲突的风险。若是存在本地(未刷新)提交,则快进将失败,从而能够在执行操做以前查看上游提交。

上传到 origin

在获取和合并操做后,本地项目已经和上游项目保持同步。要使远程项目也保持同步,还得执行以下命令:

$ git push
[...push output...]
复制代码

至此,这次同步工做完成!

相关文章
相关标签/搜索