git commands
✅ commit
1 | git add . //把当前修改全部加入暂存区(也可指定文件) |
🌿 branch
1 | git branch //查看现有分支 |
🔀 merge
1 | git checkout main //切换到 main |
📍 rebase
1 | git checkout feature/foo //切 feature 分支 |
🔁 同步远程(配合 rebase)
1 | git pull //拉取并 merge(默认) |
⚠ rebase 注意点
1 | git push --force //强制推送(改历史后要用,会覆盖远程) |
好的,继续用同样风格总结 + 命令 + 注释,简洁明了。
🧩 分离 HEAD(detached HEAD)
🔸现象解释:HEAD 不指向 branch,而直接指向某个 commit
🔸用途:临时查看老版本、测试、构建
1 | git checkout <commit_id> //切到某个 commit(进入 detached HEAD) |
🎯 相对引用 ^
^ 表示:「父提交」
1 | HEAD^ //HEAD 的父提交 |
举例:
1 | git checkout HEAD^ //回到上一个提交 |
🎯 相对引用 ~
~ 表示:「第 N 个父提交(只沿主线)」
1 | HEAD~1 //等同 HEAD^ |
区别点:
1 | ^ 表示父提交分支 |
merge commit 时特别明显。
🔁 撤销变更(工作区、暂存区、历史)
1. 撤销工作区未 add 的改动
1 | git checkout -- <file> //撤销指定文件改动(恢复到最近 commit) |
2. 撤销已 add 但未 commit
1 | git reset <file> //取消 add,回到工作区 |
3. 撤销 commit(保留工作区)
1 | git reset --soft HEAD^ //撤销上一条 commit,改动保留在暂存区 |
4. 已 push 的错误提交(用 revert)
1 | git revert <commit> //生成新的反向提交,安全撤销 |
👉 revert 优点:不会改历史 → 适合多人协作
🧱 撤销 vs 回退 总结
| 操作 | 是否改历史 | 是否丢数据 | 是否适合多人 |
|---|---|---|---|
| checkout – | ❌ | ⚠ 可能 | ✔ |
| reset | ✔ | ⚠ 看模式 | ❌ |
| revert | ❌ | ❌ | ✔ |
🍒 Git Cherry-pick
🔹 作用:把某个 commit 的改动“挑过来”应用到当前分支
🔹 用途:单独拣选某次提交到其他分支,不需要 merge 整条分支
1 | git checkout main //切到目标分支 |
💡 特点:
- 会生成新的 commit(和原 commit 内容一样,但 commit id 不同)
- 不会改变原分支历史
- 常用于 hotfix / 补丁
🛠 交互式 rebase(interactive rebase)
🔹 作用:整理/修改分支历史(改 commit 顺序、合并、删除、修改提交信息)
🔹 命令:
1 | git checkout feature/foo //切到要整理的分支 |
🔹 交互界面常用操作:
1 | pick <commit_id> //保留该 commit |
🔹 后续操作:
1 | git rebase --continue //解决冲突后继续 |
💡 特点:
- 历史线性化,更干净
- 可以修改提交顺序、信息、合并多个 commit
- 危险:不要对已 push 给别人的分支 rebase
🔁 Cherry-pick vs 交互式 rebase
| 对比点 | cherry-pick | interactive rebase |
|---|---|---|
| 改变历史 | 不改原分支历史 | 改变当前分支历史 |
| 是否生成新 commit | 是(新 commit id) | 可修改或合并 commit |
| 用途 | 拣选单个/少量 commit | 整理整个分支历史 |
| 协作风险 | 低 | 高(慎用已 push 分支) |
🏷 Git Tag
🔹 作用:给某个 commit 打上“标记”,通常用于发布版本或里程碑
🔹 特点:不会像分支一样移动,固定指向某个 commit
1 | git tag //查看本地所有 tag |
💡 补充:
- 轻量 tag:仅仅是指向 commit 的指针
- **带注释 tag (-a)**:是完整对象,可保存作者、时间、信息
🔍 Git Describe
🔹 作用:根据最近的 tag 来描述当前 commit 的信息,常用于生成版本号
🔹 特点:输出可读版本信息,比直接 commit id 更友好
1 | git describe //显示距离最近 tag 的描述(默认最近可达 tag + 后续提交数量 + 简短 commit id) |
💡 例子:
1 | v1.0-3-g9fceb02 |
解释:
v1.0→ 最近的 tag3→ 从 tag 后到当前 commit 的提交数量g9fceb02→ 当前 commit 的缩短 hash
⚡ 用途:
- 自动生成版本号
- CI/CD 构建时标记构建版本
- 跟踪某个提交距离最近的发布版本
🔁 总结 Tag vs Describe
| 命令 | 作用 | 输出/特性 | 用途 |
|---|---|---|---|
| git tag | 标记 commit | tag 名 | 发布版本、里程碑 |
| git describe | 基于最近 tag 描述 commit | v1.0-3-gxxxx | 生成版本号、追踪提交 |
🌀 1. Git Clone
🔹 作用:从远程仓库克隆一份完整本地仓库(包括 commit 历史、分支、tag)
1 | git clone <repo_url> //克隆远程仓库到本地 |
💡 特点:
- 会自动创建
origin指向远程 - 默认会切到远程默认分支(一般是 main/master)
📥 2. Git Fetch
🔹 作用:从远程拉取最新 commit / branch / tag 到本地,但不合并到当前分支
1 | git fetch //拉取所有远程更新(仅更新本地远程引用) |
💡 特点:
- 安全,不改动当前工作区
- 拉取后需要手动 merge 或 rebase
📦 3. Git Pull
🔹 作用:fetch + merge(默认)或者 fetch + rebase(可选)
🔹 命令:
1 | git pull //拉取远程更新并 merge 到当前分支 |
💡 特点:
- 快速同步远程到本地
- 如果本地修改和远程冲突,会提示解决冲突
📤 4. Git Push
🔹 作用:把本地提交推送到远程分支
1 | git push //推送当前分支到远程对应分支 |
💡 注意点:
- 已 push commit 不建议随意 reset/rebase
- 多人协作常规用
pull+push - CI/CD 自动化常依赖 push
⚠ 偏离的提交历史(Diverged History)
🔹 现象:本地分支和远程分支都有新的 commit,彼此不在同一条直线上
1 | git status //提示 “Your branch and 'origin/main' have diverged” |
🔹 解决方式:
- merge(保留历史)
1 | git pull //默认 merge |
- rebase(线性化历史)
1 | git pull --rebase //把本地提交放到远程最新之后 |
💡 提示:
- merge 保留分叉历史,冲突后生成 merge commit
- rebase 历史线性,但改写 commit,慎用已 push 分支
🔒 锁定的 Main(Locked Main)
🔹 概念:公司或开源仓库为了保护主分支,禁止直接 push
🔹 常见策略:
- 设置保护分支(Protected Branch)
- 必须通过 Pull Request / Review 才能合并
- 阻止 force push
1 | git push origin main //如果 main 被锁定,会被拒绝 |
💡 开发流程建议:
- 个人开发 → 新建 feature 分支
- 完成 → 提交 PR → 审核通过 → merge 到 main
- 避免直接修改 main
🔁 总结工作流(锁定 Main + 避免偏离历史)
1 | git clone <repo> //克隆仓库 |
主分支 main 锁定,所有开发都通过 feature 分支 + PR 流程合并,避免冲突和偏离历史。





