Skip to content
Back to skills

Git Smart Update

ASecurity

智能 Git 更新工具,支持自动暂存、冲突解决和本地提交处理。当用户说"更新代码"、"拉取最新代码"、"git pull"、"更新当前分支"、"更新所有分支"、"保留本地修改并更新"时触发。自动处理 stash-update-restore 循环,智能解决冲突(优先采用远程改进,同时保留本地调试代码),支持 rebase 和 merge 两种模式。

  • 6 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 25, 2026
ai-agentspythongobashgit

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 29, 2026

npx -y skills add nicholyx/ai-skills --skill git-smart-update --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Git Smart Update?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Git Smart Update
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/nicholyx-git-smart-update/badge)](https://www.skillsdirectory.com/skills/nicholyx-git-smart-update)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: git-smart-update
description: 智能 Git 更新工具,支持自动暂存、冲突解决和本地提交处理。当用户说"更新代码"、"拉取最新代码"、"git pull"、"更新当前分支"、"更新所有分支"、"保留本地修改并更新"时触发。自动处理 stash-update-restore 循环,智能解决冲突(优先采用远程改进,同时保留本地调试代码),支持 rebase 和 merge 两种模式。
metadata:
  category: Git 与协作
  tagline: "带 stash 循环的智能拉取,自动处理本地改动与冲突"
  example: "更新代码"
---

# Git 智能更新

智能更新 Git 仓库,同时保留本地修改。自动处理暂存-更新-还原循环,并智能解决合并冲突。

## 使用场景

当出现以下情况时使用此技能:
- 用户想更新/拉取代码,且有本地未提交的修改
- 用户说"更新代码"、"拉取最新"、"git pull 并保留我的修改"
- 用户提到更新分支(当前分支或所有分支)
- 你在 pull 操作前检测到未提交的修改
- 本地有已提交的代码,需要与远程同步

## 核心工作流程

### 步骤 1:分析当前状态

首先,了解当前的工作状态:

```bash
# 检查当前分支
git branch --show-current

# 检查未提交的本地修改
git status --porcelain

# 检查是否有 upstream 分支
git rev-parse --abbrev-ref --symbolic-full-name @{u}

# 检查本地是否有已提交但未推送的 commit
git log @{u}..HEAD --oneline
```

**判断点:**
- 无本地修改 → 直接进入更新流程
- 有未提交修改 → 进入暂存工作流
- 有本地 commit → 询问 rebase 还是 merge
- 无 upstream 分支 → 警告用户,询问处理方式

### 步骤 2:处理本地 Commit(如果存在)

检查本地是否有未推送的提交:

```bash
# 获取本地领先的 commit 数量
LOCAL_COMMITS=$(git log @{u}..HEAD --oneline | wc -l)
```

**如果有本地 commit(LOCAL_COMMITS > 0):**

询问用户选择合并策略:

```
检测到你有 {N} 个本地提交尚未推送到远程。

你希望如何与远程更新合并?

1. **Rebase(变基)** - 推荐
   ✓ 提交历史更清晰线性
   ✓ 避免不必要的合并提交
   ⚠️ 会重写本地提交历史

2. **Merge(合并)**
   ✓ 保留原始提交历史
   ✓ 更安全的合并方式
   ⚠️ 会产生一个合并提交

请选择:rebase / merge
```

记录用户选择(`use_rebase`),用于后续的 pull 操作。

### 步骤 3:暂存本地修改(如果需要)

如果有未提交的本地修改:

```bash
git stash push -m "更新前自动暂存 - $(date '+%Y-%m-%d %H:%M:%S')"
```

记录 stash hash 以便后续验证。

### 步骤 4:获取远程更新

**重要:无论更新当前分支还是所有分支,都先 fetch 所有远程信息**

```bash
# 获取所有远程分支的更新信息
# 这样即使断网,也可以切换和合并其他分支
git fetch --all
```

这步的好处:
- 所有远程分支信息缓存到本地 `refs/remotes/origin/`
- 断网后仍可查看其他分支状态、切换分支、合并分支
- 只下载引用信息,不下载完整代码,速度快

### 步骤 5:合并远程更新到本地

**根据用户选择的策略执行:**

**当前分支**(默认):

```bash
# 如果用户选择了 rebase
git rebase @{u}

# 如果用户选择了 merge 或未选择(默认)
git merge @{u}
```

**所有分支**(如果用户请求):

```bash
# 遍历所有分支并更新
for branch in $(git branch -r | grep -v HEAD | sed 's/origin\///'); do
  git checkout $branch
  if [ "$use_rebase" = true ]; then
    git rebase @{u}
  else
    git merge @{u}
  fi
done

# 返回原分支
git checkout <original-branch>
```

**如果 pull 失败:**
- 清晰显示错误信息
- 立即还原暂存的修改:`git stash pop`
- 询问用户如何处理(网络问题?合并冲突?权限问题?)

### 步骤 6:还原本地修改

```bash
git stash pop
```

这可能会触发合并冲突,这是预期的,下一步会处理。

### 步骤 7:处理冲突

执行 `git stash pop` 后,检查冲突:

```bash
git status --porcelain | grep '^UU\|^AA\|^DD'
```

**如果无冲突:** 太好了!清理 stash 并完成。

**如果检测到冲突:** 进入智能冲突解决流程。

## 冲突解决策略

目标是同时保留远程的改进和本地的意图。

### 自动解决规则

1. **优先采用远程配置改进**
   - 如果远程将硬编码改为配置调用 → 使用远程版本
   - 示例:`bucket_name = "pdf"` → `bucket_name = config_manager.get_value(...)`

2. **保留本地调试/测试代码**
   - 如果本地注释掉了生产代码 → 保持注释状态
   - 如果本地禁用了清理/上传/外部调用 → 保持禁用状态

3. **合并互补的修改**
   - 远程添加了新导入/功能 + 本地注释掉了使用部分 → 保留两者
   - 远程重构了结构 + 本地修改了逻辑 → 尝试合并

### 解决流程

对于每个冲突文件:

1. **读取冲突标记**
   ```python
   <<<<<<< Updated upstream
   # 远程版本
   =======
   # 本地版本
   >>>>>>> Stashed changes
   ```

2. **分析语义差异**
   - 是配置 vs 硬编码? → 优先使用远程配置
   - 是激活 vs 注释? → 优先保留本地注释(调试模式)
   - 是冲突的逻辑? → 询问用户

3. **应用解决方案**
   - 使用 Edit 工具将冲突标记替换为解决后的版本
   - 向用户解释推理过程

4. **验证解决方案**
   ```bash
   git add <resolved-file>
   ```

### 何时询问用户

以下情况无法自动解决:
- 两个版本以不同方式修改了相同的逻辑
- 不清楚哪个版本保留了用户的意图
- 结构性变更影响多行代码

**询问格式:**
```
在 <文件> 的第 <N> 行发现冲突:

远程版本:
<显示代码>

你的本地版本:
<显示代码>

两者都修改了 <修改内容>。你希望如何处理?
- 使用远程版本(并解释原因)
- 使用本地版本(并解释原因)
- 显示更多上下文
- 让我手动编辑
```

## 清理工作

成功解决冲突后:

```bash
# 删除已应用的 stash
git stash drop
```

## 特殊情况处理

### 无本地修改
```
✓ 未检测到本地修改
→ 直接拉取更新
✓ 更新成功
```

### 仅有未暂存修改
```
✓ 检测到 3 个文件的未提交修改
✓ 已暂存修改
✓ 已从 origin/develop 拉取更新
✓ 已还原本地修改
✓ 未发现冲突

摘要:
- 更新文件:5 个
- 保留你的调试代码:✓
```

### 有本地 Commit
```
✓ 检测到 2 个本地提交
? 选择合并策略:rebase / merge
→ 用户选择:rebase
✓ 已暂存未提交修改
✓ 已通过 rebase 拉取更新
✓ 已还原未提交修改
✓ 自动解决 1 个冲突
```

### Pull 失败
```
✗ 拉取失败:<错误信息>
→ 正在还原你的本地修改
✓ 本地修改已还原
? 你希望如何处理?
```

### 无 Upstream 分支
```
✗ 当前分支没有 upstream
? 你希望:
  - 设置 upstream 并拉取
  - 跳过此分支
  - 显示所有远程分支
```

## 输出格式

始终提供清晰的反馈:

```
📦 Git 智能更新
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

✓ 检测到 3 个文件有本地修改
✓ 检测到 2 个本地提交,使用 rebase 模式
✓ 已暂存修改
✓ 已获取所有远程分支信息(可离线操作)
✓ 已从 origin/develop 合并更新
✓ 已还原本地修改
✓ 自动解决 2 个冲突
✓ 已清理暂存

摘要:
- 更新文件:5 个
- 解决冲突:2 个
- 保留你的调试代码:✓
- 支持离线操作:✓

准备就绪!
```

## 分支更新模式

### 重要:离线操作支持

**无论更新当前分支还是所有分支,此 skill 都会先执行 `git fetch --all`**

这意味着:
- ✅ 所有远程分支信息被缓存到本地 `.git/refs/remotes/origin/`
- ✅ **断网后仍可自由操作**:
  - 切换到其他分支:`git checkout other-branch`
  - 查看其他分支状态:`git log origin/other-branch`
  - 合并其他分支:`git merge origin/other-branch`
  - 比较分支差异:`git diff origin/main..origin/develop`
- ✅ 只下载引用信息(几 KB),不下载完整代码,速度快
- ✅ 对网络带宽影响极小

**示例场景:**
```bash
# 有网络时
更新代码  # fetch --all,所有分支信息缓存到本地

# 断网后
git checkout feature-branch
git merge origin/feature-branch  # ✅ 成功!信息已在本地

# 甚至可以
git log origin/main..origin/develop  # 查看两个远程分支的差异
```

### 仅当前分支(默认)
- 快速且安全
- 只合并到你所在的分支
- 但已 fetch 所有分支信息供离线使用

### 所有分支(如果用户请求)
- 遍历并更新所有有 upstream 的分支
- 更耗时,可能触发多个冲突

**警告:** 更新所有分支更复杂,可能触发多个冲突。考虑先询问确认。

## Rebase vs Merge 详细说明

### Rebase 模式

**优点:**
- 提交历史线性清晰
- 没有不必要的合并提交
- git log 更易读

**缺点:**
- 会重写本地提交历史
- 如果已推送到远程,可能造成问题(通常本地 commit 未推送时使用)

**适用场景:**
- 本地 commit 未推送
- 希望保持历史整洁
- 团队推荐使用 rebase 工作流

**执行命令:**
```bash
git pull --rebase
```

如果 rebase 过程中有冲突:
```bash
# 解决冲突后
git add <resolved-files>
git rebase --continue

# 或放弃 rebase
git rebase --abort
```

### Merge 模式

**优点:**
- 保留原始提交历史
- 更安全,不会重写历史
- 适合协作开发

**缺点:**
- 会创建合并提交
- 历史可能有多个分叉

**适用场景:**
- 保守选择,更安全
- 团队使用 merge 工作流
- 不确定时选择此项

**执行命令:**
```bash
git pull
```

## 最佳实践

1. **始终解释你在做什么** - 用户应该理解整个流程
2. **在有帮助时显示差异** - 特别是冲突解决时
3. **保留用户意图** - 调试代码、注释部分、进行中的修改
4. **优雅失败** - 如果出现问题,还原状态并询问
5. **清理环境** - 不要留下过期的 stash
6. **提供选择** - rebase/merge 让用户决定
7. **验证结果** - 确保最终状态符合预期
8. **支持离线工作** - 通过 `git fetch --all` 缓存所有远程分支信息,断网后仍可操作其他分支

## 示例

### 示例 1:简单更新 + 调试代码

用户:"更新代码"

流程:
1. 检测到 `app.py` 有未提交修改(注释掉的上传函数)
2. 暂存并添加消息
3. Fetch 所有远程分支信息(支持后续离线操作)
4. 合并当前分支的更新(远程改进了配置处理)
5. Pop stash → app.py 出现冲突
6. 自动解决:保留远程的 config_manager,保留本地的注释上传函数
7. 成功!
8. 告知用户:即使断网,现在也可以切换和合并其他分支

### 示例 2:无本地修改

用户:"拉取最新代码"

流程:
1. 检查状态 → 工作区干净
2. Fetch 所有远程分支
3. 合并当前分支更新
4. "✓ 已更新到最新版本,所有远程分支信息已缓存(支持离线操作)"

### 示例 3:有本地 Commit

用户:"更新当前分支"

流程:
1. 检测到 2 个本地 commit
2. 询问用户:rebase 还是 merge?
3. 用户选择 rebase
4. 暂存未提交修改
5. Fetch 所有远程分支
6. `git rebase @{u}`
7. Rebase 过程中出现冲突
8. 自动解决能处理的冲突
9. 对于剩余的:"发现 2 个冲突需要你的帮助..."
10. 获取用户输入
11. 完成更新
12. 告知用户:现在可以离线操作其他分支

### 示例 4:复杂冲突

用户:"更新代码"

流程:
1. 暂存修改
2. Fetch 所有远程分支
3. 合并更新
4. Pop stash → 多个冲突
5. 自动解决能处理的
6. 对于其余的:"我发现 2 个冲突需要帮助..."
7. 获取用户输入
8. 完成更新
9. 提醒用户离线能力

---

**记住:** 目标是让 stash-update-restore 循环对用户透明,同时保持他们的本地工作安全。要主动、解释清晰,并优雅处理边缘情况。提供选择让用户感到掌控,但智能默认值让流程顺畅。

Files in this skill

  • SKILL.md11.9 KB
  • evals/evals.json2.8 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.