Git 常用命令与分支同步总结
一、常用 Git 命令速查
仓库初始化 / 克隆
git init # 初始化本地仓库
git clone <url> # 克隆远程仓库
日常提交
git status # 查看当前状态
git add <file> # 添加指定文件到暂存区
git add . # 添加所有改动
git commit -m "说明" # 提交
git commit --amend # 修改最近一次提交
git cherry-pick <commit> # 把某个提交摘到当前分支
查看历史 / 差异
git log # 查看提交历史
git log --oneline --graph # 简洁图形化历史
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 上次提交
分支操作
git branch # 查看本地分支
git branch -a # 查看所有分支(含远程)
git switch <branch> # 切换分支(新语法)
git switch -c <branch> # 新建并切换
git checkout <branch> # 切换分支(旧语法)
git checkout -b <branch> # 新建并切换(旧语法)
git merge <branch> # 合并分支
远程协作
git remote -v # 查看远程地址
git fetch # 拉取远程所有分支更新(不合并)
git fetch origin A # 拉取远程分支A更新(不合并)
git pull # 拉取远程所有分支更新并分别合并到本地分支
git pull origin A # 拉取远程分支A更新并合并到当前本地分支
git push origin HEAD:A # 推送当前修改(多笔修改可一起推送)到远程分支A
撤销 / 回退
git restore <file> # 撤销工作区改动
git restore --staged <file> # 取消暂存
git reset --soft HEAD~1 # 回退最近一笔提交,保留改动在暂存区
git reset --soft commitId # 回退到指定commitId提交,保留改动在暂存区
git revert <commit> # 生成反向提交来撤销
git stash # 临时保存改动
git stash list # 查看临时保存改动
git stash pop # 恢复并删除暂存
二、三个典型场景
场景 1:本地在 B,想更新本地分支 A 为远程最新
git fetch origin A && git switch A && git pull --rebase origin A && git switch B
关键结论:
git fetch origin A只更新origin/A,不动本地 A- 如果本地 A 已存在且落后,切过去仍是旧的
- 只有本地 A 不存在时,
git switch A才会自动以origin/A为起点创建
场景 2:本地在 A,想更新 A 为远程最新
git pull --rebase origin A # 推荐,历史线性
git pull origin A # 普通合并,产生 merge 提交
场景 3:本地在 B,想切到只有远程的 A
git fetch origin A
git switch A # 自动创建本地 A 并跟踪 origin/A
等价老写法:
git fetch origin A && git checkout A
三、核心概念
1. 本地分支 vs 远程跟踪分支
| 指向哪里 | 谁维护 | |
|---|---|---|
origin/A | 远程 A 的最新提交 | fetch 自动更新 |
本地 A | 你本地这个分支的提交 | 只有 commit/merge/reset/branch -f 等才会动 |
切分支只是切换 HEAD 指向哪个本地分支,不会同步本地分支和远程对应分支。
2. switch A / checkout A 的行为规则
| 本地 A | 远程 A | git switch A | git switch -c A |
|---|---|---|---|
| 有 | — | 切过去 | 报错(已存在) |
| 无 | 有 | 自动创建并跟踪 origin/A | 从当前 HEAD 创建,不跟踪 |
| 无 | 无 | 报错 | 从当前 HEAD 创建新分支 |
- 起点 = 远程 A 的最新提交
- 历史 = 完整保留(分支只是指针,历史通过提交父子链存在)
- 远程和本地都没有 A 时,必须用
-c/-b才能创建新分支
3. rebase vs merge
| 历史形态 | 是否产生合并提交 | 是否改写哈希 | |
|---|---|---|---|
merge | 有分叉 | 是 | 否 |
rebase | 线性 | 否 | 是(只对未推送提交安全) |
git pull= fetch + mergegit pull --rebase= fetch + rebase,历史更干净- 只对还没推送的本地提交做 rebase
4. switch vs checkout
switch是 Git 2.23 引入的专用切分支命令,语义单一checkout是万能命令,同时管切分支、恢复文件、detached HEADswitch更现代、更安全;checkout兼容性更好
四、一句话记忆
fetch 只动
origin/*,本地分支要自己 merge / rebase / 强制移动。切分支只切 HEAD,不自动同步本地分支和远程。
本地和远程都没有的分支,必须
-c/-b才能创建(不建议直接在本地创建分支)。
拓展:Git Rebase
重写本地未推送的提交历史,让历史干净、线性。
两个最常用命令
1. 同步远程更新(最日常)
git pull --rebase
等价于 fetch + rebase,把自己未推送的提交搬到远程最新之上,不产生多余的 merge 提交。
2. 整理本地提交
git rebase -i HEAD~3
打开编辑器,列出最近 3 个提交(旧 → 新):
pick a1b2c3d 添加登录页面
pick b2c3d4e 修复登录样式
pick c3d4e5f 补充登录测试
把想合并的行改成 squash(或 f):
pick a1b2c3d 添加登录页面
squash b2c3d4e 修复登录样式
fixup c3d4e5f 补充登录测试
| 动作 | 作用 |
|---|---|
pick / p | 保留 |
squash / s | 合并到上一个,保留信息 |
fixup / f | 合并到上一个,丢信息 |
reword / r | 改提交信息 |
drop / d | 删除 |
保存退出即可,冲突时:
git add <file>
git rebase --continue
想放弃:
git rebase --abort
一条铁律
只对未推送的提交 rebase。已推送、别人可能基于它开发的提交,不要动。
强推用 git push --force-with-lease,别用 --force。
一句话记住
git pull --rebase保持同步干净;git rebase -i整理本地提交。仅限未推送,出错reflog能救。