首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >面试官:git rebase 和 merge区别

面试官:git rebase 和 merge区别

作者头像
早起的鸟儿有虫吃
发布2025-11-24 18:44:36
发布2025-11-24 18:44:36
760
举报

1. 错误理解:

从网上搜索 git rebase 和 merge区别给出一段对概念,和各种流程图让人看的云里雾里

无论多么正确 直接放弃,你感觉不懂,不强行记忆。

直接回答差异就是坑

2. 回想一下自己经常使用功能是什么:

场景:多个提交合并成一个提交

在一个分支中:

如果修改一行代码 commit 一次 如果多个commit合并成一个提交

你可以马上想到 git commit --amend

git commit --amend 命令是一种修改最近提交的便捷方法。

它让您将暂存的变更与先前的提交合并,而不是创建一个全新的提交

代码语言:javascript
复制
# 1.正常的提交流程
git add file.txt
git commit -m "初始提交"

# 2.发现需要修改,使用amend
git add file.txt # 或其他文件的修改
git commit --amend -m "更新后的提交信息"

git push

然后如果修改自己代码期间,执行 git pull

当你直接执行 git pull(这相当于 git fetch + git merge)时, 如果本地分支和对应的远程分支都有新的提交, Git默认的merge操作就会创建一个新的合并提交(Merge Commit)

这样多一次 commit 这个 commit 无用的,

我想多次 commit 合并一个 使用到git rebase

天天在看vue源码时随手看了一下commit历史, 然后就被震惊了。请问这是怎么做到的?怎样的git实践才能做到这么清爽?

尤雨溪也是这么回答的

多用 rebase

举例

代码语言:javascript
复制
https://github.com/watchpoints/master-cpp/blob/main/weekly1-cpp/day4/day4-cpp11.cpp

111111
22222
33333

连续提交3次

gitlog--oneline

3883436fix:3333

0b7b9bafix:2222

ba4be4dfix:11111



特性

git commit --amend

git rebase (-i)

作用范围

仅限最近一次提交

多个提交(可指定范围)

主要用途

修改最新提交

重写提交历史

操作复杂度

简单直接

相对复杂

影响范围

局部修改

批量操作

git rebase 命令有标准和交互两种模式,

都是默认的标准模式,在命令后添加 -i--interactive 选项即可使用交互模式

代码语言:javascript
复制

gitrebase-i[<startpoint>] [<endpoint>]


>pick d2cf1f9 fix: 第一次提交
>
>s 47971f6 fix: 第二次提交
>
>s fb28c8d fix: 第三次提交

上面的意思就是把第二次、第三次提交都合并到第一次提交上

gitpush-foriginmain
查缺补漏 1:-i 用法

•不包含 startpoint 所指向的提交

•包含 endpoint 所指向的提交

•可以理解为:编辑 startpoint 提交之后的所有提交,直到 endpoint

如,我们有一个提交历史如下: A --- B --- C --- D (HEAD)

如果我们执行 git rebase -i B, 那么会编辑从B之后到HEAD的提交,也就是C和D。 注意,B本身不会被编辑,因为区间是(B, D], 即从B的下一个提交C开始,到D结束

查缺不漏 2:为什么不能执行 rebase -i 命令
代码语言:javascript
复制

git rebase -i ba4be4dcbc8cf2bad37bbdd3874e59914040ba2c 
error: cannot rebase: You have unstaged changes.error: 
Please commit orstash them

这个错误表示你有未暂存的更改,
Git 拒绝执行 rebase 操作来保护你的工作内容

解决:
git add -A
git add -u

git status 查看很多差异:


Changes notstaged forcommit:

  (use "git add/rm <file>..."to update what will be committed)

  (use "git restore <file>..."to discard changes in working directory)

modified:   .gitignore

deleted:    cpp/chapt-2/02_thead.c

deleted:    cpp/chapt-2/03_thead.c

deleted:    cpp/chapt-2/04_lock.cpp

deleted:    cpp/chapt-2/CMakeLists.txt

deleted:    cpp/chapt-2/my_dlopen.c

deleted:    cpp/chapt-2/my_dlopen.cpp

deleted:    cpp/chapt-2/my_dlopen_default.cpp

deleted:    cpp/chapt-3-thread-local/2_thread.cpp

deleted:    cpp/chapt-3-thread-local/3_if.cpp

deleted:    cpp/chapt-3-thread-local/3_if.s

deleted:    cpp/chapt-3-thread-local/CMakeLists.txt

deleted:    cpp/chapt-3-thread-local/therad1.cpp

deleted:    cpp_weekly/EP1-10/CMakeLists.txt

deleted:    cpp_weekly/EP1-10/ep01_string_view.cpp

deleted:    cpp_weekly/EP1-10/ep01_string_view_2.cpp

deleted:    cpp_weekly/README.md


命令

作用范围

包含新增文件

包含修改文件

包含删除文件

git add -A

整个仓库

git add .

当前目录及子目录

git add -u

整个仓库

git add <文件>

指定文件

查缺补漏 3 多个提交
代码语言:javascript
复制
# Commands:# p, pick <commit> = use commit# r, reword <commit> = use commit, but edit the commit message# e, edit <commit> = use commit, but stop for amending# s, squash <commit> = use commit, but meld into previous commit# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous#                    commit's log message, unless -C is used, in which case#                    keep only this commit's message; -c is same as -C but#                    opens the editor# x, exec <command> = run command (the rest of the line) using shell# b, break = stop here (continue rebase later with 'git rebase --continue')# d, drop <commit> = remove commitpick c50221f commit Bpick 73deeed commit Cpick d9623b0 commit Dpick e7c7111 commit Epick 74199ce commit F# 变基 ef13725..74199ce 到 ef13725(5 个提交)## 命令:# p, pick <提交> = 使用提交# r, reword <提交> = 使用提交,但修改提交说明# e, edit <提交> = 使用提交,进入 shell 以便进行提交修补# s, squash <提交> = 使用提交,但融合到前一个提交# f, fixup <提交> = 类似于 "squash",但丢弃提交说明日志# x, exec <命令> = 使用 shell 运行命令(此行剩余部分)# b, break = 在此处停止(使用 'git rebase --continue' 继续变基)# d, drop <提交> = 删除提交......

3. 回想 git pull 用法

git pull 远程仓库 分支

git pull origin main

git fetch - 从远程仓库下载最新提交

git fetch 远程仓库 分支

获取指定远程仓库的指定分支【git log 相关信息 或者 git branch 信息 减少非必要信息 】

git fetch origin main

git merge - 将远程分支合并到当前本地分支

git merge origin/main

3.1 疑问: 什么是远程仓库,分支

代码语言:javascript
复制
cat .git/config

[remote "origin"]
url =git@github.com:watchpoints/master-cpp.git
fetch =+refs/heads/*:refs/remotes/origin/*
//存储位置
//我自己建立项目

[branch "main"]
remote = origin
merge = refs/heads/main

远程仓库

•✅ 中心化存储:代码的"云存储" 分支

•✅ 版本管理:不同版本的代码线

GitHub 如何参与别人创建的项目:

git remote -v

origin git@github.com:watchpoints/master-cpp.git (fetch)

origin git@github.com:watchpoints/master-cpp.git (push)

git remote add xxx xxx

git remote add upstream xxxx

3.2 疑问: git fetch 目的

只获取元数据git fetch 只获取提交信息、分支指针等元数据,不改变你的工作文件

git fetch 为你提供:

•✅ 完整的远程提交历史

•✅ 所有远程分支的当前状态

•✅ 新增的分支和标签信息

•✅ 本地与远程的差异分析

•✅ 团队协作的全景视图

获取远端分支信息

3.3 如何获取远程仓库的更新代码

添加远程仓库

git remote add upstream xxxxx

git remote -v

git fetch upstream // 这里更新不是自己 github 账号在的项目,而是别人 github账号项目

git merge upstream/main # 将上游的main分支变更合并过来

啥意思:

git branch

•main

本地分支代码 可以提交任意远程仓库 upstream or origin

git remote -v

git branch -vv

•main 366109f [origin/main] fix:merger all

git branch -vv 命令来查看本地分支与远程分支的跟踪关系

3.4 如何提交到远程仓库分支

说明:

在公司项目中,不允许直接向 master/main 分支提交代码是极其常见的保护措施

分支类型

前缀

命名规则

示例

说明

主分支

main 或 master

-

main, master

稳定的、可发布的代码。

开发分支

develop

-

develop

集成了最新开发成果的分支。

功能分支

feature/

feature/<简短描述>

feature/user-login

开发新功能。从 develop 拉出,合并回 develop。

发布分支

release/

release/<版本号>

release/v1.2.0

准备发布新版本。从 develop 拉出,合并回 develop 和 main。

修复分支

hotfix/

hotfix/<简短描述>

hotfix/payment-typo

紧急修复生产环境 Bug。从 main 拉出,合并回 develop 和 main。

git push <远程仓库> <本地分支>:<远程分支>

git push originmain:main

git branch -vv

main 366109f [origin/main] fix:merger all

如何获取远程分支代码:

代码语言:javascript
复制
# 同事在远程创建了分支 feature/payment,你需要下载到本地
git fetch origin
git checkout -b feature/payment origin/feature/payment

# 现在你就在本地的 feature/payment 分支上,且与远程分支建立了跟踪

feature/payment 这个分支名称

git branch -a # 查看所有分支(本地和远程) git branch -r # 查看远程分支 git branch -vv # 查看分支跟踪关系

总计

回答这个问题前提条件

•了解 远程仓库,远程分支,本地分支概念

•github for 别人项目,然后提交别人项目为例子

•git fetch upstream 远程仓库信息

•git checkout -b xxx upstream/develop/xxxx

•git push upstream xxx:xxxxx

2 个不同概念,适合用范围不一样,无法比较(直接回答差异就是坑)

1、针对当前分支的多个提交合并成一个提交(通常使用rebase的交互模式)

2、将远程分支合并到本地分支(使用merge)

参考

•https://www.zhihu.com/question/61283395

•https://git-scm.com/docs/git-rebase

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端开发成长指南 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 错误理解:
  • 2. 回想一下自己经常使用功能是什么:
    • 场景:多个提交合并成一个提交
    • 举例
  • 3. 回想 git pull 用法
    • 3.1 疑问: 什么是远程仓库,分支
    • 3.2 疑问: git fetch 目的
    • 3.3 如何获取远程仓库的更新代码
    • 3.4 如何提交到远程仓库分支
  • 总计
    • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档