专注、坚持

浅学 git rebase

2022.04.15 by kingcos
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 的区别

  1. merge(非 fast-forward)会产生一条 Merge xxx 的 commit 记录(新的合并点);
  2. merge 仅需要解决一次冲突,rebase 则不一定;
  3. rebase 会改变历史记录和时间线;
  4. 从 commit 历史来看,rebase 更清晰,merge 会有很多交汇。

2. git pull 和 git pull –rebase 的区别

前者做的是 fetch 和 merge,后者是 fetch 和 rebase。

扩展