github中fork分支和pullrequest的最佳实践

*/-->

code {color: #FF0000}
pre.src {background-color: #002b36; color: #839496;}

github中fork分支和pullrequest的最佳实践

最近在参与一个国外的github开源项目,遇到自己fork了源库,一段时间之后,源库已经更新了一些内容,这样,自己fork的版本就落后于源库了。那怎么才能与源库保持同步呢?
youbute上一个教学视频讲得非常清楚:
https://www.youtube.com/watch?v=M7ZYkjOWr6g

我这里用文件记录一下,方便以后参阅和查找:
首先,假设有一个远程的repository:
https://github.com/ensime/ensime-server.git

  • 我们需要在界面上,点击右上角的“Fork”,复制一个仓库到自己的github账号下。
  • 然后,把自己账户下到远程仓库复制到本地:
    git clone https://github.com/yangwen0228/ensime-server.git
    git remote add upstream https://github.com/ensime/ensime-server.git
    git remote -v

    =>

    origin  https://github.com/yangwen0228/ensime-server.git (fetch)
    origin https://github.com/yangwen0228/ensime-server.git (push)
    upstream https://github.com/ensime/ensime-server.git (fetch)
    upstream https://github.com/ensime/ensime-server.git (push)
  • pull request
    毕竟,我们fork仓库就是需要做贡献。这时,我们就要做本地checkout一个新到分支,然后在新到分支里面做修改,保持fork到自己github仓库的主分支永远只用于与upstream的仓库进行同步,任何修改都只是在自己新开的临时分支中进行,进行pull request时也使用临时分支,这样当upstream中有冲突时,只需要使用本地主分支与upstream分支进行rebase同步。这样,本地的主分支永远与upstream的主分支是同步的。而此时,再把临时分支和本地主分支进行一个rebase同步,将conflict修改好,再push。

    这个过程细化一下是这样的(我这里master主分支是2.0,一般情况下,默认是master):

    1. 检查当前的分支:

      git branch
      

      =>

      * 2.0
      
    2. 创建一个新的临时分支:
      git checkout -b dev
      git branch

      =>

      2.0
      * dev
    3. 修改代码,修改完之后,需要把变化commit到这个分支里面
      git status
      git add .
      git commit -m "#122: some changes."
    4. 将临时分支上传到github:
      git push origin dev
      
    5. 在github上进行pull request
      如果一切顺利,那么到这里,远程到maintainer接受了你的pull request。那么,只需要使用本地主分支与upstream分支进行rebase同步,然后删除本地的dev分支即可。

      git push origin --delete dev # 删除github上的dev分支
      git branch -D dev # 删除本地dev分支
      git checkout 2.0
      git pull --rebase upstream 2.0
      git push
    6. 如果分支提交之后,远程upstream的分支进行了修改,这是最麻烦的。
      git checkout 2.0
      git pull --rebase upstream 2.0
      git checkout dev
      git rebase 2.0

      这时rebase后,有可能会有冲突,就需要手动把conflict修复掉。然后,

      git add .
      git rebase --continue
    7. 再将从upstream同步后的内存更新到github上:
      git push --force
      

      由于github上的commit顺序与本地不同,如果直接push需要merge,那就整个乱了。所以,需要使用–force直接覆盖掉github的。

Date: 2017-04-22 10:21

Author: WEN YANG

Created: 2017-07-29 Sat 20:34

Emacs 25.2.1 (Org mode 8.2.10)

Validate

github中fork分支和pullrequest的最佳实践的更多相关文章

  1. paip.提升性能--多核编程中的java .net php c++最佳实践 v2.0 cah

    paip.提升性能--多核编程中的java .net php c++最佳实践  v2.0 cah 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax ...

  2. Java 编程中关于异常处理的 10 个最佳实践

    异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 ...

  3. github上fork分支后再合入原master分支的改动

    几个月前看到一个电商项目,文档比较全,fork下来学习下.后来因为其他事情耽搁了,现在想重新看看,发现改动比较大,master分支跟我fork下来的分支不一样了.咋办?简单,把最新的master分支下 ...

  4. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...

  5. 快速web开发中的前后端框架选型最佳实践

    这个最佳实践是我目前人在做的一个站点,主要功能: oauth登录 发布文章(我称为"片段"),片段可以自定义一些和内容有关的指标,如“文中人物:12”.支持自定义排版.插图.建立相 ...

  6. Java中处理异常的9个最佳实践

    Java中的异常处理不是一个简单的话题.初学者很难理解,甚至有经验的开发人员也会花几个小时来讨论应该如何抛出或处理这些异常. 这就是为什么大多数开发团队都有自己的异常处理的规则和方法.如果你是一个团队 ...

  7. 避免Java中NullPointerException的Java技巧和最佳实践

    Java中的NullPointerException是我们最经常遇到的异常了,那我们到底应该如何在编写代码是防患于未然呢.下面我们就从几个方面来入手,解决这个棘手的​问题吧.​ 值得庆幸的是,通过应用 ...

  8. GitHub中Fork来的仓库如何进行双向更新

    一.做点贡献 想对别人的某个仓库"做点贡献"怎么办? 1. Fork该仓库 首先Fork该仓库,本文以git-learn这个仓库为例 这样自己的账号下就会出现这样一个仓库 2. C ...

  9. github中fork的使用

    转载https://www.cnblogs.com/patchouli/p/6511251.html 由于git的权限控制功能比较弱,如果想给某个项目提供代码除了直接获得项目的push权限外,gith ...

随机推荐

  1. SAP内表查询速度优化实例-OPEN SQL

    一.FOR ALL ENTRIES IN 案例 今天碰到工单报工统计分析表查询速度特别慢 经查看源代码: SELECT afpo~dwerk afko~aufnr afpo~matnr AS plnb ...

  2. GMTC全球大前端技术大会-未来已来

    GMTC-2019北京 GMTC这次的大会的热词肯定是监控.性能,当然跨平台依然是热点,write once,run anywhere!,以下是自己参加的总结心得. 6.20上午 前端的演化 核心理念 ...

  3. HDU 1398 Square Coins(DP)

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  4. Python 的PIL,可以解决ImportError The _imagingft C module is not installed

    删除PIL相关文件 mv PIL /tmp   pip install Pillow 安装Pillow后, 可能还会发生KeyError的错误, 检查项目源码后发现是 Image 模块的save函数中 ...

  5. java -jar 中文乱码

    java -Dfile.encoding=utf-8 -jar demo.jar 添加编码即可

  6. linux用户的基本操作2 用户密码管理

    目录 linux系统的基本用户操作2 用户的扩展知识 用户密码管理 linux系统的基本用户操作2 3)使用userdel删除账户 语法 : userdel [-r] username -r 同时删除 ...

  7. sqlldr - exit error code 2 in unix (merged)

    http://www.orafaq.com/forum/t/146582/ Thank you for your reply. Load has been successful all the tim ...

  8. java23种设计模式(二)-- 建造者模式和原型模式

    一.建造者模式 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示. 特点: (1).在某些属性没有赋值之前,复杂对象不能作为一个完整的产品使用.比如汽车包括方向盘.车门.发动机 ...

  9. Elasticsearch 分布式文档存储

    shard = hash(routing) % number_of_primary_shards决定文档在哪个分片上,routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值. ...

  10. Tmux 中开启鼠标选择与复制

    在 tmux.conf 中加入下列设置(tmux 2.1 之前的版本): set -g mode-mouse on set -g mouse-resize-pane on set -g mouse-s ...