rebase的优点和缺点

优点

  • rebase最大的好处是你的项目历史会非常整洁
  • rebase 导致最后的项目历史呈现出完美的线性——你可以从项目终点到起点浏览而不需要任何的 fork。这让你更容易使用 git log、git bisect 和 gitk 来查看项目历史

缺点

  • 安全性,如果你在公共分支上使用rebase,重写项目历史可能会给你的协作工作流带来灾难性的影响
  • 可跟踪性,rebase会更改历史记录,rebase 不会有合并提交中附带的信息——你看不到 feature 分支中并入了上游的哪些更改

分支内合并多个commit为一个新commit使用:

命令:

这里我们使用命令:

  git rebase -i  [startpoint]  [endpoint]

其中-i的意思是--interactive,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。

使用:

log日志:

D:\Git\shell-demo (master -> origin)
$ git l
* d7a7c8f - (HEAD -> master) cc (33 minutes ago) | hongda
* dbe4bac - bb (33 minutes ago) | hongda
* 439e203 - aa (34 minutes ago) | hongda
* 5b38c9e - init (8 months ago) | hongqi

执行rebase命令:

$ git rebase -i 5b38c9e

或者:

$ git rebase -i HEAD~3

弹出的vim界面:

pick 439e203 aa
pick dbe4bac bb
pick d7a7c8f cc # Rebase 5b38c9e..d7a7c8f onto 5b38c9e (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
D:/Git/shell-demo/.git/rebase-merge/git-rebase-todo [unix] (16:23 24/12/2018)

上面未被注释的部分列出的是我们本次rebase操作包含的所有提交,下面注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:

  • pick:保留该commit(缩写:p)
  • reword:保留该commit,但我需要修改该commit的注释(缩写:r)
  • edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
  • squash:将该commit和前一个commit合并(缩写:s)
  • fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
  • exec:执行shell命令(缩写:x)
  • drop:我要丢弃该commit(缩写:d)

修改为:

pick 439e203 aa
s dbe4bac bb
s d7a7c8f cc

在弹出下面的界面,可以修改注释

# This is a combination of 3 commits.
# This is the 1st commit message: modify file # This is the commit message #2: bb # This is the commit message #3: cc # Please enter the commit message for your changes. Lines starting

再次查看日志:

D:\Git\shell-demo (master -> origin)
$ git l
* 7e09cf2 - (HEAD -> master) modify file (69 seconds ago) | hongda
* 5b38c9e - init (8 months ago) | hongqi

多个commitid合并成了一个新的commitid

将其他分支合并到主分支,表现为线性:

mm分支:

D:\Git\shell-demo (mm -> origin)
$ git l
* 01dc337 - (HEAD -> mm) c (7 seconds ago) | hongda
* 1719011 - b (18 seconds ago) | hongda
* 588069c - a (34 seconds ago) | hongda
* 5b38c9e - init (8 months ago) | hongqi

master分支:

D:\Git\shell-demo (master -> origin)
$ git l
* 5b38c9e - init (8 months ago) | hongqi

合并:

D:\Git\shell-demo (master -> origin)
$ git rebase mm
First, rewinding head to replay your work on top of it...
Fast-forwarded master to mm. D:\Git\shell-demo (master -> origin)
$ git l
* 01dc337 - (HEAD -> master, mm) c (57 seconds ago) | hongda
* 1719011 - b (68 seconds ago) | hongda
* 588069c - a (84 seconds ago) | hongda
* 5b38c9e - init (8 months ago) | hongqi

如果rebase有冲突,跟merge一样解决冲突提交即可。

将其他分支多个commit合并到主分支,并形成一个新commit:

我不建议这么使用,除非这里的分支合并完以后就不使用了,不然的话,以后有新的提交,再次合并,很可能忘记从那个commit开始合并。

命令:

我们使用命令的形式为:

    git rebase   [startpoint]   [endpoint]  --onto  [branchName]

其中,[startpoint] [endpoint]仍然和上一个命令一样指定了一个编辑区间(前开后闭),--onto的意思是要将该指定的提交复制到哪个分支上。

所以,在找到C(90bc0045b)和E(5de0da9f2)的提交id后,我们运行以下命令:

    git  rebase   90bc0045b^   5de0da9f2   --onto master

注:因为[startpoint] [endpoint]指定的是一个前开后闭的区间,为了让这个区间包含C提交,我们将区间起始点向后退了一步

使用:

mm分支:

D:\Git\shell-demo (mm -> origin)
$ git l
* 88dc407 - (HEAD -> mm) e (3 seconds ago) | hongda
* 9cc37e9 - d (14 seconds ago) | hongda
* 01dc337 - c (2 hours ago) | hongda
* 1719011 - b (2 hours ago) | hongda
* 588069c - a (2 hours ago) | hongda
* 5b38c9e - init (8 months ago) | hongqi

master分支:

$ git l
* 41fd42b - (HEAD -> master) modify file for aa commit (39 seconds ago) | hongda
* 5b38c9e - init (8 months ago) | hongqi

rebase命令:

git rebase 588069c  88dc407  --onto master

合并b,c,d,e四个提交到master,注意并不包括a

First, rewinding head to replay your work on top of it...
Applying: b
Using index info to reconstruct a base tree...
M asd.txt
Falling back to patching base and 3-way merge...
Auto-merging asd.txt
CONFLICT (content): Merge conflict in asd.txt
error: Failed to merge in the changes.
hint: Use 'git am --show-current-patch' to see the failed patch
Patch failed at 0001 g
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

如果合并过程中遇到冲突,就解决冲突,并add,再继续rebase

D:\Git\shell-demo (HEAD detached at 80f8fc3 -> origin)
$ git aa D:\Git\shell-demo (HEAD detached at 80f8fc3 -> origin)
$ git rebase --continue

多个合并冲突就会合并多次,合并多次就会产生多个commit,跟我想只有一个commit的意愿违背,非常不喜欢

注意,冲突就会切换到游离分支,解决办法就是创建一个临时分支,用完再删除。

参考:

rebase

【Git】rebase 用法小结

Git rebase详细解析

Git rebase使用的更多相关文章

  1. git rebase

    git rebase -i HEAD~[number_of_commits] git rebase -i HEAD~2

  2. git rebase与 git合并(error: failed to push some refs to)解决方法

    1.遇到的问题 本地有一个git仓库,在github上新建了一个空的仓库,但是更新了REWADME.md的信息,即在github上多了一个提交. 关联远程仓库,操作顺序如下: git remote a ...

  3. 聊下 git rebase -i

    在使用git作为源代码管理工具的时候,开发的时经常会面临一个常见的问题,多个commit 需要合并为一个完整的commit提交. 在一个基本的迭代周期里,你会有很多次commit,有跟配置文件相关的, ...

  4. [git]rebase和merge

    转自:http://blog.csdn.net/wh_19910525/article/details/7554489 Git merge是用来合并两个分支的. git merge b # 将b分支合 ...

  5. git merge 和 git rebase 小结

    Git merge是用来合并两个分支的. git merge b # 将b分支合并到当前分支 同样 git rebase b,也是把 b分支合并到当前分支 ---------------------- ...

  6. [译]git rebase -i

    使用rebase -i会在终端出现一个交互页面. 在这个交互页面中我们可以对要rebase的commit做一定的修改. 用法 git rebase -i <master> 把当前的分支的c ...

  7. [译]git rebase

    rebase就是重新定义你分支的起点, 分支上的commit将生成对应的新的commit并放在你指定的新的起点commit后, 分支上的老commit将被删除. rebase就是将你的分支从一个com ...

  8. git rebase简介(高级篇)

    原文:http://gitbook.liuhui998.com/4_3.html 一.基本   对于git rebase,你亦可以选择进行交互式的rebase.这种方法通常用于在向别处推送提交之前对它 ...

  9. git rebase简介(基本篇)

    原文: http://gitbook.liuhui998.com/4_2.html 一.基本 git rebase用于把一个分支的修改合并到当前分支. 假设你现在基于远程分支"origin& ...

  10. Git merge 与 git rebase的区别

    Git merge的用法: git merge Dev // Dev表示某分支,表示在当前分支合并Dev分支 git merge -m  "Merge from Dev"  Dev ...

随机推荐

  1. PDO数据访问抽象层(下)

    PDO两大功能 一.事务功能 PDO的事务功能主要控制好几条sql语句同时成功或者同时失败(当其中一条SQL语句有错误时,同时好几条一起失败),失败时可以回滚操作 1.造对象 <?php $ds ...

  2. 初识gispro

    因为之前一直用的arcmap,由于项目中用到三维数据的服务发布,需要用到gispro.Gispro与arcmap用法还是有些不同.仅用此文来记录一些简易操作. Gispro简介 ArcGIS Pro是 ...

  3. [10]Windows内核情景分析---中断处理

    中断处理 每个cpu有一张中断表,简称IDT. IDT的整体布局:[异常->空白->5系->硬](推荐采用7字口诀的方式重点记忆) 异常:前20个表项存放着各个异常的描述符(IDT表 ...

  4. python遍历某一位置所有文件夹中的文件

    通过多次遍历达到找出所有文件的目的 import os rootdir=["d:/77"] c=[] for i in rootdir: for parent,dirnames,f ...

  5. 2.sklearn库中的标准数据集与基本功能

    sklearn库中的标准数据集与基本功能 下面我们详细介绍几个有代表性的数据集: 当然同学们也可以用sklearn机器学习函数来挖掘这些数据,看看可不可以捕捉到一些有趣的想象或者是发现: 波士顿房价数 ...

  6. 20155228 实验四 Android开发基础

    20155228 实验四 Android开发基础 实验内容 1.基于Android Studio开发简单的Android应用并部署测试; 2.了解Android.组件.布局管理器的使用: 3.掌握An ...

  7. linux lsof用法

    linux lsof命令详解   简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可 ...

  8. Hive常用语句

    文章目录 1 显示分区 2 添加分区 3 删除分区 4 修改分区 5 添加列 6 修改列 7 修改表属性 8 表的重命名 显示分区 show partitions iteblog; 添加分区 ALTE ...

  9. HashMap集合存储自定义类

    第一种情况,key为String,value为自定义类person类: 输出结果,key重复的被去掉了,key重复的那个value值之前的被最后一个覆盖了: 第二种情况,key为自定义类person类 ...

  10. flask 处理表单数据

    处理表单数据 表单数据的处理涉及很多内容,从获取数据到保存数据大致有以下步骤: 1.  解析请求,获取表单数据 2.  对数据进行必要的转换,比如讲勾选框的值转换成python的布尔值 3.  验证数 ...