赞
踩
通常我们对开源项目做贡献的时候有两种方式:一是发送 *.patch 文件到相关维护者邮箱。kernel项目就是如此方式。二是fork一份项目代码到自己仓库,修改后提交PR(全称Pull Request),github上大部分项目就是这种方式。
基于第二种PR方式来贡献开源时的工作流程原理如下图1所示。基本流程就是先fork一份代码到自己的远程仓库(这个过程可以在github官网上界面完成),然后在本地主机上clone 自己远程仓库到本地,之后的修改编译工作都是在本地仓库进行。当准备提交代码时,先是通过git add、git commit、git push等一系列命令提交代码到自己的远程仓库,然后在github官网上通过界面进行PR操作向原始的项目代码仓库,等待原始项目的社区维护者进行代码审核即可。
但是这个过程经常会遇到这样的问题:fork了一个github开源项目到自己的远程仓库,一段时间后如何保持本fork的仓库和原仓库的代码保持同步的。github并没有自动同步机制,同步操作需要我们手动完成。通常github上可以通过界面操作完成,但缺点是每次同步完成后都会在本地仓库代码里多出一个 “Merge:******” 这样的commit标识。这不利于我们再次提交PR。所以本文介绍在我们准备提交PR时,如何使用命令行的方式完成原始代码到自己远程和本地仓库的同步操作,命令行操作就避免了多出无用的commit的问题。基本原理如下:
1、在本地仓库添加原仓库为上游代码库。
2、然后将原仓库同步到自己本地仓库。
3、然后本地仓库再push到自己的远程的fork库。
建议流程图如下图2所示:
以我维护的criu项目为例,同步原criu仓库具体流程如下:
步骤1:在本地仓库添加原仓库为上游代码库。命令格式:git remote add upstream 原仓库路径
- # # 查看本地仓库现有情况
- # git remote -v
- origin https://github.com/sunny868/criu.git (fetch)
- origin https://github.com/sunny868/criu.git (push)
-
- # # 配置原仓库checkpoint-restore/criu.git
- # git remote add upstream https://github.com/checkpoint-restore/criu.git
-
- ## 再次查看情况
-
- # git remote -v
- origin https://github.com/sunny868/criu.git (fetch)
- origin https://github.com/sunny868/criu.git (push)
- upstream https://github.com/checkpoint-restore/criu.git (fetch)
- upstream https://github.com/checkpoint-restore/criu.git (push)
-
上面操作中,最下面两行的upstream就是新添加到本地库的原仓库。
步骤2:抓取原仓库的修改文件。命令格式为:git fetch upstream
- # git fetch upstream
- remote: Enumerating objects: 499, done.
- 接收对象中: 100% (709/709), 144.94 KiB | 13.00 KiB/s, 完成.
- 处理 delta 中: 100% (505/505), 完成 36 个本地对象.
- 来自 https://github.com/checkpoint-restore/criu
- * [新分支] br-1.3-stable -> upstream/br-1.3-stable
- * [新分支] criu-dev -> upstream/criu-dev
- * [新分支] master -> upstream/master
完成后,可以使用命令"git branch -a "查看本地所有分支,我们会发现本地多出来几个“ remotes/upstream/** ”分支
- # git branch -a
- * criu-dev
- remotes/origin/HEAD -> origin/criu-dev
- remotes/origin/criu-dev
- remotes/origin/master
- remotes/upstream/br-1.3-stable
- remotes/upstream/criu-dev
- remotes/upstream/master
步骤3:同步原仓库到本地仓库。命令格式为:git merge upstream/分支名
此处以同步原仓库的criu-dev分支到本地仓库的criu-dev分支为例:
- # git merge upstream/criu-dev
-
- 更新 1d9bbd6..996a11d
- Fast-forward
- .travis.yml | 4 +
- Makefile | 10 +-
- compel/arch/mips/plugins/include/asm/prologue.h | 36 +++
- ..
同步完成后,可以使用命令“git log"确认一下同步是否成功。正常情况你将看到和原仓库criu-dev分支下相同的最新的commit。
这时我们已经完成了远程原仓库的最新代码到自己本地库的更新。对应图2中的“5.fetch”步骤。
步骤4:推送本地仓库的更新到github的自己远程仓库。命令格式为:git push origin HEAD --force
- # git push origin HEAD --force
-
- Total 0 (delta 0), reused 0 (delta 0)
- To https://github.com/sunny868/criu.git
- 1d9bbd6..996a11d HEAD -> criu-dev
这样,我们就把本地的最新代码推送到自己的远程仓库。对应图2中的“6.push”步骤。
整个过程,自己的本地仓库和远程仓库都不会多出额外的“Merge:”的commit。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。