一, 前言
一句话, Git rebase 可以帮助项目中的提交历史干净整洁!!!
二, 避免合并出现分叉现象 Git merge 操作
1, 新建一个 develop 分支
2, 在 develop 分支上新建两个文件
3, 然后分别执行 add,commit,push
4, 接着切换到 master 分支
分别添加 c.txt 和 d.txt 两个文件, 分别进行 add,commit,push
5, 现在想把 develop 分支上开发的部分合并到 master 分支上
6,Git merge 会将 master 和 develop 合并的过程通过如下形式展示出来.
借助 gitk 命令
借助 sourceTree 工具
Git rebase 操作
如果 master 和 develop 分支上的这些开发部分都是同一个人操作, 在合并的时候不想产生这种分叉的结果, 怎么办呢?
Git-rebase 命令简介: 用在从上游分支获取最新 commit 信息, 并有机的将当前分支和上游分支进行合并. 因为 develop 分支是在 master 分支基础上建立的, 所以 master 称为 topic 的上游分支.
1, 首先通过 Git reset 恢复到 master 合并之前的状态
2, 切换到 develop 分支, 执行如下操作
3, 如果你想把 rebase 之后的 master 分支推送到远程仓库, Git 会阻止你这么做, 因为两个分支包含冲突. 但你可以传入 -force 标记来强行推送.
4, 查看一下 develop 分支合并的效果, 如下.
看一下 rebase 的结果, 就像是 develop 先把自己的提交保存起来, 然后将 master 中的提交合并过来, 最后在加上自身分支的提交, 这样就不存在分支的合并效果了.
5, 接着切换到 master 分支, 执行 Git merge 操作就可以了
这时候, master 和 develop 分支已经同步了.
其他异常情况
在 rebase 的过程中, 也许会出现冲突 (conflict). 在这种情况, Git 会停止 rebase 并会让你去解决 冲突; 在解决完冲突后, 用 "git-add" 命令去更新这些内容的索引(index), 然后你无需执行 Git-commit, 只要执行 Git rebase --continue. 这样 Git 会继续应用(apply) 余下的补丁. 在任何时候, 你可以用 --abort 参数来终止 rebase 的行动, 并且 "mywork" 分支会回到 rebase 开始前的状态. 即 Git rebase --abort.
手动合并多个 commit 记录
rebase -i 命令介绍
Git rebase -i [startpoint] [endpoint]
其中 - i 的意思是 --interactive, 即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间, 如果不指定[endpoint], 则该区间的终点默认是当前分支 HEAD 所指向的 commit(注: 该区间指定的是一个前开后闭的区间).
在查看到了 log 日志后, 我们运行以下命令:
Git rebase -i 0bb85c 582db9
或者
Git rebase -i HEAD~3
上面未被注释的部分列出的是我们本次 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)
rebase -i 命令执行
1,Git rebase -i HEAD~3
2, 编辑合并信息
3, 修改 commit 信息
4,commit 信息预览
5,commit 合并结果
6, 可以看到 master 上之后又 1 条提交记录了, 而 develop 上还有 3 个提交记录
还是要通过 Git push -f 命令将合并的 commit 结果提交的远程仓库中.
如果 develop 分支也想要变成 master 分支这种合并效果, 记住不要使用 Git merge 命令, 还时会出现分叉的情况. 继续使用 Git rebase master 命令.
自动合并多个 commit 记录
命令介绍
Git commit -fixup 自动在 commit 消息前添加 fixup! 关键字.
Git rebase -i -autosquash 使用 rebase 自动合并被标记为 fixup! 的 commit, 其实是根据 sha 值来的.
命令操作
1. 继续修复如下图所示对应的 bug
2, 修改完之后执行 Git commit --fixup 需要合并的 commit id
3,commit fixup 之后的效果
4, 执行 Git rebase -i --autosquash 需要合并 commit id 的父级 commit id
或者
Git rebase -i --autosquash commit id^
5, 执行 rebaseautosquash 结果
来源: https://www.jb51.net/article/191650.htm