@@ -4,7 +4,7 @@ description: 在多个 git worktree 分支之间同步代码(rebase / merge)
44license : MIT
55metadata :
66 author : mudssky
7- version : " 1.0 "
7+ version : " 1.1 "
88---
99
1010在多个 git worktree 分支之间通过 rebase 同步代码,或将 feature 分支 merge 回主分支。
@@ -140,16 +140,42 @@ git rev-parse --verify <base>
140140
141141### 4.2 检查工作区状态
142142
143+ 分别检查 ** feature worktree** 和 ** 基准 worktree** 的工作区状态:
144+
143145``` bash
144146git -C < worktree-path> status --porcelain
147+ git -C < base-worktree-path> status --porcelain
145148```
146149
147- 如果输出 ** 非空** ,** 拒绝** 同步:
150+ 如果 feature worktree 输出 ** 非空** ,** 拒绝** 同步:
148151> ❌ ` <branch> ` 工作区有未提交改动,请先 commit 或 stash 后重试。
149152
153+ 如果基准 worktree 输出** 非空** ,** 拒绝** 同步:
154+ > ❌ 基准分支 ` <base> ` 工作区有未提交改动,无法更新基准分支。请先 commit 或 stash 后重试。
155+
150156** 不得继续执行。** 不要提供自动 stash 的选项。
151157
152- ### 4.3 检查是否已是最新
158+ ### 4.3 更新基准分支
159+
160+ 在执行 rebase 之前,先从远程拉取基准分支的最新代码,确保同步到远程最新状态。
161+
162+ 首先检查基准分支是否有远程跟踪分支:
163+ ``` bash
164+ git -C < base-worktree-path> rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2> /dev/null
165+ ```
166+
167+ 如果有远程跟踪分支,执行 pull:
168+ ``` bash
169+ git -C < base-worktree-path> pull --rebase
170+ ```
171+
172+ - ** 如果 pull 成功** :显示 ` ℹ 已更新基准分支 <base> 到最新 ` ,继续后续步骤。
173+ - ** 如果 pull 失败** (冲突或网络问题):显示错误信息,** 中止同步** :
174+ > ❌ 更新基准分支 ` <base> ` 失败,请手动处理后重试。
175+
176+ 如果没有远程跟踪分支,跳过此步骤(使用本地基准分支继续)。
177+
178+ ### 4.4 检查是否已是最新
153179
154180检查基准分支是否有该分支没有的 commit:
155181``` bash
@@ -161,7 +187,7 @@ git rev-list --count <branch>..<base>
161187
162188** 到此结束。**
163189
164- ### 4.4 同步预览
190+ ### 4.5 同步预览
165191
166192展示将要应用的 commit:
167193``` bash
@@ -178,17 +204,17 @@ git log --oneline <branch>..<base>
178204 ...
179205```
180206
181- ### 4.5 执行 Rebase
207+ ### 4.6 执行 Rebase
182208
183209``` bash
184210git -C < worktree-path> rebase < base>
185211```
186212
187213** 如果 rebase 成功** → 跳转 Step 5(成功报告)
188214
189- ** 如果 rebase 失败(冲突)** → 跳转 Step 4.6 (冲突处理)
215+ ** 如果 rebase 失败(冲突)** → 跳转 Step 4.7 (冲突处理)
190216
191- ### 4.6 冲突处理(单分支模式)
217+ ### 4.7 冲突处理(单分支模式)
192218
193219当 rebase 产生冲突时:
194220
@@ -252,9 +278,31 @@ git -C <worktree-path> rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2
252278如果没有 feature worktree:
253279> 当前没有可同步的 feature worktree。
254280
255- ### 6.2 逐个处理分支
281+ ### 6.2 更新基准分支
282+
283+ 在逐个处理 feature 分支之前,先更新基准分支(仅执行一次)。
256284
257- 对每个 feature worktree 执行单分支同步流程(Step 4.1–4.5),但有以下区别:
285+ 1 . 检查基准 worktree 工作区状态:
286+ ``` bash
287+ git -C < base-worktree-path> status --porcelain
288+ ```
289+ 如果有未提交改动,** 中止整个批量同步** :
290+ > ❌ 基准分支 ` <base> ` 工作区有未提交改动,无法更新。请先 commit 或 stash 后重试。
291+
292+ 2 . 检查是否有远程跟踪分支并拉取:
293+ ``` bash
294+ git -C < base-worktree-path> rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2> /dev/null
295+ ```
296+ 如果有,执行:
297+ ``` bash
298+ git -C < base-worktree-path> pull --rebase
299+ ```
300+ - 成功:显示 ` ℹ 已更新基准分支 <base> 到最新 ` ,继续。
301+ - 失败:** 中止整个批量同步** ,提示用户手动处理。
302+
303+ ### 6.3 逐个处理分支
304+
305+ 对每个 feature worktree 执行单分支同步流程(Step 4.1–4.6),但有以下区别:
258306
259307- ** 脏工作区** → 记录为 ` ⚠ 跳过(脏工作区) ` ,继续处理下一个分支
260308- ** 已是最新** → 记录为 ` ℹ 已是最新 ` ,继续处理下一个分支
@@ -263,7 +311,9 @@ git -C <worktree-path> rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2
263311
264312** 不要因任何单个分支的失败而停止。** 始终处理所有分支。
265313
266- ### 6.3 汇总报告
314+ ** 注意** :批量模式下跳过 Step 4.3(更新基准分支),因为已在 Step 6.2 统一更新过。
315+
316+ ### 6.4 汇总报告
267317
268318所有分支处理完毕后,显示汇总表格:
269319
@@ -309,7 +359,26 @@ git -C <main-worktree-path> status --porcelain
309359或:
310360> ❌ 主分支 ` <base> ` 工作区有未提交改动,请先 commit 或 stash 后重试。
311361
312- ### 7.3 检查是否需要先同步
362+ ### 7.3 更新基准分支
363+
364+ 在合并之前,先从远程拉取基准分支的最新代码。
365+
366+ 检查基准分支是否有远程跟踪分支:
367+ ``` bash
368+ git -C < main-worktree-path> rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2> /dev/null
369+ ```
370+
371+ 如果有远程跟踪分支,执行:
372+ ``` bash
373+ git -C < main-worktree-path> pull --rebase
374+ ```
375+
376+ - 成功:显示 ` ℹ 已更新基准分支 <base> 到最新 ` ,继续。
377+ - 失败:** 中止合并** ,提示用户手动处理。
378+
379+ 如果没有远程跟踪分支,跳过此步骤。
380+
381+ ### 7.4 检查是否需要先同步
313382
314383检查 feature 分支是否落后于主分支:
315384``` bash
@@ -327,9 +396,9 @@ git rev-list --count <branch>..<base>
327396| 直接合并 | 跳过同步,直接 merge(可能产生 merge commit) |
328397| 取消 | 不执行任何操作 |
329398
330- 如果用户选择「先同步再合并」,先执行 Step 4 的完整流程,成功后继续 Step 7.4 。
399+ 如果用户选择「先同步再合并」,先执行 Step 4 的完整流程,成功后继续 Step 7.5 。
331400
332- ### 7.4 合并预览
401+ ### 7.5 合并预览
333402
334403展示将要合并到主分支的 commit:
335404``` bash
@@ -346,7 +415,7 @@ git log --oneline <base>..<branch>
346415 ...
347416```
348417
349- ### 7.5 执行 Merge
418+ ### 7.6 执行 Merge
350419
351420在** 主 worktree** 目录中执行 merge:
352421``` bash
@@ -355,13 +424,13 @@ git -C <main-worktree-path> merge <branch>
355424
356425如果 feature 分支已经 rebase 过,这通常是一个 ** fast-forward merge** (不产生额外的 merge commit)。
357426
358- ** 如果 merge 成功** → 跳转 Step 7.6 (成功报告)
427+ ** 如果 merge 成功** → 跳转 Step 7.7 (成功报告)
359428
360- ** 如果 merge 失败(冲突)** → 类似 Step 4.6 的冲突处理流程,但操作目录改为主 worktree:
429+ ** 如果 merge 失败(冲突)** → 类似 Step 4.7 的冲突处理流程,但操作目录改为主 worktree:
3614301 . 列出冲突文件:` git -C <main-worktree-path> diff --name-only --diff-filter=U `
3624312 . 提供三个选项:Claude 协助解决 / 手动解决后 ` git -C <path> merge --continue ` / 中止 ` git -C <path> merge --abort `
363432
364- ### 7.6 成功报告(Merge)
433+ ### 7.7 成功报告(Merge)
365434
366435``` bash
367436git -C < main-worktree-path> rev-parse --short HEAD
@@ -382,7 +451,8 @@ git -C <main-worktree-path> log --oneline -1
382451## 安全护栏
383452
384453- ** 禁止自动 stash** :工作区有未提交改动时,直接拒绝并告知用户先 commit 或 stash。
385- - ** 禁止执行 ` git push ` ** :本 skill 仅做本地 rebase。如需 force push,只提醒用户,不代为执行。
454+ - ** 自动更新基准分支** :在 rebase/merge 之前,自动对基准分支执行 ` git pull --rebase ` ,确保同步到远程最新代码。仅当基准分支有远程跟踪分支且工作区 clean 时执行。pull 失败时中止操作。
455+ - ** 禁止执行 ` git push ` ** :本 skill 仅做本地 rebase/merge。如需 force push,只提醒用户,不代为执行。
386456- ** 禁止使用 ` git rebase -i ` ** :交互式 rebase 需要终端输入,不受支持。
387457- ** 批量模式冲突必须 abort** :` --all ` 模式下遇到冲突时,始终执行 ` git rebase --abort ` 并跳过。
388458- ** 始终验证分支存在性** :在执行任何操作前,确认目标分支存在于 worktree 列表中。
0 commit comments