团队开发里频繁使用 git rebase 来保持树的整洁好吗?
用了以后, 树可以非常清晰, 某种程度上便于追踪, 但是 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
master
, origin/master
而jerry的机器上也是有两个branch
master
, origin/master
均如下图所示
tom和jerry分别各自开发自己的新feature,不断有新的commit提交到他们各自私有的commit history中,所以他们的master指针不断的向前推移,分别指向不同的commit。而又由于他们都没有git fetch
和git 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 来保持树的整洁好吗?相关推荐
- git 打tag_图文讲解,团队开发中的 Git 最佳实践
私信我,回复:学习,获取免费学习资源包. 在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品--Git.它的出现改变了软件开发流程,大大地提高了开发流 ...
- 团队开发中的 Git 实践
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 本文转载自:https://segmentfault.com/a/ ...
- 图文讲解,团队开发中的 Git 最佳实践
在 2005 年的某一天,Linux 之父 Linus Torvalds 发布了他的又一个里程碑作品--Git.它的出现改变了软件开发流程,大大地提高了开发流畅度!直到现在仍十分流行,完全没有衰退的迹 ...
- git拉取tag_不给队友拖后腿!团队开发中 Git 最佳实践
来源 | 欧雷 编辑 | GitHubDaily(id:GitHubDaily) 出处 | ourai.ws/posts/working-with-git-in-team/ 前言 在 2005 年的某 ...
- git 打tag_团队开发中的 Git 实践
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:2020,搞个 Mac 玩玩! 个人原创+1博客:点击前往,查看更多 作者:欧雷链接:https://segme ...
- 团队开发神器Git全功能介绍
Git 历史和现状 Git 是 Linux 作者 Linus 的另一个作品.2002 年他还在使用 Bitkeeper 作为 Linux 内核的版本管理,但因为它是 Copyright 有版权的软件备 ...
- [.net 面向对象程序设计进阶] (27) 团队开发利器(六)分布式版本控制系统Git——在Visual Studio 2015中使用Git...
[.net 面向对象程序设计进阶] (26) 团队开发利器(六)分布式版本控制系统Git--在Visual Studio 2015中使用Git 本篇导读: 接上两篇,继续Git之旅 分布式版本控制系统 ...
- 我在企业中是怎么简单使用Git的参与团队开发的?Git使用教程
Git是一门工具,也是一门学问,你想怎样学.怎样用都取决于你: 我这里说的是我们能够入门使用Git与切实体会到Git好处的基本要求. 一.下载安装 很简单,可参看百度教程git下载安装图文教程 二.初 ...
- git 思考 -- 个人开发者与团队开发有何不同
团队开发的注意点 一. 融入项目为什么和个人编程不一样 1. 大型项目需要注意哪些问题 2. 如何与团队进行合作 3. 解决大型项目的问题 4. 流程化开发管理 5. 如何与团队进行合作 6.git ...
最新文章
- 神经网络基础知识总结
- DDM实践:数据库秒级平滑扩容方案
- python序列化和反序列化ppt_老生常谈Python序列化和反序列化
- 继承Comparable接口来实现排序
- 关于敏捷开发方法(Agile Software Development)的阅读笔记
- 第八十四期: Java、Web 和移动程序员学习的 12 个框架
- 总结深度学习各种网络结构【更新中...】
- centos下添加windows启动项
- 2021-08-08 事务的提交,回滚
- Mysql8.0 15安装后怎么打开_最新最全mysql8.0.15安装配置及连接Navicat教程
- Java 添加Word文本水印、图片水印
- 用Windows自带的工具写一个一键关机小程序
- PhoneGap Cordova 安装白皮书
- 极客日报第 40 期:小米 11 发布,售价 3999 元起;罗永浩回应败诉半导体公司
- react组件的render方法
- for循环不执行的小坑
- 解决使用plt.savefig保存图片时一片空白
- java基础入门txt下载地址_java基础入门-ZipOutputStream打包下载
- 用面向对象方法实现求圆和椭圆的周长与面积
- 读取SolidWorks文档中的属性,生成PDF(工具开发)