git rebase 使用场景之 分支变基

vim main.c
git init// edit source file,  add "master commit 1"
git add .
git commit -m "master commit 1"// edit source file,  add "master commit 2"
git add .
git commit -m "master commit 2"git branch dev
git checkout dev// edit source file, add "dev commit 1"
git add .
git commit -m "dev commit 1"// edit source file, add "dev commit 2"
git add .
git commit -m "dev commit 2"git checkout master// edit source file, add "master commit 3"
git add .
git commit -m "master commit 3"// edit source file, add "master commit 4"
git add .
git commit -m "master commit 4"git checkout dev
git rebase masterFirst, rewinding head to replay your work on top of it...Applying: dev commit 1Using index info to reconstruct a base tree...M       main.cFalling back to patching base and 3-way merge...Auto-merging main.cCONFLICT (content): Merge conflict in main.cerror: Failed to merge in the changes.hint: Use 'git am --show-current-patch' to see the failed patchPatch failed at 0001 dev commit 1Resolve 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".// manually solve conflictgit add .
git rebase --continuemain.c: needs mergeYou must edit all merge conflicts and thenmark them as resolved using git add
git statusrebase in progress; onto b23432bYou are currently rebasing branch 'dev' on 'b23432b'.(fix conflicts and then run "git rebase --continue")(use "git rebase --skip" to skip this patch)(use "git rebase --abort" to check out the original branch)Unmerged paths:(use "git reset HEAD <file>..." to unstage)(use "git add <file>..." to mark resolution)both modified:   main.cno changes added to commit (use "git add" and/or "git commit -a")// manually solve conflictgit add .
git rebase  --continueApplying: dev commit 2git log   --oneline3c856fe (HEAD -> dev) dev commit 2e10a401 dev commit 1b23432b (master) master commit 460b0f0a master commit 3f90b825 master commit 2c543238 master commit 1git checkout  master
git merge dev
git log --oneline3c856fe (HEAD -> master, dev) dev commit 2e10a401 dev commit 1b23432b master commit 460b0f0a master commit 3f90b825 master commit 2c543238 master commit 1

一、基本

git rebase用于把一个分支的修改合并到当前分支。

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。

$ git checkout -b mywork origin

假设远程分支"origin"已经有了2个提交,如图

现在我们在这个分支做一些修改,然后生成两个提交(commit).

$ vi file.txt

$ git commit

$ vi otherfile.txt

$ git commit

...

但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了. 这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间"分叉"了。

在这里,你可以用"pull"命令把"origin"分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的"合并的提交"(merge commit):

但是,如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase:

$ git checkout mywork

$ git rebase origin

这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (请查看 git gc)

二、解决冲突

在rebase的过程中,也许会出现冲突(conflict). 在这种情况,Git会停止rebase并会让你去解决 冲突;在解决完冲突后,用"git-add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

$ git rebase --continue

这样git会继续应用(apply)余下的补丁。

在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。

$ git rebase --abort

三、git rebase和git merge的区别

现在我们可以看一下用合并(merge)和用rebase所产生的历史的区别:

当我们使用Git log来参看commit时,其commit的顺序也有所不同。

假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM,

对于使用git merge来合并所看到的commit的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1

对于使用git rebase来合并所看到的commit的顺序(从新到旧)是:C7 ,C6‘,C5',C4,C3,C2,C1

因为C6'提交只是C6提交的克隆,C5'提交只是C5提交的克隆,

从用户的角度看使用git rebase来合并后所看到的commit的顺序(从新到旧)是:C7 ,C6,C5,C4,C3,C2,C1

另外,我们在使用git pull命令的时候,可以使用--rebase参数,即git pull --rebase,这里表示把你的本地当前分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把本地当前分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到本地当前分支上。

关于git pull的更多内容请参考《git pull简介》

git rebase命令实际操作记录相关推荐

  1. Git rebase 命令行操作

    Git rebase 命令行操作 1.创建新分支(在需要进行rebase的分支上开辟新分支) git checkout -b rebase 2.进行rebase操作(master作为变基的节点,也可以 ...

  2. Git常用命令——分支操作

    Git常用命令--分支操作 分支操作 git branch 列出,创建或者删除分支 git branch <branchName> :创建一个分支 git branch -d <br ...

  3. 浅谈git rebase命令 -- git修改历史提交信息

    浅谈git rebase命令 如果你只想修改git log命令打印到终端上的最后一个提交信息,那么使用git commit --amend命令直接修改就好. 如果你还想合并最近的某几个提交为一个提交, ...

  4. 【Git】Git 基础命令 ( 查看提交记录 git log | 版本回滚 git reset | 撤销回滚 git reflog )

    文章目录 一.查看提交记录 git log 1.查看详细提交记录 2.查看简略提交记录 二.版本回滚 git reset 1.Git 中的版本表示 HEAD~1 2.版本库代码回滚 三.撤销回滚 1. ...

  5. git rebase命令(转)

    转自: https://www.yiibai.com/git/git_rebase.html git rebase命令在另一个分支基础之上重新应用,用于把一个分支的修改合并到当前分支. 使用语法 gi ...

  6. Git常用命令——远程操作

    Git常用命令--远程操作 远程操作 先不引入github,利用git支持本地协议的特性,创建一个本地的远程服务器. 创建一个裸仓库(没有工作目录) SwitchdeMacBook-Pro:git-s ...

  7. git rebase(变基)操作演示

    1.rebase(变基)操作 注意事项:rebase 改变分支的根源,绝对不要在与其他人共享的分支上进行操作rebase黄金法则:绝不要在公共的分支上使用它! 1.1git merge 与 git r ...

  8. git rebase 命令 常用_git命令之 git rebase 常用

    git rebase 命令的功能很强大, 在<git 权威指南>一书里,改变提交(commit)的顺序,书中教了一种很复杂的方法,运用了git reset ... git cherry-p ...

  9. ubuntu 保存命令行操作记录

    ubuntu 保存命令行操作记录 前言 开始 结束 前言 最近学习使用linux比较多,但是好多东西在输入过之后需要保存过程,很是苦恼,特别是遇到一些bug的时候没有及时记录,马上就不知的被甩到哪里了 ...

  10. Git rebase命令实战

    一.前言 一句话,git rebase 可以帮助项目中的提交历史干净整洁!!! 二.避免合并出现分叉现象 git merge操作 1.新建一个 develop 分支   2.在develop分支上新建 ...

最新文章

  1. java日期转化工具类
  2. Linux_LAMP 最强大的动态网站解决方案
  3. 每日一皮:996标配工位原来是这样的!
  4. SD-WAN是更简单的企业WAN解决方案吗?
  5. Linux操作系统安装LAMP环境
  6. DNS服务搭建和正反区域解析
  7. POI获取WORD信息
  8. bind简单转发实验
  9. php sphinx mysql_windows7使用Sphinx+PHP+MySQL详细介绍
  10. Android Sensor架构和原理分析
  11. fp-growth算法详解与实现
  12. asp.net助学贷款管理系统
  13. Tupper自我指涉公式:图象里竟然包含式子本身
  14. layim之初始化配置
  15. C语言-5月23日-指针(一)
  16. 10_放置街灯(Placing Lampposts,UVa 10859)
  17. python饼图添加颜色_PythonPlotly:通过字典自定义饼图颜色
  18. SSL/TLS安全:Schannel中WinShock漏洞及解决办法
  19. python安装成功截图_上传Anaconda 3 安装好后在电脑开始里面的截图。
  20. 足球数据API接口 - 【足球赛事分析数据】API调用示例代码

热门文章

  1. 转载:常用 Git 命令清单 by 阮一峰
  2. 写作历时一个月,长达8000字的年终总结——[2022年终总结]不要怕,请勇敢的向前走
  3. php 多版本 安装包下载,wamp 安装多版本php
  4. 如何在 Excel 图表中添加或删除次坐标轴?
  5. IOS开发-ERROR ITMS-90096: Your binary is not optimized for iPhone 5
  6. python中的cols_Python numpy.ma.mask_cols()用法及代码示例
  7. 干货 | 4步带你完成私有云盘搭建
  8. STRAIGHT_JOIN
  9. PHP微信app接口退款,PHP接入微信退款接口
  10. 2837xd代码生成模块学习(3)——IIC、eCAN、SCI、Watchdog、eCAP模块