git branch -a
当远程仓库已经存在 dev 分支,但你本地没有 dev 分支时,可以使用该命令将远程分支“拉取”到本地:
git checkout -b dev remotes/dev
git checkout -b release remotes/release
git remote add origin https://github.com/your-username/mcp-demo-git.git
git push --set-upstream origin dev
如果远程仓库没有 dev 分支,该命令会创建一个新的远程分支 dev ,并将本地 dev 分支的内容推送到远程。
如果远程仓库已经有 dev 分支(即使是空的),该命令会将本地 dev 分支的内容推送到远程,并建立关联关系。
git push --set-upstream origin dev :
除了推送,还会设置本地分支的上游分支(upstream)。
适用于首次推送并建立关联的场景。
git push origin dev:dev :
仅推送分支内容,不设置上游分支。
适用于需要明确指定本地和远程分支名称的场景。
第一个 dev 表示本地分支的名称。
第二个 dev 表示远程分支的名称。
格式为 <本地分支>:<远程分支> 。
将本地分支 dev 的内容推送到远程仓库的 dev 分支。
如果远程仓库没有 dev 分支,会创建一个新的远程分支。
如果远程仓库已有 dev 分支,会将本地分支的内容合并到远程分支(可能需要解决冲突)。
git branch -u origin/dev dev
执行后:
本地分支 dev 的上游分支会被设置为 origin/dev 。
后续可以直接使用 git push 或 git pull ,无需指定远程分支名。
但前提是远程分支 origin/dev 必须已经存在
(2) 强制覆盖(慎用)
如果需要用 dev 分支的文件完全替换 release 分支的文件(不推荐):
切换到 release 分支
git checkout release
使用 git checkout 命令从 dev 分支检出 lib 目录到当前分支( release ):
git checkout dev -- lib/
git reset说明
场景 推荐命令 说明
合并提交并立即重提交 git reset --soft HEAD~2 修改已暂存
重新选择要提交的文件 git reset HEAD~2 修改未暂存
完全丢弃提交 git reset --hard HEAD~2 修改全部丢失
| 模式 | HEAD | 暂存区 | 工作区 | 危险度 |
| --------- | ---- | --- | --- | --- |
| `--soft` | 回退 | 保留 | 保留 | ⭐ |
| `--mixed` | 回退 | 清空 | 保留 | ⭐⭐ |
| `--hard` | 回退 | 清空 | 清空 | ☠️ |
------------------------------------------------
git reset会改提交,restore,checkout不会改提交
soft 动 HEAD
mixed 动 HEAD + Index
hard 全动
restore = 从哪拷 → 拷到哪
初始状态:
HEAD: v1
暂存区: v2
工作区: v3
git reset --soft
作用:只修改 HEAD 指针,暂存区和工作区都不变
─────────────────────────────────────
执行 git reset file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── v1 ← 取消暂存
工作区: v3 ──────── 不变
─────────────────────────────────────
执行 git reset --hard file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── v1 ← 取消暂存
工作区: v3 ──────── v1 ← 丢弃修改
─────────────────────────────────────
执行 git restore --staged file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── v1 ← 取消暂存
工作区: v3 ──────── 不变
─────────────────────────────────────
执行 git restore file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── 不变
工作区: v3 ──────── v2 ← 从暂存区恢复
─────────────────────────────────────
执行 git restore --staged --worktree file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── v1 ← 取消暂存
工作区: v3 ──────── v1 ← 丢弃修改
─────────────────────────────────────
执行 git checkout -- file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── 不变
工作区: v3 ──────── v2 ← 从暂存区恢复
─────────────────────────────────────
执行 git checkout HEAD -- file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── v1 ← 恢复到 HEAD
工作区: v3 ──────── v1 ← 恢复到 HEAD
─────────────────────────────────────
执行 git checkout <commit> -- file:
HEAD: v1 ──────── 不变
暂存区: v2 ──────── 提交内容
工作区: v3 ──────── 提交内容
─────────────────────────────────────
执行 git checkout <branch>:
HEAD: v1 ──────── 指向目标分支
暂存区: v2 ──────── 目标分支状态
工作区: v3 ──────── 目标分支状态
─────────────────────────────────────
命令 数据源 影响范围
git checkout -- file 暂存区 仅工作区
git checkout HEAD -- file HEAD 暂存区 + 工作区
git restore file 暂存区 仅工作区
命令组合 修改了哪里? git status 会看到什么?
git restore -s <commit> <file> 仅工作区 Changes not staged for commit (红色)
git restore -s <commit> --staged <file> 仅暂存区 Changes to be committed (绿色)
git restore -s <commit> -S -W <file> 工作区 + 暂存区 文件内容已变,且已处于 add 状态
| 老写法 | 新写法 |
| ---------------------- | --------------------------- |
| `git checkout -- file` | `git restore file` |
| `git reset HEAD file` | `git restore --staged file` |
| `git checkout dev` | `git switch dev` |
git diff比较
| 你想比较的对象 | 命令 |
| ----------- | ------------------------------------ |
| 工作区 ↔ 暂存区 | `git diff file` |
| 工作区 ↔ HEAD | `git diff HEAD -- file` |
| 暂存区 ↔ HEAD | `git diff --staged file` |
| 工作区 ↔ 指定提交 | `git diff <commit> -- file` |
| 暂存区 ↔ 指定提交 | `git diff <commit> --staged -- file` |
| 提交 A ↔ 提交 B | `git diff <A> <B> -- file` |
# 语法: git worktree add <路径> <分支名>
# 示例: 在当前项目旁边创建一个叫 fix-bug 的文件夹,检出 master 分支
git worktree add ../fix-bug master
# 如果想基于当前 commit 新建一个分支并检出到新目录
git worktree add -b hotfix-login ../hotfix-login master
高级玩法:Bare Repo 最佳实践
这是资深玩家管理大型项目的推荐方式。不要把主仓库放在普通的
目录,而是用 Bare Repository(裸仓库) 作为中心,所有工作分支都作为 Worktree 平铺在旁边。
目录结构看起来像这样:
my-project/
├── .bare/ # Git 裸仓库 (核心数据库,不存代码)
├── main/ # 主分支工作目录
├── feature-A/ # 特性分支工作目录
└── hotfix/ # 热修工作目录
操作步骤:
-
克隆为裸仓库:
git clone --bare git@github.com:user/repo.git .bare(注意:我们在目录里建了一个叫
.bare的文件夹存放 git 数据)
-
创建主工作目录: 在此目录下创建一个
.git文件指向裸仓库,或者直接用 worktree 命令:
git --git-dir=.bare worktree add main master -
日常开发: 需要新分支时:
git --git-dir=.bare worktree add feature-A feature/login
git 使用:等您坐沙发呢!