问题是这样的:
当我们 fork 别人的开源项目之后,如果对方发生新的提交,我们如何更新呢?
最省事的方法
- 直接删除自己原来 fork 的项目
- 然后重新 fork 一次,
- 缺点
这样做,最简单,但是有很多问题,如果你已经在原版本做了很多修改,那就不利于你下次代码合并;
使用git merge 的方法
- 进入当前已经 fork 的仓库目录
- 查看远程仓库路径
$ git remote -v
origin https://github.com/xx.git (fetch)
origin https://github.com/xx.git (push)
我的结果只有上述两行,那么说明还未设置 upstream (中文叫:上游代码库)。一般情况下,设置好一次 upstream 后就无需重复设置。
- 添加远程仓库
$ git remote add upstream https://github.com/xx2.git
# 添加完成之后, 执行下述命令查看是否添加成功,如下所示,upstream 添加陈成功
$ git remote -v
origin https://github.com/xx.git (fetch)
origin https://github.com/xx.git (push)
upstream https://github.com/xx2.git (fetch)
upstream https://github.com/xx2.git (push)
- commit
如果你之前 fork 之后,已经进行了很多修改,那么在 merge 之前,最好在本地仓库 commit 掉
# 查看当前所有修改
$ git status
git add -A 或者 git add filename
git commit -m "modify log"
git push origin master
git status
- merge 关键
如果你没有做任何修改,那么可以略过第 4 步骤。
# 更新原始仓库
$ git fetch upstream
Username for 'https://github.com/xx2.git': xxx
Password for 'https://github.com/xx2.git':
remote: Enumerating objects: 101, done.
remote: Counting objects: 100% (101/101), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 115 (delta 97), reused 100 (delta 97), pack-reused 14
Receiving objects: 100% (115/115), 52.34 KiB | 10.47 MiB/s, done.
Resolving deltas: 100% (97/97), completed with 68 local objects.
From https://github.com/xx2.git
* [new branch] master -> upstream/master
- 切换分支
$ git checkout master
# 切换分支,确保分支在你自己的分支上,如果已经在自己的分支上,会打印如下信息
Already on 'master'
Your branch is up to date with 'origin/master'.
- 合并 upstream 最新到 自己的 mater
$ git merge upstream/master
# 显示合并的内容
Updating ba4fc06..a72de66
Fast-forward
src/__init__.py | 2 +-
src/ss.py | 8 ++-
docs/dfg(2).csv | 74 ++++++++++-----------
docs/dd - Fused.csv | 4 +-
docs/dddd- Primitive.csv | 58 ++---------------
include/qqq.h | 7 +-
- push
第7步,将原始仓库的内容 merge 到了本地,此时你在本地执行 git log 发现于原始仓库的log 相同,但是你自己的remote仓库还未更新;
git push origin master
执行完成之后, 在网页上查看自己 fork 仓库的变化:
自己 fork 的 仓库变化, commit 数量与 最新日志与原仓库一致。
日志一直,说明push成功。