1. 当前分支落后拉取后,整理commit,使得提交历史为直线

git pull = git fetch + git merge

git pull --rebase = git fetch + git rebase

其实--rebase的目的只有两个:

1.让多个人在同一个分支开发的提交节点形成一条线,而不是多条线

2.让你提交的commit在该分支的最前面

当push被reject的时候,可以用 git pull --rebase 拉取内容,将提交记录保持一条直线

git pull --rebase时候,不能有modified状态的文件,可以有Untracked files。modified状态的文件,可以commit或者stash一下,通常的操作有:

$ git stash
$ git pull --rebase
$ git push
$ git stash pop

2. 别的分支合并到master,先整理为直线,再合并

1. 开辟特性分支 git checkbox -b feature
2. 在feature分支提交commit
3. 在feature git reabse -i 合并多个commit为一个,简化提交历史。这样可以在git rebase时候减少冲突解决次数。
4. 在feature git pull origin master --rebase (相当于git fetch origin master, git rebase origin/master)
                                                                    将master最新commit同步到此分支,可能要手动解决冲突(合并过程中,异常退出vi窗口,
                                                                    用git rebase --edit-todo恢复,修改完,git rebase --continue 继续下一步,
                                                                   忽略,git rebase --skip,终止,用git rebase —abort)
5. 切回master,git merge feature 将feature分支内容合并到master
6. git push提交master

如此,master的提交历史将是一条直线。

3. 分支的多个连续commit复制到其他分支

git rebase [startpoint] [endpoint] --onto [branchName] //将多个连续commit添加到目标分支branchName, [startpoint] [endpoint]指定的是一个 前开后闭的区间

例如:

git rebase 90bc0045b^ 5de0da9f2 --onto master  //90bc0045b^后退一个commit,做成一个[90bc0045b, 5de0da9f2]闭区间

rebase完后,需要

git reset --hard commitId //将分支的HEAD指向提交的id

4. commit合并

git rebase -i [startpoint] [endpoint] //[endpoint]可省略,将多个commit合并为一个,使用squash模式

例如:

git rebase -i HEAD~3 //往前3个commit,到现在,进行合并

5. commit拆分

git rebase -i 对指定commit的pick改为edit,进行编辑拆分

6. commit排序

git rebase -i 修改列表中commit顺序即可

7. 改变分支起点

git checkout feature2

git rebase master

可以将feature2起点从别的分支改到master分支上

注意点:

主分支上不能rebase,如果如此,主分支的历史将被篡改,不能看到原始的历史记录了

git pull时可以加上--rebase参数, 使之不产生Merge点, 保证了代码的整洁,每次加rebase参数有点麻烦,

给指定分支设置为rebase方式,可以使用如下方式:

 $ git config branch.dev.rebase true

使用时将 "dev" 修改成您自己本地的分支名字,必须cd到工程目录下,才能更改分支配置

所有的分支都应该用rebase

$ git config --global branch.autosetuprebase always

这样新建的分支会设置为rebase,已经建好的还需单独设置

参考:

https://baijiahao.baidu.com/s?id=1633418495146592435&wfr=spider&for=pc
https://www.liaoxuefeng.com/wiki/896043488029600/1216289527823648
https://blog.csdn.net/nrsc272420199/article/details/85555911
https://www.codercto.com/a/45325.html

git rebase使用场景的更多相关文章

  1. 分享几个 git 的使用场景

    你真的会使用 git 吗?你能回答下面几个问题吗? 有三个commit(顺序:CommitA.CommitB.CommitC),它们相互独立,没有依赖. 在不修改B.C的前提下,修改A,怎么操作? 合 ...

  2. git rebase 还是 merge的使用场景最通俗的解释

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

  3. 妙用git rebase --onto指令

    有时候,在分支提交更改的时候,会忘记rebase,就直接提交上去,或者忘记和本地远程分支做merge,就直接rebase了别的分支.有时候真希望有一种切片的方式,让自己的分支只需要接上某一段.这个时候 ...

  4. git merge 与 git rebase

    git merge git rebase merge V.S. rebase 参考材料 写在开始: 对merge和rebase的用法总有疑惑,好像两个都能完成"获取别的branch的comm ...

  5. git rebase 合并多次提交.

    一.应用场景 为什么需要合并多个提交呢? 常常一个功能的开发,修修补补 commit 了 n 多次,带来的结果就是提交过多过杂,不够直观,究竟哪些提交是对应这个功能的呢?还有就是,如果我要将这个功能迁 ...

  6. git merge和git rebase的区别(转)

      Description git rebase 和 git merge 一样都是用于从一个分支获取并且合并到当前分支,但是他们采取不同的工作方式,以下面的一个工作场景说明其区别 场景:  如图所示: ...

  7. git revert .vs. git reset .vs. git rebase

    1. git rervert的工作方式是:将一个老的commit的改动完全找出来,并且在新的tip处运行反操作,最终清除老commit的改动: git revert的应用场景多在对public rep ...

  8. git rebase vs git merge详解

    https://medium.com/@porteneuve/getting-solid-at-git-rebase-vs-merge-4fa1a48c53aa#.std3ddz0g 请参考另外一篇文 ...

  9. git rebase VS git merge? 更优雅的 git 合并方式值得拥有

    写在前面 如果你不能很好的应用 Git,那么这里为你提供一个非常棒的 Git 在线练习工具 Git Online ,你可以更直观的看到你所使用的命令会产生什么效果 另外,你在使用 Git 合并分支时只 ...

随机推荐

  1. Codeforces K. Ice Skating(求强连通分量)

    题目描述: Ice Skating time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  2. 2016年的EK工具

    什么是Exploit Kit? 预打包了安装程序.控制面板.恶意代码以及相当数量的攻击工具.通常基于PHP的一个软件. Exploit Kit经济体制 价格在成百上千美元: 可以按日/周/月来付租金: ...

  3. 项目Beta冲刺--1/7

    项目Beta冲刺--1/7 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Beta冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合评估及 ...

  4. 20180516模拟赛T2——string

    题解 对于一个字符串A,我们只能把其首字符取出,故如果我们想让A串与B串相等,能重复利用的部分只能是A串结尾与B串开头相等的部分.对于取出的字符,我们可以把'o'放在一个容器中,把'x'放在另一个容器 ...

  5. 超文本标记语言(Hyper Text Markup Language):构建网页的语言

    超文本标记语言(Hyper Text Markup Language):构建网页的语言

  6. Makefile 与tab

    Makefile文件由一系列规则(rules)构成.每条规则的形式如下. <target> : <prerequisites> [tab] <commands> 上 ...

  7. linux内核中的文件描述符(二)--socket和文件描述符

    http://blog.csdn.net/ce123_zhouwei/article/details/8459730 Linux内核中的文件描述符(二)--socket和文件描述符 Kernel ve ...

  8. tf.placeholder函数说明

    函数形式: tf.placeholder(     dtype,     shape=None,     name=None ) 参数: dtype:数据类型.常用的是tf.float32,tf.fl ...

  9. 开发(一) ardunio环境配置 针对esp32-cam 更多例程

    第一种  简单版本,针对获取mpu9250数据, http://www.bubuko.com/infodetail-3093785.html 第二种 浮渣版本,针对ESP32获取图像,以及跟多开发例程 ...

  10. PostgreSQL 执行计划

    简介 PostgreSQL是“世界上最先进的开源关系型数据库”.因为出现较晚,所以客户人群基数较MySQL少,但是发展势头很猛,最大优势是完全开源. MySQL是“世界上最流行的开源关系型数据库”.当 ...