女朋友不知道Git rebase,我赶紧摸鱼给她科普

59 阅读3分钟

git rebase

git rebase 是 Git 中用于整合来自不同分支的修改的一种方法,它可以将一个分支上的提交应用到另一个分支之上。

与 git merge 不同,git rebase 通过重新应用提交来创造一个更线性的历史记录,这样可以使项目历史看起来更加整洁。

git rebase 的好处

  1. 保持历史记录整洁:git rebase 可以避免合并提交,创建一个线性的历史记录,使得 git log 更加易读。
  2. 解决冲突一次:在 rebase 过程中,你可以一次性解决所有的冲突,而不是在每次合并时都解决。
  3. 简化代码审查:线性的历史记录使得代码审查更加简洁,审查者可以按照提交顺序查看更改,而不需要理解复杂的合并历史。

git merge 和 git rebase 的比较

  • git merge:通过创建一个新的合并提交,将两个分支的历史记录合并在一起。
    • 优点:保留了所有历史记录,包括分支和合并点,适合需要保留完整开发过程的情况。
    • 缺点:会产生额外的合并提交,可能导致提交历史看起来比较复杂。
  • git rebase:通过重新应用提交,将一个分支的更改放到另一个分支的基础之上。
    • 优点:创造一个线性的历史记录,使 git log 更加清晰,适合代码审查和维护。
    • 缺点:重写提交历史,可能导致冲突,需要团队成员的合作和理解。

示例比较

初始状态

A---B---C feature
     \
      D---E---F main

假设你要将 feature 分支的更改整合到 main 分支中。

使用 git merge

1. 切换到 main 分支

git checkout main

2. 合并 feature 分支

git merge feature

结果历史:

A---B---C feature
 \       \
  D---E---F---M main
    • M 是一个新的合并提交,包含了 main 和 feature 分支的所有更改。

使用 git rebase

1. 切换到 feature 分支

git checkout feature

2. 执行 rebase

git rebase main

这会将 feature 分支上的提交(A、B、C)依次应用到 main 分支的最新提交(F)之后。新的历史记录看起来像这样:

D---E---F---A'---B'---C' feature

在 rebase 过程中,Git 会自动应用每个提交,但如果遇到冲突,会暂停并提示你解决冲突。

3. 解决冲突(如果有)

如果在 rebase 过程中遇到冲突,Git 会提示你解决冲突:

Auto-merging <file>
CONFLICT (content): Merge conflict in <file>

解决冲突后,添加已解决的文件并继续 rebase:

git add <file_with_conflict>
git rebase --continue

如果想要中止 rebase,可以使用:

git rebase --abort

4. 强制推送到远程分支

因为 rebase 重写了提交历史,如果你要推送到远程仓库,需要使用 --force 选项:

git push origin feature --force

总结

通过 git rebase,你可以创建一个更线性的提交历史,使代码库更整洁。需要注意的是,rebase 重写了提交历史,因此在公共分支上使用时要小心,确保团队成员知道并理解 rebase 的影响。