Git worktree๋Š” ํ•˜๋‚˜์˜ Git ์ €์žฅ์†Œ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์—… ํŠธ๋ฆฌ(working tree)๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋žœ์น˜ ์ „ํ™˜ ์—†์ด ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜์—์„œ ๋™์‹œ์— ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ๋Š” ๋‹ค์Œ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Main worktree: git init ๋˜๋Š” git clone์œผ๋กœ ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ์ž‘์—… ํŠธ๋ฆฌ (์ €์žฅ์†Œ๋‹น 1๊ฐœ)
  • Linked worktrees: git worktree add๋กœ ์ƒ์„ฑ๋œ ์ถ”๊ฐ€ ์ž‘์—… ํŠธ๋ฆฌ (์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ)

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • ๊ธด๊ธ‰ ์ˆ˜์ • ์‹œ ์ž‘์—… ๋ณด์กด: ๋ฆฌํŒฉํ† ๋ง ์ค‘ ๊ธด๊ธ‰ ๋ฒ„๊ทธ ์ˆ˜์ •์ด ํ•„์š”ํ•  ๋•Œ, stash ์—†์ด ๋ณ„๋„ worktree์—์„œ ์ž‘์—…
  • ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ: ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋ฉฐ ๊ฐ๊ฐ ๋…๋ฆฝ๋œ ์ž‘์—… ๊ณต๊ฐ„ ์œ ์ง€
  • ๋ธŒ๋žœ์น˜ ๋น„๊ต ํ…Œ์ŠคํŠธ: ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜๋ฅผ ๋™์‹œ์— ์ฒดํฌ์•„์›ƒํ•˜์—ฌ side-by-side ๋น„๊ต ๋ฐ ํ…Œ์ŠคํŠธ
  • ์‹คํ—˜์  ๋ณ€๊ฒฝ: ๋ฉ”์ธ ์ž‘์—…์— ์˜ํ–ฅ ์—†์ด โ€œ์ผํšŒ์šฉโ€ worktree์—์„œ ์‹คํ—˜

AS-IS

๋ธŒ๋žœ์น˜ ์ „ํ™˜ ๋ฐฉ์‹์—์„œ๋Š” ๊ธด๊ธ‰ ์ˆ˜์ •์„ ์œ„ํ•ด ํ˜„์žฌ ์ž‘์—…์„ stashํ•˜๊ฑฐ๋‚˜ ์ปค๋ฐ‹ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

sequenceDiagram
    autonumber
    participant Dev
    participant Git
    participant Boss

    Dev->>Git: refactoring ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—… ์ค‘
    Note over Dev: ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ ์ค‘ (๋ฏธ์™„์„ฑ)
    Boss->>Dev: ๊ธด๊ธ‰ ๋ฒ„๊ทธ ์ˆ˜์ • ํ•„์š”! (main ๋ธŒ๋žœ์น˜)
    Dev->>Git: git stash (์ž‘์—… ์ž„์‹œ ์ €์žฅ)
    Dev->>Git: git checkout main
    Dev->>Git: ๋ฒ„๊ทธ ์ˆ˜์ • ํ›„ ์ปค๋ฐ‹
    Dev->>Git: git checkout refactoring
    Dev->>Git: git stash pop (์ž‘์—… ๋ณต์›)
    Note over Dev: ์ถฉ๋Œ ํ•ด๊ฒฐ ํ•„์š”ํ•  ์ˆ˜๋„...

TO-BE

Worktree๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ์ž‘์—…์„ ์œ ์ง€ํ•œ ์ฑ„ ๋ณ„๋„ ๊ณต๊ฐ„์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

sequenceDiagram
    autonumber
    participant Dev
    participant Main at /project
    participant Temp at /temp (hotfix ๋ธŒ๋žœ์น˜)
    participant GitHub
    participant Boss

    Dev->>Main: refactoring ๋ธŒ๋žœ์น˜์—์„œ ์ž‘์—… ์ค‘
    Note over Dev: ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง ์ง„ํ–‰ ์ค‘ (๋ฏธ์™„์„ฑ)
    Boss->>Dev: ๊ธด๊ธ‰ ๋ฒ„๊ทธ ์ˆ˜์ • ํ•„์š”!

    Dev->>Temp: git worktree add -b hotfix ../temp main
    Note over Temp: main ๊ธฐ๋ฐ˜์œผ๋กœ hotfix ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

    Dev->>Temp: cd ../temp
    Dev->>Temp: ๋ฒ„๊ทธ ์ˆ˜์ • ์ž‘์—…
    Dev->>Temp: git commit -m "fix: critical bug"
    Note over Temp: hotfix ๋ธŒ๋žœ์น˜์— ์ปค๋ฐ‹ (main ์•„๋‹˜!)

    Dev->>GitHub: git push origin hotfix
    Dev->>GitHub: PR ์ƒ์„ฑ (hotfix -> main)
    Note over GitHub: ์ฝ”๋“œ ๋ฆฌ๋ทฐ & ๋จธ์ง€

    Dev->>Temp: git worktree remove ../temp
    Dev->>Main: cd /project (refactoring ์ž‘์—… ๊ณ„์†)
    Note over Main: ์ž‘์—… ๋‚ด์šฉ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ

Worktrees vs Branches ๋น„๊ต

์ธก๋ฉดBranchesWorktrees
์ฒดํฌ์•„์›ƒ ์ƒํƒœWorktree๋‹น ํ•˜๋‚˜์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜ ๋™์‹œ ์ฒดํฌ์•„์›ƒ
์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋‹จ์ผ ๋””๋ ‰ํ† ๋ฆฌ์—ฌ๋Ÿฌ ๋””๋ ‰ํ† ๋ฆฌ
์šฉ๋„์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ ๊ตฌ์„ฑ๋ณ‘๋ ฌ ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ
์ „ํ™˜ ๋น„์šฉ๋น ๋ฆ„ (ํฌ์ธํ„ฐ๋งŒ ์—…๋ฐ์ดํŠธ)๋””๋ ‰ํ† ๋ฆฌ ์ด๋™ ํ•„์š”
๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ์ตœ์†Œ๋” ๋งŽ์€ ๋””์Šคํฌ ๊ณต๊ฐ„
๋ณต์žก๋„๋‹จ์ˆœ๋” ๊ณ ๊ธ‰
Stash ํ•„์š”์ž์ฃผ ํ•„์š”๋ถˆํ•„์š”

Worktrees๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

โœ… ๋ฆฌํŒฉํ† ๋ง ์ค‘ ๊ธด๊ธ‰ ์ˆ˜์ •

git worktree add -b emergency-fix ../temp master
cd ../temp
# ๋ฒ„๊ทธ ์ˆ˜์ •
git commit -a -m 'emergency fix'
cd -
git worktree remove ../temp

โœ… ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜ ๋™์‹œ ํ…Œ์ŠคํŠธ

git worktree add ../test-v1.0 v1.0
git worktree add ../test-v2.0 v2.0
# ๋ธŒ๋žœ์น˜ ์ „ํ™˜ ์—†์ด ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ

โœ… ๋ณต์žกํ•œ ์‹คํ—˜

git worktree add -d ../experiment
# ๋ฉ”์ธ ์ž‘์—…์— ์˜ํ–ฅ ์—†์ด ์‹คํ—˜

Branches๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ

โœ… ์ฝ”๋“œ ํžˆ์Šคํ† ๋ฆฌ ๊ตฌ์„ฑ

  • ๋ธŒ๋žœ์น˜๋Š” ๊ฐœ๋ฐœ ํƒ€์ž„๋ผ์ธ์„ ๋‚˜ํƒ€๋ƒ„

โœ… ๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ ์ „ํ™˜

  • git checkout์œผ๋กœ ๋น ๋ฅธ ๋ธŒ๋žœ์น˜ ์ „ํ™˜
  • ์ ์€ ๋ฆฌ์†Œ์Šค ์˜ค๋ฒ„ํ—ค๋“œ

โœ… ์ผ๋ฐ˜์ ์ธ Git ์›Œํฌํ”Œ๋กœ์šฐ

  • ๋Œ€๋ถ€๋ถ„์˜ ํ‘œ์ค€ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ๋‹จ์ผ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ •

์ฃผ์š” ์›Œํฌํ”Œ๋กœ์šฐ ์‹œ๋‚˜๋ฆฌ์˜ค

์‹œ๋‚˜๋ฆฌ์˜ค 1: ๋ฆฌํŒฉํ† ๋ง ์ค‘ ๊ธด๊ธ‰ ์ˆ˜์ •

sequenceDiagram
    autonumber
    participant Dev
    participant Main as /project (refactoring)
    participant Temp as /temp (emergency-fix)
    participant GitHub

    Note over Main: refactoring ๋ธŒ๋žœ์น˜ ์ž‘์—… ์ค‘
    Dev->>Temp: git worktree add -b emergency-fix ../temp master
    Note over Temp: master ๊ธฐ๋ฐ˜ ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ

    Dev->>Temp: cd ../temp
    Dev->>Temp: ๋ฒ„๊ทธ ์ˆ˜์ • & ์ปค๋ฐ‹
    Dev->>GitHub: git push origin emergency-fix
    Dev->>GitHub: PR ์ƒ์„ฑ ๋ฐ ๋จธ์ง€

    Dev->>Main: cd /project
    Dev->>Temp: git worktree remove ../temp
    Note over Main: refactoring ์ž‘์—… ๊ณ„์† (์˜ํ–ฅ ์—†์Œ)

์‹œ๋‚˜๋ฆฌ์˜ค 2: ๋ณ‘๋ ฌ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ

flowchart TD
    A["Main Worktree
    /project
    (master)"] --> B[git worktree add ../feature-a]
    A --> C[git worktree add ../feature-b]
    A --> D[git worktree add -d ../testing]

    B --> E["Worktree A
    /feature-a
    (feature-branch-a)"]
    C --> F["Worktree B
    /feature-b
    (feature-branch-b)"]
    D --> G["Worktree C
    /testing
    (detached HEAD)"]

    E --> H[ํŒ€์› A ์ž‘์—…]
    F --> I[ํŒ€์› B ์ž‘์—…]
    G --> J[ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ]

    H --> K[git push & PR]
    I --> L[git push & PR]
    J --> M[ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ํ™•์ธ]

    K --> N[main์œผ๋กœ ๋จธ์ง€]
    L --> N

์‹œ๋‚˜๋ฆฌ์˜ค 3: ํœด๋Œ€์šฉ ์žฅ์น˜ ์„ค์ •

sequenceDiagram
    autonumber
    participant Dev
    participant Main at /project
    participant USB at /media/usb/project
    participant Git

    Dev->>USB: git worktree add --lock /media/usb/project
    Note over USB: --lock์œผ๋กœ ์‹ค์ˆ˜ ์‚ญ์ œ ๋ฐฉ์ง€

    Dev->>Git: git worktree list -v
    Note over Git: /project [master]<br/>/media/usb/project (feature) locked

    Note over Dev: USB ์žฅ์น˜ ์–ธ๋งˆ์šดํŠธ
    Note over USB: ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์—ฐ๊ฒฐ ํ•ด์ œ

    Note over Dev: USB ์žฅ์น˜ ์žฌ๋งˆ์šดํŠธ
    Dev->>USB: cd /media/usb/project
    Dev->>USB: git status
    Note over USB: ์ •์ƒ ์ž‘๋™!

    Dev->>USB: ์ž‘์—… ์™„๋ฃŒ
    Dev->>Git: git worktree unlock /media/usb/project
    Dev->>Git: git worktree remove /media/usb/project

์‹œ๋‚˜๋ฆฌ์˜ค 4: ๋จธ์ง€ ์ „ ํ…Œ์ŠคํŠธ

sequenceDiagram
    autonumber
    participant Dev
    participant Main as /project (main)
    participant Test as /testing (test-feature)
    participant CI

    Note over Main: feature-branch ๊ฐœ๋ฐœ ์™„๋ฃŒ

    Dev->>Test: git worktree add -b test-feature ../testing feature-branch
    Note over Test: feature-branch ๋ณต์‚ฌ๋ณธ ์ƒ์„ฑ

    Dev->>Test: cd ../testing
    Dev->>Test: npm test
    Dev->>Test: python -m pytest
    Note over Test: ์ „์ฒด ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ ์‹คํ–‰

    alt ํ…Œ์ŠคํŠธ ํ†ต๊ณผ
        Dev->>CI: ํ…Œ์ŠคํŠธ ์„ฑ๊ณต ํ™•์ธ
        Dev->>Main: git worktree remove ../testing
        Dev->>Main: git checkout main
        Dev->>Main: git merge feature-branch
        Note over Main: ๋จธ์ง€ ์ง„ํ–‰
    else ํ…Œ์ŠคํŠธ ์‹คํŒจ
        Dev->>CI: ํ…Œ์ŠคํŠธ ์‹คํŒจ ํ™•์ธ
        Dev->>Main: git worktree remove -f ../testing
        Dev->>Main: feature-branch์—์„œ ์ด์Šˆ ์ˆ˜์ •
        Note over Main: ๋‹ค์‹œ ํ…Œ์ŠคํŠธ ๋ฐ˜๋ณต
    end

Worktree ํƒ€์ž…

Main worktree

  • git init ๋˜๋Š” git clone์œผ๋กœ ์ƒ์„ฑ
  • ์ €์žฅ์†Œ๋‹น ํ•˜๋‚˜๋งŒ ์กด์žฌ
  • ์‚ญ์ œ ๋ถˆ๊ฐ€๋Šฅ
  • .git/ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์‹ค์ œ Git ์ €์žฅ์†Œ

Linked worktrees

  • git worktree add๋กœ ์ƒ์„ฑ
  • ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ ๊ฐ€๋Šฅ
  • ์‚ญ์ œ ๊ฐ€๋Šฅ
  • .git ํŒŒ์ผ์ด main worktree์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ด

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ:

/path/main/                          # Main worktree
โ”œโ”€โ”€ .git/                            # ์‹ค์ œ Git ์ €์žฅ์†Œ
โ”‚   โ”œโ”€โ”€ worktrees/                   # Linked worktrees ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
โ”‚   โ”‚   โ””โ”€โ”€ hotfix/                  # Linked worktree 1
โ”‚   โ”‚       โ”œโ”€โ”€ HEAD                 # Per-worktree
โ”‚   โ”‚       โ”œโ”€โ”€ index                # Per-worktree
โ”‚   โ”‚       โ””โ”€โ”€ gitdir               # ์œ„์น˜ ํฌ์ธํ„ฐ
โ”‚   โ”œโ”€โ”€ refs/heads/                  # ๊ณต์œ  (๋ชจ๋“  worktree)
โ”‚   โ””โ”€โ”€ objects/                     # ๊ณต์œ  (๋ชจ๋“  worktree)
โ””โ”€โ”€ source-files/

/path/other/hotfix/                  # Linked worktree
โ”œโ”€โ”€ .git                             # ํŒŒ์ผ (๋””๋ ‰ํ† ๋ฆฌ ์•„๋‹˜!)
โ”‚   ๋‚ด์šฉ: gitdir: /path/main/.git/worktrees/hotfix
โ””โ”€โ”€ source-files/

๊ณต์œ  vs Per-worktree ์ปดํฌ๋„ŒํŠธ

์ปดํฌ๋„ŒํŠธ๊ณต์œ  ์—ฌ๋ถ€
HEADPer-worktree (๊ฐ worktree๋งˆ๋‹ค ๋‹ค๋ฆ„)
index (staging area)Per-worktree
refs/heads/* (๋ธŒ๋žœ์น˜)๊ณต์œ  (๋ชจ๋“  worktree)
refs/tags/* (ํƒœ๊ทธ)๊ณต์œ 
objects/ (์ปค๋ฐ‹ ๋ฐ์ดํ„ฐ)๊ณต์œ 

์ฃผ์š” ๋ช…๋ น์–ด

add - ์ƒˆ worktree ์ƒ์„ฑ

๊ธฐ๋ณธ ์‚ฌ์šฉ:

git worktree add <path> [<commit-ish>]

์˜ˆ์‹œ:

# ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ๋ธŒ๋žœ์น˜๋ช… ์ž๋™ ์ƒ์„ฑ
git worktree add ../hotfix
# "hotfix" ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ../hotfix์— ์ฒดํฌ์•„์›ƒ
 
# ๊ธฐ์กด ๋ธŒ๋žœ์น˜ ์ฒดํฌ์•„์›ƒ
git worktree add ../new-feature feature-branch
 
# ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑํ•˜๋ฉฐ worktree ์ถ”๊ฐ€
git worktree add -b new-branch ../path main
 
# Detached HEAD (๋ธŒ๋žœ์น˜ ์—†์Œ)
git worktree add -d ../experimental
 
# ์ž ๊ธˆ๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ (์‹ค์ˆ˜๋กœ ์‚ญ์ œ ๋ฐฉ์ง€)
git worktree add --lock ../mounted-device

์ฃผ์š” ์˜ต์…˜:

  • -b <new-branch>: ์ƒˆ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
  • -B <new-branch>: ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ/๋ฆฌ์…‹
  • -d, --detach: Detached HEAD ์ƒํƒœ
  • --lock: ์ƒ์„ฑ ํ›„ ์ž ๊ธˆ
  • --no-checkout: ์ฒดํฌ์•„์›ƒ ์ƒ๋žต

list - ๋ชจ๋“  worktree ์กฐํšŒ

git worktree list

์ถœ๋ ฅ ์˜ˆ์‹œ:

/path/to/main              abcd1234 [master]
/path/to/linked-worktree   1234abc  [feature-a]
/path/to/other             5678def  (detached HEAD)

์˜ต์…˜:

git worktree list -v              # ์ƒ์„ธ ์ •๋ณด (์ž ๊ธˆ ์ด์œ  ๋“ฑ)
git worktree list --porcelain     # ๊ธฐ๊ณ„ ํŒ๋… ๊ฐ€๋Šฅ ํ˜•์‹

remove - worktree ์‚ญ์ œ

git worktree remove <worktree>

์˜ˆ์‹œ:

# ๊นจ๋—ํ•œ worktree ์‚ญ์ œ
git worktree remove ../hotfix
 
# ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ์–ด๋„ ๊ฐ•์ œ ์‚ญ์ œ
git worktree remove -f ../dirty-worktree
 
# ์ž ๊ธด worktree ๊ฐ•์ œ ์‚ญ์ œ
git worktree remove -ff ../locked-worktree

prune - ์˜ค๋ž˜๋œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ •๋ฆฌ

# ์˜ค๋ž˜๋œ ๊ด€๋ฆฌ ํŒŒ์ผ ์ œ๊ฑฐ
git worktree prune
 
# Dry run (์‚ญ์ œ๋  ํ•ญ๋ชฉ ํ™•์ธ)
git worktree prune -n
 
# ํŠน์ • ์‹œ๊ฐ„ ์ด์ „ ํ•ญ๋ชฉ๋งŒ ์ œ๊ฑฐ
git worktree prune --expire=2.weeks.ago

lock / unlock - ์‹ค์ˆ˜ ์‚ญ์ œ ๋ฐฉ์ง€

# Worktree ์ž ๊ธˆ (์˜ˆ: ํœด๋Œ€์šฉ ์žฅ์น˜)
git worktree lock ../portable-worktree
git worktree lock --reason "USB ๋“œ๋ผ์ด๋ธŒ" ../usb-drive
 
# Worktree ์ž ๊ธˆ ํ•ด์ œ
git worktree unlock ../portable-worktree

move - worktree ์œ„์น˜ ๋ณ€๊ฒฝ

git worktree move <worktree> <new-path>

repair - ๊นจ์ง„ worktree ๋งํฌ ๋ณต๊ตฌ

# Worktree ์—ฐ๊ฒฐ ๋ณต๊ตฌ
git worktree repair
 
# ์ˆ˜๋™์œผ๋กœ ์ด๋™ํ•œ ํ›„ ํŠน์ • worktree ๋ณต๊ตฌ
git worktree repair /path/to/worktree1

์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค:

  • Main worktree๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ
  • git worktree move ์—†์ด linked worktree ์ด๋™
  • ์†์ƒ๋˜๊ฑฐ๋‚˜ ์˜ค๋ž˜๋œ ๊ด€๋ฆฌ ํŒŒ์ผ

์„ค์ •

worktree.guessRemote

# ์›๊ฒฉ ๋ธŒ๋žœ์น˜ ์ž๋™ ๋งค์นญ ํ™œ์„ฑํ™”
$ git config worktree.guessRemote true
 
# ์ด์ œ ๋‹ค์Œ์ด ์ž‘๋™:
$ git worktree add ../feature-x
# ์กด์žฌํ•˜๋ฉด remote/origin/feature-x ์ž๋™ ๋งค์นญ

worktree.useRelativePaths

# ์ด์‹์„ฑ์„ ์œ„ํ•ด ์ƒ๋Œ€ ๊ฒฝ๋กœ ์‚ฌ์šฉ
$ git config worktree.useRelativePaths true
 
# ์ €์žฅ์†Œ์™€ worktree๊ฐ€ ์œ„์น˜ ๊ฐ„ ์ด๋™ํ•  ๋•Œ ์œ ์šฉ

Worktree๋ณ„ ์„ค์ •

# Per-worktree config ํ™œ์„ฑํ™”
$ git config extensions.worktreeConfig true
 
# Worktree๋ณ„ ์„ค์ •: .git/config.worktree
$ git config --worktree core.sparseCheckout true

์ฃผ์˜์‚ฌํ•ญ

์ œํ•œ์‚ฌํ•ญ

โš ๏ธ Main worktree๋Š” ์‚ญ์ œ ๋ถˆ๊ฐ€๋Šฅ โš ๏ธ Submodule์ด ์žˆ๋Š” worktree๋Š” git worktree move๋กœ ์ด๋™ ๋ถˆ๊ฐ€ โš ๏ธ Multiple checkout ์ง€์›์€ ์•„์ง ์‹คํ—˜์  ๊ธฐ๋Šฅ โš ๏ธ Submodule ์ง€์›์ด ๋ถˆ์™„์ „

Best Practices

โœ… ์ˆ˜๋™ ์‚ญ์ œ ๋Œ€์‹  ํ•ญ์ƒ git worktree remove ์‚ฌ์šฉ โœ… ํœด๋Œ€์šฉ ์žฅ์น˜์˜ worktree๋Š” ์ž ๊ธˆ ์„ค์ • โœ… ์ˆ˜๋™ ์ด๋™ ํ›„ git worktree repair ์‚ฌ์šฉ โœ… Worktree๋ณ„ ์„ค์ •์ด ํฌ๊ฒŒ ๋‹ค๋ฅด๋ฉด extensions.worktreeConfig ํ™œ์„ฑํ™”

์ฐธ๊ณ  ๋ฌธ์„œ