git rebase

场景一:本地与远端同一分支提交历史不一致

 1 # 修复了一个bug以后准备提交
2 git add models/paper.go
3 git commit -m 'fix a bug'
4 # 现在准备推送到远端
5 git push origin master
6 # push失败了,说明A在我之前已经提交了,我本地master分支的提交历史已经落后远端了,需要先pull一下,与远端同步后才能push
7 git pull
8 # 现在使用git log看下一提交历史:
9 git log --oneline --graph
10 * f63ecbf (HEAD -> master) Merge branch 'master' of https://gitee.com/greenhn/ganlin
11 |\
12 | * b91f711 (origin/master, origin/HEAD) 修正bug,优化内置通道配置
13 * | 8b76654 fix a bug
14 |/
15 * a1bc60a 完善日报接口
16 * 9f73b5e 增加内置通道设置功能
17 * a0d464e ...
18 # 竟然分叉了!由于我本地master的提交历史和远端的master分支的提交历史不一致,所以git为我进行了自动合并,然后生成了一个新的提交历史(f63ecbf Merge branch 'master' of)
19 #这个时候用git rebase就可以解决
20 git rebase
21 git log --oneline --graph
22 * 2e2b995 (HEAD -> master) fix a bug
23 * b91f711 (origin/master, origin/HEAD) 修正bug,优化内置通道配置
24 * a1bc60a 完善日报接口
25 * 9f73b5e 增加内置通道设置功能
26 * a0d464e ...
27 git push

简单操作: git pull --rebase 效果与上面是一致

场景二:不同分支之间的合并

 1 git checkout -b feature
2 vim newFunc.go
3 git add newFunc.go
4 git commit -m 'add new func'
5 git log --oneline --graph
6 * 4f58ab8 (HEAD -> feature) add new func
7 * 94c134b (master) init base
8 # 先尝试通过merge合并:
9 git checkout master
10 git merge feature
11 CONFLICT (content): Merge conflict in newFunc.go
12 Automatic merge failed; fix conflicts and then commit the result.
13 说明我两个分支之前的版本已经不同步了,需要手动合并冲突,再提交
14 git add newFunc.go
15 git commit -m 'merge master and feature'
16 git log --oneline --graph
17 * 562ec58 (HEAD -> master) merge master and feature
18 |\
19 | * 4f58ab8 (feature) add new func
20 * | 0e80f97 do something
21 |/
22 * 94c134b init base
23
24 解决: 回到合并前,再回到feature分支
25 在feature分支上执行: git rebase master
26 以master为基础,将feature分支上的修改增加到master分支上,并生成新的版本。
27 # 然后解决冲突
28 git add newFunc.go
29 # 现在是重点,之前的rebase其实只是完成了一半,由于出现冲突而终止,现在冲突解决,可以通过git rebase —continue继续完成之前的rebase操作。
30 git rebase --continue
31 git log --oneline --graph
32 * b2593e6 (HEAD -> feature) add new func
33 * 0e80f97 (master) do something
34 * 94c134b init base
35 # 提交记录已经是一条完美的直线。现在切换到主分支master,将feather分支上的提交合并过来。
36 git checkout master
37 git merge feature
38 # 再次查看一下提交历史:
39 git log --oneline --graph
40 * b2593e6 (HEAD -> master, feature) add new func
41 * 0e80f97 do something
42 * 94c134b init base

  git rebase -i

# 开始新的功能分支
git checkout -b new-feature master
# 编辑文件
git commit -a -m "start developing a feature"
# 编辑更多文件
git commit -a -m "fix someting" # 直接在master 上添加文件
git checkout master
# 编辑文件
git commit -a -m "fix security hole" # 开始交互式 rebase
git checkout new-feature
git rebase -i master

  最后的那个命令会打开一个编辑器,包含new-feature的两个,和一些指示:

pick 32618c4 Start developing a feature
pick 62eed47 Fix something from the previous commit

  里面的提示有:

    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命令来决定在rebase时提交移动的方式,在我们的例子中,我们只需要用squash命令把两个提交并在一起就可以了:

pick 32618c4 Start developing a feature
squash 62eed47 Fix something from the previous commit

  保存并关闭编辑器以开始 rebase。另一个编辑器会打开,询问你合并后的快照的提交信息。在定义了提交信息之后,rebase 就完成了,你可以在 git log 输出中看到那个提交。

git checkout master
git merge new-feature

最新文章

  1. 《JavaScript 源码分析》之 jquery.unobtrusive-ajax.js
  2. wordpress自动清理评论回收站
  3. 如何做出header,footer固定定位后让main主体部分可以滑动,在微信浏览器中滑动到最后不出现黑边的情况
  4. asp.net 登陆验证 Form表单验证的3种方式 FormsAuthentication.SetAuthCookie;FormsAuthentication.RedirectFromLoginPage;FormsAuthenticationTicket
  5. jq的post传递数组
  6. java-list-remove()用法浅析 解决java list remove() 数据不对的问题
  7. Visual Studio Code 快捷键大全(Windows)
  8. Flask從入門到入土(二)——請求响应與Flask扩展
  9. elasticsearch------java操作之QueryBuilders构建搜索Query
  10. Spring Boot监控与管理的实现
  11. 制作linux下的.run安装包
  12. VLAN之间通信-三层交换
  13. vue+webpack热替换
  14. (C/C++学习笔记) 二. 数据类型
  15. 办公区公网Ip访问不到阿里云ECS
  16. 检查用户输入信息是否完整(vb.net实现)
  17. 【Docker】拉取Oracle 11g镜像配置
  18. Javascript变量名混淆细节
  19. DOM编程 学习笔记(二)
  20. 自旋构造(更新)c#

热门文章

  1. 基于django的会议室预订系统
  2. Iptables和Firewall-selinux
  3. 讲解 json 和 pickle 模块
  4. 找不到文件异常java.io.IOException: Resource [classpath:shiro.ini] could not be found.
  5. 毕业论文系列之基于WiFi的智能农业大棚管控系统设计代码
  6. ORALCE逻辑存储结构
  7. linux系统中的硬链接和软链接
  8. 用JavaScript完成页面自动操作
  9. pyhon学习Day18--继承
  10. Java properties文件集