用了以后, 树可以非常清晰, 某种程度上便于追踪, 但是 push --force 就多多了,
不用呢, 合并没有远程仓库被修改的麻烦, 可是追踪又不清晰...

git rebase是对commit history的改写。当你要改写的commit history还没有被提交到远程repo的时候,也就是说,还没有与他人共享之前,commit history是你私人所有的,那么想怎么改写都可以。

而一旦被提交到远程后,这时如果再改写history,那么势必和他人的history长的就不一样了。git push的时候,git会比较commit history,如果不一致,commit动作会被拒绝,唯一的办法就是带上-f参数,强制要求commit,这时git会以committer的history覆写远程repo,从而完成代码的提交。虽然代码提交上去了,但是这样可能会造成别人工作成果的丢失,所以使用-f参数要慎重。

楼主遇到的问题,就是改写了公有的commit history造成的。要解决这个问题,就要从提交流程上做规范。

举个正确流程的栗子:

假设楼主的team中有两个developer:tom和jerry,他们共同使用一个远程repo,并各自clone到自己的机器上,为了简化描述,这里假设只有一个branch:master

这时tom机器的repo有两个branch
masterorigin/master
而jerry的机器上也是有两个branch
masterorigin/master

均如下图所示

tom和jerry分别各自开发自己的新feature,不断有新的commit提交到他们各自私有的commit history中,所以他们的master指针不断的向前推移,分别指向不同的commit。而又由于他们都没有git fetchgit push,所以他们的origin/master都维持不变。

jerry的repo如下

tom的repo如下,注意T1和上图的J1,分别是两个不同的commit

这时Tom首先把他的commit提交的远程repo中,那么他本机origin/master指针则会前进,和master指针保持一致,如下

远程repo如下

现在jerry也想把他的commit提交到远程repo上去,运行git push,毫无意外的失败了,所以他git fetch了一下,把远程repo,也就是之前tom提交的T1给拉到了他本机repo中,如下

commit history出现了分叉,要想把tom之前提交的内容包含到自己的工作中来,有一个方法就是git merge,它会自动生成一个commit,既包含tom的提交,也包含jerry的提交,这样就把两个分叉的commit重新又合并在一起。但是这个自动生成的commit会有两个parent,review代码的时候必须要比较两次,很不方便。

jerry为了保证commit history的线性,决定采用另外一种方法,就是git rebase。jerry的提交J1这时还没有被提交到远程repo上去,也就是他完全私有的一个commit,所以使用git rebase改写J1的history完全没有问题,改写之后,如下

注意J1被改写到T1后面了,变成了J1`

git push后,本机repo

而远程repo

异常的轻松,一条直线,没有-f

所以,在不用-f的前提下,想维持树的整洁,方法就是:在git push之前,先git fetch,再git rebase

git fetch origin master
git rebase origin/master
git push

强烈推荐阅读

  • a successful git branching model
  • Git-分支-分支的衍合

转载于:https://www.cnblogs.com/XACOOL/p/5625781.html

团队开发里频繁使用 git rebase 来保持树的整洁好吗?相关推荐

  1. git 打tag_图文讲解,团队开发中的 Git 最佳实践

    私信我,回复:学习,获取免费学习资源包. 在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品--Git.它的出现改变了软件开发流程,大大地提高了开发流 ...

  2. 团队开发中的 Git 实践

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 本文转载自:https://segmentfault.com/a/ ...

  3. 图文讲解,团队开发中的 Git 最佳实践

    在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品--Git.它的出现改变了软件开发流程,大大地提高了开发流畅度!直到现在仍十分流行,完全没有衰退的迹 ...

  4. git拉取tag_不给队友拖后腿!团队开发中 Git 最佳实践

    来源 | 欧雷 编辑 | GitHubDaily(id:GitHubDaily) 出处 | ourai.ws/posts/working-with-git-in-team/ 前言 在 2005 年的某 ...

  5. git 打tag_团队开发中的 Git 实践

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020,搞个 Mac 玩玩! 个人原创+1博客:点击前往,查看更多 作者:欧雷链接:https://segme ...

  6. 团队开发神器Git全功能介绍

    Git 历史和现状 Git 是 Linux 作者 Linus 的另一个作品.2002 年他还在使用 Bitkeeper 作为 Linux 内核的版本管理,但因为它是 Copyright 有版权的软件备 ...

  7. [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git...

    [.net 面向对象程序设计进阶] (26) 团队开发利器(六)分布式版本控制系统Git--在Visual Studio 2015中使用Git 本篇导读: 接上两篇,继续Git之旅 分布式版本控制系统 ...

  8. 我在企业中是怎么简单使用Git的参与团队开发的?Git使用教程

    Git是一门工具,也是一门学问,你想怎样学.怎样用都取决于你: 我这里说的是我们能够入门使用Git与切实体会到Git好处的基本要求. 一.下载安装 很简单,可参看百度教程git下载安装图文教程 二.初 ...

  9. git 思考 -- 个人开发者与团队开发有何不同

    团队开发的注意点 一. 融入项目为什么和个人编程不一样 1. 大型项目需要注意哪些问题 2. 如何与团队进行合作 3. 解决大型项目的问题 4. 流程化开发管理 5. 如何与团队进行合作 6.git ...

最新文章

  1. 神经网络基础知识总结
  2. DDM实践:数据库秒级平滑扩容方案
  3. python序列化和反序列化ppt_老生常谈Python序列化和反序列化
  4. 继承Comparable接口来实现排序
  5. 关于敏捷开发方法(Agile Software Development)的阅读笔记
  6. 第八十四期: Java、Web 和移动程序员学习的 12 个框架
  7. 总结深度学习各种网络结构【更新中...】
  8. centos下添加windows启动项
  9. 2021-08-08 事务的提交,回滚
  10. Mysql8.0 15安装后怎么打开_最新最全mysql8.0.15安装配置及连接Navicat教程
  11. Java 添加Word文本水印、图片水印
  12. 用Windows自带的工具写一个一键关机小程序
  13. PhoneGap Cordova 安装白皮书
  14. 极客日报第 40 期:小米 11 发布,售价 3999 元起;罗永浩回应败诉半导体公司
  15. react组件的render方法
  16. for循环不执行的小坑
  17. 解决使用plt.savefig保存图片时一片空白
  18. java基础入门txt下载地址_java基础入门-ZipOutputStream打包下载
  19. 用面向对象方法实现求圆和椭圆的周长与面积
  20. 读取SolidWorks文档中的属性,生成PDF(工具开发)

热门文章

  1. AWK 批量杀进程号,好记性不如烂笔头
  2. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例
  3. 给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
  4. access中case替代方法
  5. 一个全球主要城市天气预报的WebService.
  6. Spark源码分析之DiskBlockMangaer分析
  7. (95)Vivado时序约束TCL命令-all
  8. (42)Verilog HDL 打两拍设计
  9. (17)Zynq FPGA 全局定时器介绍
  10. (7)verilog语言编写UART接收