Git 常用命令速查与分支操作指南
[!abstract] 摘要 本文整理了 Git 日常高频命令的用法与分支管理的完整操作流程。面向二刷复习,注重快速上手和遗忘提醒。附带常见踩坑记录。
参考教程:CSDN Git 教程 | B 站:黑马程序员 Git 全套教程
1. 基本命令(重要/易忘)
1.1 git init — 初始化仓库
作用:在当前目录创建 .git 子藏目录,使其成为一个 Git 仓库。
# 在当前目录初始化git init
# 指定目录名初始化git init my-project执行后当前目录下会多出一个隐藏的 .git 文件夹,不要手动修改或删除它,它是 Git 的”大脑”。
1.2 git status — 查看工作区状态
作用:查看当前哪些文件被修改、暂存、未跟踪,是最常用的”侦察兵”命令。
git status
# 简洁模式(一目了然)git status -s# 输出示例:# M src/main.java ← 已暂存(绿色 M 在左列)# M src/utils.java ← 已修改未暂存(红色 M 在右列)# ?? temp.txt ← 未跟踪的新文件| 标识 | 含义 |
|---|---|
?? | 未跟踪(新文件) |
A | 新增到暂存区 |
M | 已修改 |
D | 已删除 |
R | 重命名 |
1.3 git log — 查看提交历史
作用:查看仓库的提交记录,默认按时间倒序。
# 基本查看git log
# 单行简洁模式(最常用⭐)git log --oneline
# 图形化分支结构(强烈推荐⭐⭐)git log --oneline --graph --all
# 查看最近 N 条git log -5
# 查看某文件的修改历史git log -- path/to/file.java
# 搜索提交信息关键词git log --grep="fix" --oneline习惯性使用 git log --oneline --graph --all,一张图看清所有分支的走向和合并情况。
1.4 git reset — 版本回退
作用:将 HEAD 指针移动到指定提交,用于撤销提交或回退版本。
# 回退到某个 commit,修改保留在暂存区git reset --soft <commit-hash>
# 回退到某个 commit,修改保留在工作区(默认模式)⭐最常用git reset --mixed <commit-hash># 等价于git reset <commit-hash>
# 回退到某个 commit,修改全部丢弃(慎用⚠️)git reset --hard <commit-hash>
# 回退最近一次提交,保留修改在工作区git reset HEAD~1--hard 慎用--hard 会彻底丢弃工作区和暂存区的修改,无法找回。不确定时优先用 --soft 或 --mixed。
三种模式对比:
| 模式 | HEAD 指针 | 暂存区 | 工作区 | 适用场景 |
|---|---|---|---|---|
--soft | ✅ 移动 | ❌ 不动 | ❌ 不动 | 合并多个提交为一个 |
--mixed | ✅ 移动 | ✅ 重置 | ❌ 不动 | 撤销提交,重新挑选暂存 |
--hard | ✅ 移动 | ✅ 重置 | ✅ 重置 | 彻底回退,丢弃所有修改 |
1.5 git merge — 合并分支
作用:将指定分支的修改合并到当前分支。
# 将 feature 分支合并到当前分支git merge feature
# 合并后有冲突?解决后继续git merge --continue
# 放弃本次合并git merge --abort冲突解决流程:
- 执行
git merge后出现CONFLICT提示 - 打开冲突文件,找到
<<<<<<</=======/>>>>>>>标记 - 手动选择保留的内容,删除冲突标记
git add <冲突文件>→git commit
VSCode 会高亮显示冲突区域,并提供 “Accept Current” / “Accept Incoming” / “Accept Both” 的快捷按钮,解决后直接提交即可。
1.6 git diff — 查看差异
作用:比较文件在不同状态之间的差异,日常排查修改利器。
# 工作区 vs 暂存区(未 add 的改动)git diff
# 暂存区 vs 最新提交(已 add 但未 commit 的改动)git diff --staged
# 比较两个分支的差异git diff main..feature
# 只看文件名(不看具体差异)git diff --name-only main..feature2. 分支管理 ⭐
2.1 git branch 基本操作
# 查看所有本地分支git branch
# 查看所有分支(含远程)git branch -a
# 创建新分支git branch feature
# 删除分支(已合并的)git branch -d feature
# 强制删除分支(未合并也删)git branch -D feature2.2 分支切换与创建
# 切换分支git checkout feature# 或新版写法(推荐⭐)git switch feature
# 创建并切换到新分支git checkout -b feature# 或新版写法(推荐⭐)git switch -c featureswitch vs checkoutgit checkout 职责过多(切分支、恢复文件、切换 HEAD),Git 2.23+ 引入 switch 专门用于分支切换,语义更清晰。
2.3 合并分支 ⭐
# 切回主分支,合并 featuregit switch maingit merge feature
# 合并后删除 feature 分支git branch -d feature合并策略示意:
# 快进合并(Fast-Forward)— feature 直接领先于 mainmain ──●──● main ──●──●──● (fast-forward) └──● feature ─────┘
# 三方合并(3-Way Merge)— 双方都有新提交main ──●──●──┐ ├──● (merge commit)feature ──●──●─┘2.4 同步远程分支 ⭐
# 查看远程仓库信息git remote -v
# 拉取远程最新代码(不合并)git fetch origin
# 拉取并合并到当前分支git pull origin main
# 推送本地分支到远程git push origin main
# 首次推送并绑定上游分支⭐git push -u origin main# 后续直接 git push 即可fetch vs pullgit fetch:只下载远程更新,不自动合并,安全可控git pull=git fetch+git merge,一步到位但可能产生意外冲突
3. 踩坑记录
3.1 绑定上游分支
遇到
fatal: The current branch main has no upstream branch报错时:
# 把本地 main 绑定到远程 study 仓库的 main 分支git branch --set-upstream-to=study/main main等价操作:首次推送使用 -u 参数:
git push -u study main3.2 首次拉取无关历史报错
fatal: refusing to merge unrelated histories— 两个仓库没有共同祖先时触发。
# 加 --allow-unrelated-histories 解决git pull study main --allow-unrelated-histories
# 如果同时需要拉取标签git pull study main --tags --allow-unrelated-histories此参数仅首次对接时需要,后续正常 pull 无需再加。
3.3 合并冲突处理
- VSCode 图形界面会高亮冲突区域
- 选择保留当前(Current)或传入(Incoming)的内容
- 确认后
git add .→git commit提交合并结果
4. Tag 标签管理
作用:标记版本节点(如 v1.0、正式版、里程碑),只读,不随代码频繁改动。
# 查看所有标签git tag
# 创建轻量标签git tag v1.0
# 创建附注标签(推荐⭐,包含作者和备注)git tag -a v1.0 -m "第一个正式版本"
# 给历史提交打标签git tag -a v0.9 abc1234
# 推送标签到远程git push origin v1.0
# 推送所有标签git push origin --tags
# 删除本地标签git tag -d v1.0
# 删除远程标签git push origin --delete v1.0--tags 参数git pull --tags 可以在拉取代码的同时拉取所有远程标签,常用于版本同步。
5. .gitignore 速查
详见 → [[gitignore详解]]
# 快速模板.idea/.vscode/node_modules/dist/*.log.env已经 git add / git commit 过的文件,即使写入 .gitignore 也不会生效。需要先解除跟踪:
git rm -r --cached <文件或目录>git commit -m "解除跟踪"支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!