git rebase(变基)操作
1.rebase(变基)操作
注意事项:rebase 改变分支的根源,绝对不要在与其他人共享的分支上进行操作rebase黄金法则:绝不要在公共的分支上使用它!
1.1git merge 与 git rebase的区别
1.1.1git merge 合并两个分支并生成一个新的提交
1.1.2git rebase提取操作有点像git cherry-pick一样,执行rebase后依次将当前(执行rebase时所在分支)的提交cherry-pick到目标分支(待rebase的分支)上,然后将在原始分支(执行rebase时所在分支)上的已提交的commit删除。
1.1.3 merge结果能够体现出时间线,但是rebase会打乱时间线
在项目中经常使用git pull来拉取代码,git pull相当于是git fetch + git merge;
在项目中运行git pull -r,也就是git pull --rebase,相当于git fetch + git rebase;
1.2当前分支master

1.3基于当前的master分支创建一个rebase_dev

1.4基于rebase_dev分支增加两次提交

1.5切回master分支,增加两次新的提交

1.6切回rebase_dev,查看当前git log

1.7在rebase_dev分支上进行变基操作
$git rebase master


可以看到rebase的操作,打乱了时间线;版本树形成一条
1.8回顾一下merge的操作
1.8.1初始化一个仓库,基于master,增加两次提交

1.8.2基于master分支,创建merge_dev分支,增加两次提交

1.8.3基于merge_dev,切换至master分支

1.8.4基于master分支增加一次提交,而后切换至merge_dev


1.8.5将master分支合并至merge_dev并完成提交



2.git rebase -i 命令操作
usage: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase> | --keep-base] [<upstream> [<branch>]]
or: git rebase [-i] [options] [--exec <cmd>] [--onto <newbase>] --root [<branch>]
or: git rebase --continue | --abort | --skip | --edit-todo
--onto <revision> rebase onto given branch instead of upstream
--keep-base use the merge-base of upstream and branch as the current base
--no-verify allow pre-rebase hook to run
-q, --quiet be quiet. implies --no-stat
-v, --verbose display a diffstat of what changed upstream
-n, --no-stat do not show diffstat of what changed upstream
--signoff add a Signed-off-by trailer to each commit
--committer-date-is-author-date
make committer date match author date
--reset-author-date ignore author date and use current date
-C <n> passed to 'git apply'
--ignore-whitespace ignore changes in whitespace
--whitespace <action>
passed to 'git apply'
-f, --force-rebase cherry-pick all commits, even if unchanged
--no-ff cherry-pick all commits, even if unchanged
**--continue continue**
--skip skip current patch and continue
--abort abort and check out the original branch
--quit abort but keep HEAD where it is
** --edit-todo edit the todo list during an interactive rebase**
--show-current-patch show the patch file being applied or merged
--apply use apply strategies to rebase
-m, --merge use merging strategies to rebase
-i, --interactive let the user edit the list of commits to rebase
--rerere-autoupdate update the index with reused conflict resolution if possible
--empty <{drop,keep,ask}>
how to handle commits that become empty
--autosquash move commits that begin with squash!/fixup! under -i
-S, --gpg-sign[=<key-id>]
GPG-sign commits
--autostash automatically stash/stash pop before and after
-x, **--exec <exec> add exec lines after each commit of the editable list**
-r, --rebase-merges[=<mode>]
try to rebase merges instead of skipping them
--fork-point use 'merge-base --fork-point' to refine upstream
-s, --strategy <strategy>
use the given merge strategy
-X, --strategy-option <option>
pass the argument through to the merge strategy
--root rebase all reachable commits up to the root(s)
--reschedule-failed-exec
automatically re-schedule any `exec` that fails
--reapply-cherry-picks
apply all changes, even those already present upstream
# 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
# b, break = stop here (continue rebase later with 'git rebase --continue')
# 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.
变基时可用的命令:pick,reword,edit,squash,fixup,exec
2.1准备工作,初始化仓库,添加文件,提交,基于master分支创建rebase_i分支

2.2pick 更改提交顺序、删除提交
2.2.1假定,我们现在要改变提交 M4.txt 和 M3.txt 的顺序,该怎么操作?
2.2.1.1M3.txt是倒数第二次提交,告诉git 我要改变倒数第2次后的提交
$git rebase -i HEAD~2
接着,git给你一个文本,告诉你我知道了,下面注释的是提示,我们不需要管,只要专注前两行就ok

2.2.1.2把第一行和第二行交换顺序.

接着 Esc,:wq 保存退出
2.2.1.3git log 查看更改


2.2.2假定,我们现在要删除某一个提交(假设是M4),该怎么操作?
2.2.1.1M4.txt是排序后的倒数第二次提交,告诉git我要改变倒数第2次后的提交
$ git rebase -i HEAD~2

2.2.2.2删除M4的信息:pick 14929f1 添加了一个M4.txt

11.2.2.3git log 查看更改


2.3record 修改提交消息(提交内容不变)
2.3.1假定,我们现在要修改某个提交的消息(M2),该怎么操作?
2.3.1.1git log 查看 M2 距离 HEAD 有多少的距离,得:2

git rebase -i HEAD~2

2.3.1.2只需要修改M2 ,pick 为 r 是 record简写

2.3.1.3接着 Esc,:wq 保存退出
2.3.1.4git会说 开始执行,接着弹出一个编辑窗口


接着 Esc,:wq 保存退出
2.3.1.5git log 查看, 消息 “添加了一个M2.txt” 变为了 “重新修改commitM2,添加了一个M2.txt”

【此种操作顺带的也会改变commit ID号】
2.4edit修改提交
2.4.1假定 我想要在两个提交之间 再加提交,怎么办?
2.4.1.1假定,我们要在 M2 和 M3之间 添加一条提交
git rebase -i HEAD~2

2.4.1.2只需要修改M2 ,pick 为 e 是 edit简写

2.4.1.3rebase_i分支多了REBASE-i 1/2

2.4.1.4查看当前变基操作的状态


2.4.1.5给M2.txt 增加一些内容,然后提交

2.4.1.6提交完成之后,查看当前的状态,并根据提供的选择进行操作(演示选择:git rebase --continue)
#使用“git rebase——edit-todo”查看和编辑
use "git rebase --edit-todo" to view and edit
You are currently editing a commit while rebasing branch 'rebase_i' on '9119c19'.
#您当前正在编辑提交,同时重新建立分支
#使用"git commit——amend"修改当前提交
use "git commit --amend" to amend the current commit
#当你对你的更改感到满意时,使用“git rebase——continue”
use "git rebase --continue" once you are satisfied with your changes

2.4.1.7查看当前提交日志是否满足需求



2.5.1假定 我想要单纯的修改这次提交内容和消息,怎么办?
可参见上述操作步骤进展至11.4.1.3rebase_i分支多了REBASE-i 1/2,11.4.1.6使用"git commit——amend"修改当前提交

2.5.1.1使用"git commit——amend"修改当前提交

2.5.1.2进入修改界面,完成修改后 按ESC,:wq

2.5.1.3继续进行变基操作
$ git rebase --continue

2.5.1.4查看log


2.6.1假定,我想合并某几个提交,怎么办?(squash合并提交)
2.6.1.1合并 M1 和 M2
修改为


开始执行变更然后 在弹出来的编辑框里 写提交信息,可以修改提交消息,默认是把两个消息都合并

接着 Esc,:wq 保存退出,git log查看,合并成功

git rebase(变基)操作的更多相关文章
- Git-merge & rebase(变基)
在 Git 中整合来自不同分支的修改主要有两种方法:merge 以及 rebase. merge: merge有两种方法,fast-forward(快速合并)和three-way merge(三方合并 ...
- 13.Git分支-变基(rebase)、rebase VS merge
1.变基的基本操作 在Git中整合来自不同分支的修改主要有两种方法:merge和rebase. 看下面的例子: 开发任务分叉到了两个不同的分支,并且都有了新的提交. 这时候我们可以使用 git mer ...
- git rebase 多分支操作
- git rebase and git merge 区别 这一次彻底搞懂 Git Rebase - git在工作中正确的使用方式----git rebase篇 Git 操作假设Git目前只有一个分支 ...
- git 入门教程之变基合并
git 鼓励大量使用分支---"早建分支!多用分支!",这是因为即便创建再多的分支也不会造成存储或内存开销,并且分支的作用有助于我们分解逻辑工作,这样一样其实比维护单一臃肿分支要简 ...
- git merge 与 git rebase
git merge git rebase merge V.S. rebase 参考材料 写在开始: 对merge和rebase的用法总有疑惑,好像两个都能完成"获取别的branch的comm ...
- git的入门使用操作
Git html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,addres ...
- 14.Git分支-rebase有趣的例子、变基带来的问题及解决方案
1.有趣的变基例子 如下图所示,你创建了一个特性分支server,然后进行了一些提交(C3和C4),然后又从C3上创建了特性分支client,提交了C8和C9,最后你又回到了server,提交了C10 ...
- Git教程(7)用合并还是变基?
合并或变基前的样子:分支experiment与master两个分支都产生了提交. 图1. 未合并或变基前的样子 合并 原理: 找到两个分支的最末提交和最近的共同祖先,在执行git merge时所处的分 ...
- 开发中关于Git那些事(续:Git变基)
其实上一篇写的内容仅仅是Git的冰山一角,如果你认为Git就是简简单单的几行命令,那只能说明你还没有真正了解Git这个强大的内容寻址文件系统.这篇文章,还是接着介绍一些实用但是很少有人知晓的一些命令, ...
随机推荐
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- springboot项目添加swagger2
1.pom中添加swagger依赖 <!-- swagger-ui --> <dependency> <groupId>io.springfox</group ...
- Python小白的数学建模课-A3.12 个新冠疫情数模竞赛赛题与点评
新冠疫情深刻和全面地影响着社会和生活,已经成为数学建模竞赛的背景帝. 本文收集了与新冠疫情相关的的数学建模竞赛赛题,供大家参考,欢迎收藏关注. 『Python小白的数学建模课 @ Youcans』带你 ...
- C++/VS基础篇
------------恢复内容开始------------ VS: 1.项目配置 2.IDE设置 错误列表是输出窗口的大概,根据error语法整理出,不准确. C++: 1.C++特点 优点 可直接 ...
- halcon——缺陷检测常用方法总结(测量拟合)
引言 机器视觉中缺陷检测分为一下几种: blob分析+特征 模板匹配(定位)+差分:halcon--缺陷检测常用方法总结(模板匹配(定位)+差分) - 唯有自己强大 - 博客园 (cnblogs.co ...
- centos 7 查看磁盘使用情况
1.查询系统整体磁盘使用情况 df -h [root@hadoop100 aubunt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/centos-root 17 ...
- 超赞!IDEA 最新版本,支持免打扰和轻量模式!
IntelliJ IDEA 2020.1 的第二个早期访问版本已发布,新的 EAP 构建对调试器和事件探查器(Profiler)进行了改进,并引入了新的提交工具窗口(Commit toolwindow ...
- 【dp】状压dp
二进制的力量 状态压缩DP 愤怒的小鸟 第一次接触状态压缩DP是在NOIP2016的愤怒的小鸟,当时菜得连题目都没看懂,不过现在回过头来看还是挺简单的,那么我们再来看看这道题吧. 题意&数据范 ...
- Linux网络基础TCP/IP
1.osi:七层 上三层,主要是用户层面;下四层是实际进行数据传输物理层: 设备之间比特流的传输,物理接口,电气特性等 端口号的作用 通过IP找到服务器,通过端口号找到具体哪个服务.网页服务的端口号是 ...
- text-decoration属性作用和方法
text-decoration-line(注释文本添加一条装饰线):none(文本中没有线条). underline(文本的下方显示一条线). overline(文本的上方将显示一条线). line- ...