git-github fork 后同步源仓库的新提交/向开源框架提交pr

本文详细介绍如何在GitHub上通过Fork项目、提交PR及使用Rebase提高PR质量的完整流程。涵盖同步源仓库新提交、区分origin与upstream、git分支管理、处理脏PR等关键技术点。

github fork 后同步源仓库的新提交

官网参考: [Syncing a fork]: https://help.github.com/en/articles/syncing-a-fork
github fork 后同步源仓库的新提交
参考URL: https://www.cnblogs.com/Mr-O-O/p/11668464.html
git: 保持fork的项目与上游同步
参考URL: https://cloud.tencent.com/developer/article/1348597
git 同步远程仓库
参考URL: https://www.cnblogs.com/codehome/p/10075823.html

注:先把fork的仓库clone到你本地。下面的都是基于本地仓库操作的!

  1. 查看你的本地仓库的远程仓库配置
$ git remote -v
> origin  https://github.com/YOUR_USERNAME/你的fork仓库.git (fetch)
> origin  https://github.com/YOUR_USERNAME/你的fork仓库.git (push)
  1. 配置一个远程仓库指向源仓库。 (添加上游仓库)
    $ git remote add upstream https://github.com/ORIGINAL_OWNER/源仓库.git

demo: loutus项目

git remote add upstream https://github.com/filecoin-project/lotus.git
git remote -v
  1. 再次查看你本地仓库的远程仓库配置
$ git remote -v
> origin    https://github.com/YOUR_USERNAME/你的fork仓库.git (fetch)
> origin    https://github.com/YOUR_USERNAME/你的fork仓库.git (push)
> upstream  https://github.com/ORIGINAL_OWNER/源仓库.git (fetch)
> upstream  https://github.com/ORIGINAL_OWNER/源仓库.git (push)
  1. 把远程的源仓库fetch到本地,此时远程源仓库的新提交并不在你的master分支!而是在upstream/master 分支.
$ git fetch upstream
> remote: Counting objects: 75, done.
> remote: Compressing objects: 100% (53/53), done.
> remote: Total 62 (delta 27), reused 44 (delta 9)
> Unpacking objects: 100% (62/62), done.
> From https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY>  * [new branch]      master     -> upstream/master

默认情况下,git fetch取回所有分支(branch)的更新
git fetch upstream: #抓取在著名开源项目的GitHub仓库上新的提交数据到本地仓库

  1. 切换到master分支
    git branch 查看分支
$ git checkout master
> Switched to branch 'master'
  1. 把fetch下来的 upstream/master 分支 合并到master分支!这里假设没有冲突,且你的本地没有新的提交! ( 将upstream/master merge到 本地master分支)
$ git merge upstream/master
> Updating a422352..5fdff0f
> Fast-forward
>  README                    |    9 -------
>  README.md                 |    7 ++++++
>  2 files changed, 7 insertions(+), 9 deletions(-)
>  delete mode 100644 README
>  create mode 100644 README.md
  1. 然后在master分支上 直接git push就好了。此时你fork的仓库就与源仓库一致了。
git push origin master

总结:给 fork 配置一个 remote
主要使用 git remote -v 查看远程状态。
添加一个将被同步给 fork 远程的上游仓库
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
再次查看状态确认是否配置成功。
git remote -v

git remote -v
#git remote add upstream https://github.com/filecoin-project/lotus.git
git fetch upstream
git checkout master
git merge upstream/master
git push origin master

github中origin和upstream的区别

官网描述:
When a repo is cloned, it has a default remote called origin that points to your fork on GitHub, not the original repo it was forked from. To keep track of the original repo, you need to add another remote named upstream.
git remote add upstream git://github.com/user/repo_name.git
在这里插入图片描述当执行git branch -v命令时,某些分支的前缀为origin ( remotes/origin/… ),而其他分支的前缀为upstream ( remotes/upstream/… )。

origin是你所克隆的原始仓库的默认名字,upstream是fork的原项目的远程仓库的默认名字。

可以用git fetch [remote-name]命令从远程仓库抓取数据到本地:

git fetch origin #抓取在你的GitHub仓库上新的提交数据到本地仓库
$ git fetch upstream #抓取在著名开源项目的GitHub仓库上新的提交数据到本地仓库

总结:

  1. 如果是 upstream repo,你只可以拉取最新代码(即 git fetch ),从而保证你本地的仓库与源仓库同步
  2. 如果是 origin repo,就是你自己的repo(自己创建的,或者 fork 的项目)你可以做 任何推拉操作(pull and push)
  3. 你可以通过 pull request 向 upstream repo 贡献代码

git 分支查看与切换


# 1.查看所有分支
> git branch -a
  
# 2.查看当前使用分支(结果列表中前面标*号的表示当前使用分支)
> git branch

# 3.切换分支
> git checkout 分支名

向开源框架提交pr

github----向开源框架提交pr的过程
原文链接:https://blog.youkuaiyun.com/vim_wj/article/details/78300239
如何为Github开源项目提交PR
参考URL: https://www.yuque.com/qinboqin/tg0c5y/ny150b

  • 第一次fork,并提交PR流程:
  1. fork别人代码
  2. git clone到本地
  3. 创建分支
    git checkout -b shepf-dev

修改源码,git push
4. 提交pr (注意是在自己项目github页面 点击 创建PR,不用进到原开源项目。即 到Github自己的repository,web界面切到你修改代码的分支,点击PR按钮就可以了)
需要注意的是compare处选择刚才提交上来的分支

  • 上面第一次,以后提交pr,步骤如下:
    多了从upstream(开源原仓库)拉最新代码和rebase
git remote -v
#git remote add upstream https://github.com/filecoin-project/lotus.git
git fetch upstream
# 如果项目有子模块 git submodule 更新子模块
# git submodule update --init --recursive
#git rebase upstream/master
然后你切到你自己的分支,比如 xxx-master
使用IDEA, 选择 upstream/master(你要改的的github那个分支),选择 Merge into Current,把最新的github代码合并到你当前分支。

执行完这一步,你的代码就和github开源分支代码一致了,接下来:

修改源码,git push
再github 页面,提交pr

使用 git rebase 提高 PR 质量

使用 git rebase 提高 PR 质量
参考URL: https://juejin.im/post/6844903497645686797

在 Github 上以提交 PR 的方式参与开源项目是十分简单的。不过由于 Git 本身自由度较高,有些随意提出的 PR 实际上是会影响项目历史记录的【脏】PR。下文介绍何时会发生这种情况,以及如何通过 rebase 工作流改进它。

什么是 rebase?

git rebase 还是 merge的使用场景最通俗的解释
参考URL: https://www.jianshu.com/p/4079284dd970

git rebase 你其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点。这个时候才能知道你当前分支于你需要比较的分支之间的差异。

git rebase 你其实可以把它理解成是“重新设置基线”,将你的当前分支重新设置开始点。这个时候才能知道你当前分支于你需要比较的分支之间的差异。

首先假设项目主干分支是 master,你在 fork 而来的仓库下新增了 dev 分支。你从 master 的 m1 提交开始,在 dev 提交了 d1、d2 和 d3 三次提交。这时,master 也更新了 m2 和 m3 两次提交。这时候版本树大致长这样

m0 -- m1 -- m2 -- m3
      |
      d1 -- d2 -- d3

这时你的目标是将三次 dev 上的 commit 合并为一个新的 d,让 dev 的历史变成这样:
为了实现这一点,你可以在 dev 上 rebase 到 master:

git checkout dev
git rebase -i master

rebase 的原理是:

  1. 首先找到两个分支(dev 和 master)的最近共同祖先 m1。
  2. 对比当前 dev 分支相比 m1 的历次提交,提取修改,保存为临时文件。
  3. 将分支指向 master 最新的 m3。
  4. 依次应用修改。

在【依次应用修改】的这一步中,你可以进一步选择如何对待 d1、d2 和 d3 的 commit message。在以 -i 参数启动了交互式的 rebase 后,会进入 vim 界面,由你选择如何操作 dev 上的提交记录。

你可以编辑对 dev 上这几个 commit 的处理,如输入 pick 为保留,输入 squash 则将该 commit 内容并入上一个 commit 等。

总结: rebase会把你当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像你从公共分支又重新拉出来这个分支一样。

举例:如果你从 master 拉了个feature分支出来,然后你提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的时候多了几个 commit,如果这个时候你 rebase master 的话,就会把你当前的几个 commit,放到那个人 commit 的后面。

在这里插入图片描述

什么是脏 PR

我们知道,如果你想为某个开源项目贡献代码,通用的流程是:

  • fork 项目到自己的仓库。
  • 在新开的分支上提交。
  • 提出 PR 请求维护者将你的新分支合并至原项目。

在最后一步中,你所提交的 PR 会包括新分支上全部的历史记录。这时候,如果出现下面的几种情况之一,在这里我们就认为这个 PR 属于【脏】PR:

  1. PR 分支和原仓库的目标分支存在冲突
  2. PR 包含了许多琐碎的 commit 记录,如 fix bug / add dev 等缺乏实际意义的提交信息。
  3. PR 包含了多个不必要的 Merge 记录。一般来说,fork 出的仓库和原仓库保持同步的最简单方式,是 fetch 原仓库后将 HEAD merge 到当前分支。这个操作每执行一次,就会在当前分支留下一个类似 Merge xxx 的 commit 记录。
  4. PR 包含了与主题不符的改动,如留下冗余的日志文件、在其它模块中添加了额外的调试用代码等。

如何处理脏 PR

rebase

通过 git rebase 命令,我们能够获得对 git 提交历史更大的掌控。不过,这也是一个存在风险的命令,因此在实际使用前建议稍加了解其原理。

如何通过 rebase 解决呢?

  1. 遇到和远程主库的冲突时,可以先将远程仓库 fetch 下来,而后将自己的 dev 分支 rebase 到新的 HEAD 上。
  2. 冗余的 commit 记录可以直接 rebase 合并。
  3. 和 1 类似地,通过将自己的 dev 分支 rebase 到新的远程库 HEAD 的方式,不会留下冗余的 Merge 记录。
  4. 提交一个新 commit 修复问题,而后 rebase 即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值