Koala
Git_Sync
vault + paperless_bot 一鍵 commit & push · v{{ APP_VERSION }}

{{ r.label }}

{{ statusText(r) }} 待 Push {{ r.ahead }} 待 Pull {{ r.behind }} ⚠ {{ r.in_progress }} 進行中 執行中… {{ r.branch || '—' }}
{{ r.path }}

⚠ 分歧警告:本地和遠端各有新 commit(待 Push {{ r.ahead }} / 待 Pull {{ r.behind }})

本地有 {{ r.ahead }} 個 commit 還沒 push,遠端有 {{ r.behind }} 個 commit 還沒 pull。 直接按「Commit & Push」會失敗。
建議先按下面的「Safe Pull」把遠端合進來;若有衝突會列在上方讓你逐檔處理,解完再 push。
= git pull --no-rebase,保留本地 commit,產生一個 merge commit

🔒 偵測到殘留的 .git/index.lock

這是 git 正在執行時的保護鎖檔。通常 SMB 連線中斷或 git 被強制結束時會留下空 lock,讓後續 commit / push 全部報錯:
fatal: Unable to create '.../.git/index.lock': File exists.
⚠ 讀取 lock 狀態失敗:{{ r.stale_lock.error }} 目前狀態:size = {{ r.stale_lock.size }} bytes · 存在 {{ r.stale_lock.age_s }} 秒 · ✓ 符合安全清除條件(空檔 + > 60 秒) ⚠ 不符合自動條件(要 size == 0 且 age > 60s 才算殘留)
= 刪除 .git/index.lock,讓 git 指令可以繼續執行

⚠ {{ r.in_progress }} 進行中 ⚠ 有衝突檔案

請逐個解決衝突(手動編輯後按「已解決」),或按下方「🧙 自動解已知衝突」一鍵處理常見 pattern:
{{ f }}
衝突已全部標記解決,可按 Continue 完成
{{ f.code }} {{ f.path }}
✓ 乾淨的 working tree,沒有變動
{{ r.error || '讀取失敗' }}
已選 {{ countSelected(key) }}/{{ r.files.length }}
🚫 Preflight: {{ preflight[key].fail }} 項阻擋 ⚠ Preflight: {{ preflight[key].warn }} 項警告(可繼續) ✓ Preflight: 全綠 {{ preflight[key].lastRun }}
  • {{ it.status === 'fail' ? '✗' : (it.status === 'warn' ? '⚠' : '✓') }} {{ it.name }} — {{ it.msg }}
🌿 Branches {{ (r.branches_local||[]).length }} local / {{ (r.branches_remote||[]).length }} remote
切換到:
建立新分支:
合併進 {{ r.branch }}
Rebase {{ r.branch }} 到:
刪除分支:
📦 Stash {{ (r.stashes||[]).length }} entry
{{ s.desc }}
沒有 stash
🏷️ Tags {{ (r.tags||[]).length }} tag
{{ t.name }} {{ t.hash }} {{ t.subject }} 📡 🏠
沒有 tag

Coach Koala Surgeon

{{ t.text }}
Koala Surgeon : ...思考中
我現在該怎麼辦? 解釋現況 怎麼切回 main 分開 commit 嗎 先 pull 還是先 push 想去別的分支 安全嗎?
📜 執行 log ({{ logLines.length }} 行)
(尚未執行任何 git 指令,log 是空的)
{{ l.text }}
🚀 確認 Commit & Push
{{ confirmModal.countdown }}s 後自動執行

Repo: {{ repos[confirmModal.key] && repos[confirmModal.key].label }}

檔案數: {{ confirmModal.files.length }}

Commit message:

{{ confirmModal.message }}
🚫 Preflight 發現阻擋項
{{ repos[preflightGate.key] && repos[preflightGate.key].label }}

以下檢查項目顯示紅燈,代表繼續 commit/push 很可能導致 diverge、conflict、或資料遺失:

  • {{ it.name }} — {{ it.msg }}

建議先按 🩹 一鍵修復 / 🔓 Unlock / ↓ Pull 處理,再重跑 Preflight。

❓ Git 概念速查 v{{ APP_VERSION }} · {{ BUILD_DATE }}

Stage(暫存區)vs Stash(擱置櫃)

Stage Stash
一句話 下一次 commit 要收這些檔案 這些變動先放一邊,我等會再決定
指令 git add <file> git stash / git stash pop
下一步 git commit 收走 → 變成 commit stash pop 拿回來繼續改
會 push 嗎 commit 後會 ❌ 不會(stash 只存在本地)
數量 只有一個 index(當前) 可以有多個(stash@{0}, stash@{1}, ...)

結帳比喻: Stage = 輸送帶上等掃碼(掃完就買單); Stash = 放回小籃子先(等會兒再說)。

什麼時候用 Stash?

情境 改到一半,另一台裝置 push 了新東西,你想 pull 下來但不想 commit 半成品
怎麼做 📦 Stash → 💾 Stash current ➜ ↓ Pull ➜ 📦 Stash → Pop 那一筆
情境 發現你在錯的分支改東西(例如 main 上改了 feature 的東西)
怎麼做 📦 Stash save ➜ 🌿 Switch 到對的分支 ➜ Stash pop

Branch(分支)

可以想成「平行時空」— 每個分支是獨立的 commit 序列。 切過去時 working tree 會變成那個分支的最新樣子。

  • Switch:換到另一條分支
  • Create & switch:從目前位置長一條新分支出去
  • Delete:刪本地分支(擋刪目前所在的)
  • Force:強制刪,**未合併的 commit 會不見**

Merge vs Rebase

Merge Rebase
行為 保留兩邊歷史,加一個 merge commit 把它們接起來 把你的 commit 一個個「搬過去」疊在另一條分支後面
歷史線 Y 字形(看得到分叉) 直線(像從來沒分叉過)
安全性 ✅ 安全,不改已有的 commit ⚠ 會改寫 commit 歷史,push 過的話別人會亂
建議 多人協作時用這個 只有自己用的 feature branch 才用

Conflict(衝突)

merge / rebase / pull 時,如果同一行兩邊都改了不同內容, Git 不知道要留哪邊,就會停下來等你決定。這時:

  1. 頁面上方會跳 ⚠ 紅色橫幅,列出衝突檔
  2. 點「看內容」看哪一行衝突,用你熟悉的編輯器(VS Code / Obsidian)改好
  3. 改完按「✓ 已解決」(= git add
  4. 全部解完按 Continue;想放棄就按 Abort

🏷️ Tag vs Branch vs Stash

Tag Branch Stash
一句話 永遠指向那一個 commit 的書籤 還會往前走的開發線 抽屜裡的暫存工作
會動嗎 ❌ 立了就定住(歸檔用) ✅ 每 commit 往前跑 ⏳ 不動,等你 apply/pop
典型用途 版本號 v1.0、歸檔 archive/xxx feature 開發、bugfix 「我改一半想去別的分支」
怎麼建 🏷️ Tags → 輸入名稱 → Create 🌿 Branches → Create & switch 📦 Stash → Stash current

Annotated vs Lightweight tag: 留了說明文字 → annotated(帶日期 + 作者,可被 GPG 簽章), 沒說明 → lightweight(只是個純指標)。一般要歸檔建議 annotated。

Create & push:tag 只建在本地,要讓別台機器也看得到請用此按鈕; 或建好後可在後端用 git push origin refs/tags/<name>Del +remote 才會把 origin 上的也刪掉。

🤖 AI Console

下方的 AI Console 是一個「Git 教練」:會看你目前兩個 repo 的真實狀態 (branch、變動檔、stash、tag、ahead/behind、衝突…),用中文告訴你 「現在該按哪個按鈕」。適合卡住不知道下一步的時候問它。

  • 可先選 focus repo,讓回答聚焦 vault 或 paperless
  • 快速按鈕有常見問題,例:「先 pull 還是先 push?」
  • Cmd/Ctrl + Enter 直接送出
  • 這個對話只活在這個分頁,不會存到任何地方;按 🗑 清空就沒了
{{ diffFile }} {{ diffStaged ? '(staged)' : '(unstaged)' }}
沒有變動內容