rebase 合并 commit
最后更新于:2022-04-02 02:52:44
[TOC]
## 概述
有两个常用功能
### 合并分支
- 用于把一个分支的修改合并到当前分支
- 执行merge之后,会产生一个新的commit,如:Merge branch 'branch-1', 使用rebase的话就会避免这个问题
**原理**:
1. 这些命令会把你的”mywork“分支里的每个提交(commit)取消掉,
2. 并且把它们临时 保存为补丁(patch)(这些补丁放到”.git/rebase“目录中),
3. 然后把”mywork“分支更新 到最新的”origin“分支,
4. 最后把保存的这些补丁应用到”mywork“分支上
### 当分支的历史 commit
对当前分支的历史commit进行修改,合并,删除等操作
## 语法
```
git rebase [-i | --interactive] [options] [--exec ] [--onto ]
[ []]
git rebase [-i | --interactive] [options] [--exec ] [--onto ]
--root []
git rebase --continue | --skip | --abort | --quit | --edit-todo
rebase 动作说明:
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
注意区间为前开后闭的区间,不包含[startpoint],包含[endpoint]
```
### 解决冲突并继续 `rebase --continue`
1. `git rebase`出现冲突并停止
2. 解决冲突并`git add`
3. `git rebase --continue`提交而不是commit
### 冲突时取消rebase `rebase --abort`
- 可以用`--abort`参数来终止`rebase`的操作,并且”`mywork`“ 分支会回到`rebase`开始前的状态
```
git rebase --abort
```
## 场景
### 移除一个提交
语法
```
git rebase -i [startpoint] [endpoint]
//or
git rebase -i HEAD~3
```
![](https://pic4.zhimg.com/v2-7189da3226d1fdedeb6a297fbc2b1177_b.webp)
### 合并多个commit为一
语法
```
// 注意如果 [endpoint]不写,则默认到最新
// 如果添加 [endpoint] 则会产生游离的 HEAD
git rebase -i [startpoint] [endpoint]
//or
git rebase -i HEAD~3
// 推送到远程分支,使用 --force 或 --force-with-lease,
// 只对对应的远程分分支有作用,不用担心覆盖其他分支
git push --force-with-lease
```
![](https://pic3.zhimg.com/v2-758ead2cd3914cadc4d822053ad1089a_b.webp)
### 合并中间的多个comit
需要从想要合并的最早分支开始 ,到最新未知,并对中间的commit 进行修改
### 多个commit粘贴到另一个分支上
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/48/39/4839cc8bb557c7c80bfc497a9f52ce91_500x204.jpg)
语法
```
> git rebase [startpoint] [endpoint] --onto [branchName]
说明
startpoint endpoint 指定了一个编辑版本区间(前开后闭)
--onto 该指定的提交复制到哪个分支上
```
实例
```
> git rebase 90bc0045b^ 5de0da9f2 --onto master
// 当前HEAD处于游离状态
> git checkout master
> git log //查看游离的人 版本信息
> git reset --hard 0c72e64
```
### 开发分支与主分支的管理
1. 在最新的主分支创建分支
```
git checkout -b dev
```
2. 完成分支任务,commit
3. 进行rebase,选择的目标为主分支
```
git rebase master
```
4. 可以进行 `merge request` 或 `pull request`,在代码审计中,不断修复,需要不断 rebase
5. 合并到主分支
```
git checkout master
git merge dev
```
![](https://pic2.zhimg.com/v2-6b8427b4baf6cdfb08b852ab1cdb4941_b.webp)
> 值得注意的是合并前必须使用 当前最新主分支 rebase 上,这样在合并过去就不会使主分支历史记录变得简洁
';