> ๐ŸŒ Language: [English](Git-Integration) | **ไธญๆ–‡** # Git ้›†ๆˆ ไธป็ช—ๅฃใ€ŒGitใ€tabใ€‚ๅˆ†ไธคๅˆ—:ๅทฆ changes(working tree),ๅณ history(้ป˜่ฎค)/ diff(็‚นๆ–‡ไปถๆˆ– commit ๅŽ)ใ€‚ ## ๅธƒๅฑ€ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ .git-head โ”‚ โ”‚ ๐ŸŒฟ ยท N ๆ›ดๆ”น [โŸณ ๅˆทๆ–ฐ] โ”‚ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค โ”‚ โ”‚ โ”‚ โ”‚ .git-changes โ”‚ .git-side โ”‚ โ”‚ ๆ›ดๆ”น(working tree) โ”‚ โ”œโ”€ ้ป˜่ฎค:ๅކๅฒ(commit log) โ”‚ โ”‚ โ”‚ โ””โ”€ ็‚นๆ–‡ไปถ/commit:diff(ๅธฆ โ† ่ฟ”ๅ›ž)โ”‚ โ”‚ M ไฟฎๆ”น src/x.ts โ”‚ โ”‚ โ”‚ A ๆ–ฐๅขž README.md โ”‚ abc123 2026-07-12 fix: ... me โ”‚ โ”‚ ?? ๆœช่ทŸ foo.txt โ”‚ def456 2026-07-11 feat: ... me โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ## ๆ•ฐๆฎๆฅๆบ `api.gitSnapshot(cwd)`(`src/shared/types.ts:160`)่ฟ”ๅ›ž `GitSnapshot`: ```ts { ok: boolean; branch?: string; // ๅฝ“ๅ‰ๅˆ†ๆ”ฏๅ changes?: GitChange[]; // git status --short ่งฃๆž log?: GitCommit[]; // git log --pretty=format:... error?: string; } ``` `GitChange`:`{ path, code, staged }`(`code` ๆ˜ฏๅ•ๅญ—็ฌฆ `M/A/D/R/?/!`โ€ฆ)ใ€‚ main ่ฟ›็จ‹็›ดๆŽฅ spawn `git` ๅ‘ฝไปค(่ตฐ `tools.ts` ็š„ spawn ้€ป่พ‘,ไฝ†ไธๅœจ Direct ๅทฅๅ…ท้“พ้‡Œ โ€”โ€” ่ฟ™็ป™ renderer tab ็”จ)ใ€‚ ## ๅทฆๅˆ—:changes `git status --short` ่งฃๆžใ€‚ๆฏ่กŒไธ€ไธชๆ–‡ไปถ: - **code**(ๅ•ๅญ—็ฌฆ + ้ขœ่‰ฒ):M(ไฟฎๆ”น)/ A(ๆ–ฐๅขž)/ D(ๅˆ ้™ค)/ R(้‡ๅ‘ฝๅ)/ ??(ๆœช่ทŸ่ธช)/ !(ๅฟฝ็•ฅ)็ญ‰ - **label**(i18n):ใ€Œไฟฎๆ”น / ๆ–ฐๅขž / ๅˆ ้™ค / ้‡ๅ‘ฝๅ / ๆœช่ทŸใ€ - **path**:็›ธๅฏน cwd ็š„่ทฏๅพ„ **็‚นๅ‡ป่กŒ** โ†’ `showGitDiff({ file: path })` โ†’ ๅณๅˆ—ๅˆ‡ๅˆฐ diff ่ง†ๅ›พใ€‚ ## ๅณๅˆ—:history(้ป˜่ฎค) `git log -20 --pretty=format:"%h|%cd|%s|%an"`ใ€‚ๆฏๆก: - **hash** ๅ‰ 7 ไฝ(็ญ‰ๅฎฝๅญ—ไฝ“) - **date**(`%cd`,short format) - **subject**(`%s`,commit message ้ฆ–่กŒ) - **author**(`%an`) **็‚นๅ‡ป่กŒ** โ†’ `showGitDiff({ hash })` โ†’ ๅณๅˆ—ๅˆ‡ๅˆฐ commit showใ€‚ ## ๅณๅˆ—:diff ่ง†ๅ›พ ไธค็งๆธฒๆŸ“ๆ–นๅผ: ### ๆ–‡ไปถ diff(ๅทฆๅณๅฏนๆฏ”) `renderSideBySide`(`src/renderer/app.ts:456`)โ€”โ€” ๆŠŠ unified diff ่งฃๆžๆˆๅฏน้ฝ็š„ใ€Œๅทฆๆ—ง / ๅณๆ–ฐใ€่กŒใ€‚ - ๅŒไธ€ hunk ๅ†…่ฟž็ปญ็š„ `-` ไธŽ `+` ๆŒ‰่กŒ้…ๅฏน(้€ๅฏนๅฏน้ฝ) - ๅคšๅ‡บๆฅ็š„็”จ็ฉบ่กŒๅžซ - ไธๅš token ็บง diff(ๅคŸ็›ด่ง‚,ponytail:ๅŒๆฎตๅญ—็บง diff ็ฎ—ๆณ•ๅฏๅŽ็ปญๅŠ ) ่ง†่ง‰:ๅทฆไพงๅˆ ้™ค่กŒ็บขใ€ๅณไพงๆ–ฐๅขž่กŒ็ปฟใ€ๅ…ฑๅŒ่กŒ็ฐใ€‚ ### commit show(unified) `colorGitDiff`(`src/renderer/app.ts:426`)โ€”โ€” git show ็š„็ปŸไธ€ๆ ผๅผๆŒ‰่กŒ็€่‰ฒใ€‚ - ไปŽ้ฆ–ไธช `diff --git` ่กŒๅผ€ๅง‹ๆ‰็ฎ— diff body(commit message ้‡Œ็š„ `- list ้กน` ไธ่ฏฅ่ขซ่ฏฏๅˆคไธบๅˆ ้™ค่กŒ) - meta(commit metadata + message)ๅ•็‹ฌๆ˜พ็คบ - `+` ็ปฟใ€`-` ็บขใ€`@@` hunk header ่“ใ€`+++`/`---` ๆ–‡ไปถๅ่“ ### ่ฟ”ๅ›ž history diff ่ง†ๅ›พ้กถ้ƒจๆœ‰ **โ† ๅކๅฒ** ๆŒ‰้’ฎ,็‚นๅ›ž history ๅˆ—่กจใ€‚ ## ็‚นๆ–‡ไปถ / ็‚น commit ๅŽ็š„็Šถๆ€ๆœบ `gitState`(`src/renderer/app.ts:36`): ```ts { snapshot?: GitSnapshot; // ๆœ€่ฟ‘ไธ€ๆฌกๆŠ“็š„ๅฟซ็…ง view: { kind: 'history' } // ้ป˜่ฎค | { kind: 'diff'; title: string; contentHTML: string }; lastCwd: string; // ไธŠๆฌกๆŠ“็š„ cwd(ๅˆ‡ไบ†้‡ๆŠ“) } ``` - ๅˆ‡ cwd / ๆ‰‹ๅŠจๅˆทๆ–ฐ โ†’ ้‡็ฝฎ view ๅˆฐ history + ้‡ๆŠ“ snapshot - ็‚นๆ–‡ไปถ / commit โ†’ view ๅˆ‡ๅˆฐ diff,ๅ ไฝๅ…ˆๆธฒๆŸ“ใ€Œโ€ฆใ€+ ๅผ‚ๆญฅๅŠ ่ฝฝ็œŸๅฎž diff ## ๅˆทๆ–ฐ `.git-head` ๅณไพง **โŸณ** ๆŒ‰้’ฎ โ†’ ้‡ๆŠ“ snapshotใ€‚ ๅˆ‡ไผš่ฏ(ไธๅŒ cwd)โ†’ ่‡ชๅŠจ้‡ๆŠ“ใ€‚tab ๅˆ‡่ตฐๅ†ๅˆ‡ๅ›ž โ†’ ็”จๅทฒๆœ‰ snapshot(ไธ้‡ๆŠ“)ใ€‚ ## ้™ๅˆถ - **ๅช่ฏป**:่ฟ™้‡Œไธ่ƒฝ stage / commit / pushใ€‚่ฆๆ“ไฝœ git โ†’ ็”จ่Šๅคฉๆก†่ฎฉ agent ่ฐƒ `shell` ๅทฅๅ…ท,ๆˆ–ๅผ€ Files ็ช—ๅฃ่ตฐ็ณป็ปŸ git GUI - **ไธๆ”ฏๆŒ submodule / worktree ่ง†ๅ›พ**:ๅช็œ‹ๅฝ“ๅ‰ไป“ๅบ“ๆ น - **commit log ๅ›บๅฎš 20 ๆก**:ไธ็œ‹ๅฎŒๆ•ด history(ๆ”น main ่ฟ›็จ‹ `git log -20` ๆ”นๆ•ฐๅญ—) - **diff ไธๆ”ฏๆŒไบŒ่ฟ›ๅˆถ**:ๅ›พ็‰‡ๆ”นใ€้Ÿณ้ข‘ๆ”น็ญ‰ๅชๆ˜พ็คบใ€ŒBinary files differใ€ ## ๅ…ณ้”ฎๆบๆ–‡ไปถ - `src/renderer/app.ts:329` โ€”โ€” `refreshGit` - `src/renderer/app.ts:345` โ€”โ€” `renderGit`(ๅˆ—ๆธฒๆŸ“ + ไบ‹ไปถ็ป‘ๅฎš) - `src/renderer/app.ts:405` โ€”โ€” `showGitDiff` - `src/renderer/app.ts:426` โ€”โ€” `colorGitDiff`(commit show) - `src/renderer/app.ts:456` โ€”โ€” `renderSideBySide`(ๆ–‡ไปถ diff) - `src/main/main.ts` โ€”โ€” `git-snapshot` / `git-diff` IPC handler - `src/renderer/index.html`(ๅ†…่”)โ€”โ€” `#chat-git-pane`