
从网上搜索 git rebase 和 merge区别给出一段对概念,和各种流程图让人看的云里雾里
无论多么正确 直接放弃,你感觉不懂,不强行记忆。
直接回答差异就是坑
在一个分支中:
如果修改一行代码 commit 一次 如果多个commit合并成一个提交
你可以马上想到 git commit --amend
git commit --amend 命令是一种修改最近提交的便捷方法。
它让您将暂存的变更与先前的提交合并,而不是创建一个全新的提交
# 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
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 选项即可使用交互模式
gitrebase-i[<startpoint>] [<endpoint>]
>pick d2cf1f9 fix: 第一次提交
>
>s 47971f6 fix: 第二次提交
>
>s fb28c8d fix: 第三次提交
上面的意思就是把第二次、第三次提交都合并到第一次提交上
gitpush-foriginmain
•不包含 startpoint 所指向的提交
•包含 endpoint 所指向的提交
•可以理解为:编辑 startpoint 提交之后的所有提交,直到 endpoint
如,我们有一个提交历史如下: A --- B --- C --- D (HEAD)
如果我们执行 git rebase -i B,
那么会编辑从B之后到HEAD的提交,也就是C和D。
注意,B本身不会被编辑,因为区间是(B, D],
即从B的下一个提交C开始,到D结束
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 <文件> | 指定文件 | ✅ | ✅ | ✅ |
# 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 <提交> = 删除提交......git pull 远程仓库 分支
git pull origin main
git fetch - 从远程仓库下载最新提交
git fetch 远程仓库 分支
获取指定远程仓库的指定分支【git log 相关信息 或者 git branch 信息 减少非必要信息 】
git fetch origin main
git merge - 将远程分支合并到当前本地分支
git merge origin/main
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
只获取元数据:git fetch 只获取提交信息、分支指针等元数据,不改变你的工作文件
git fetch 为你提供:
•✅ 完整的远程提交历史
•✅ 所有远程分支的当前状态
•✅ 新增的分支和标签信息
•✅ 本地与远程的差异分析
•✅ 团队协作的全景视图
获取远端分支信息
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 命令来查看本地分支与远程分支的跟踪关系
说明:
在公司项目中,不允许直接向 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
如何获取远程分支代码:
# 同事在远程创建了分支 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
1、针对当前分支的多个提交合并成一个提交(通常使用rebase的交互模式)
2、将远程分支合并到本地分支(使用merge)
•https://www.zhihu.com/question/61283395
•https://git-scm.com/docs/git-rebase