git 使用

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 最佳实践

这是资深玩家管理大型项目的推荐方式。不要把主仓库放在普通的

project

目录,而是用 Bare Repository(裸仓库) 作为中心,所有工作分支都作为 Worktree 平铺在旁边。

目录结构看起来像这样:

Plaintext



my-project/
├── .bare/        # Git 裸仓库 (核心数据库,不存代码)
├── main/         # 主分支工作目录
├── feature-A/    # 特性分支工作目录
└── hotfix/       # 热修工作目录

操作步骤:

  1. 克隆为裸仓库

    git clone --bare git@github.com:user/repo.git .bare

    (注意:我们在目录里建了一个叫

    .bare

    的文件夹存放 git 数据)

  2. 创建主工作目录: 在此目录下创建一个

    .git

    文件指向裸仓库,或者直接用 worktree 命令:

    git --git-dir=.bare worktree add main master

  3. 日常开发: 需要新分支时:

    git --git-dir=.bare worktree add feature-A feature/login

 
喜欢 0
分享