Preface · 序
从 0 到 1 认识 git rebase。
某天,某群的某位群友提出了一个疑问:
可有一说一,我也很少在开发中用过 git rebase,不如趁机体验 & 学习一下呢?当然,浅学一下,如有谬误欢迎各位指正~
手机端横向更适合阅读喔:
文字版:
what
一个 git 命令,中文为变基。
Reapply commits on top of another base tip
注意:应用的 commit 是新的(commit ID 是会变化的)。
命令
git rebase some_branch
- 无冲突
- 直接变基,即以 some_branch 最新 commit 为基准,再追加原分支的新 commit
- 有冲突
- 应用变基,追加原分支没有产生冲突的 commit,直到第一个产生冲突的 commit 为止,需要解决冲突后重新 add,并执行 continue 产生新的 commit,这会替换/合并产生冲突的 commits;如果有无冲突的 commit 交替出现,则也需要多次解决冲突或通过 skip 跳过。
git rebase -i HEAD~n
- 合并多个 commit 内容为一个。
git rebase –continue
- 解决冲突后,可通过该命令继续 rebase。
git rebase –abort
- rebase 失败时(比如出现冲突需要解决),可以用该命令中止 rebase,分支 commit 也将恢复。
git rebase –skip
- rebase 过程中跳过某个失败的 commit。
最佳实践
rebase 更适用于本地分支,不建议使用在 master 等重要分支中,因为 rebase 会改变历史记录。
faq
1. rebase 和 merge 的区别
- merge(非 fast-forward)会产生一条 Merge xxx 的 commit 记录(新的合并点);
- merge 仅需要解决一次冲突,rebase 则不一定;
- rebase 会改变历史记录和时间线;
- 从 commit 历史来看,rebase 更清晰,merge 会有很多交汇。
2. git pull 和 git pull –rebase 的区别
前者做的是 fetch 和 merge,后者是 fetch 和 rebase。
扩展
- git merge 3-way merge(三路合并算法)
- Is there a difference between git rebase and git merge –ff-only - StackOverflow