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 上,这样在合并过去就不会使主分支历史记录变得简洁
';