์ผ๋ฐ˜

Git Worktree

๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์ œ๋Œ€๋กœ ์•Œ๋ ค์ง€์ง€ ์•Š์€ Git ๊ธฐ๋Šฅ์œผ๋กœ, ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ์™„์ „ํžˆ ๋ฐ”๊ฟ”๋†“์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค

  • #git
  • #workflow
  • #branch

git worktree๋Š” Git์˜ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋กœ, ๋™์ผํ•œ Git ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐ๋œ ๋ณ„๋„์˜ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜๋ฅผ ๋™์‹œ์— ์ฒดํฌ์•„์›ƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.

์™œ git worktree๋ฅผ ์‚ฌ์šฉํ• ๊นŒ?

์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋А๋ผ ๊ฐ™์€ ์ €์žฅ์†Œ์— ์ปค๋ฐ‹๋˜์ง€ ์•Š์€ ํŒŒ์ผ์ด 1000๊ฐœ ์ด์ƒ ์Œ“์—ฌ ์žˆ๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ ๊ธด๊ธ‰ํ•œ PR ๊ฒ€ํ†  ์š”์ฒญ์„ ๋ฐ›์•„์„œ ๋‹นํ™ฉ์Šค๋Ÿฌ์› ๋˜ ๊ฒฝํ—˜ ์žˆ์œผ์‹ ๊ฐ€์š”? ์•„๋งˆ๋„ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šคํƒœ์‹œ(stash)ํ•˜๊ณ  ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋กœ ์ „ํ™˜ํ•ด์„œ ๊ฒ€ํ† ํ–ˆ์„ ๊ฒ๋‹ˆ๋‹ค. ๋” ๋‚˜์œ ์ƒํ™ฉ์€, ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ PR์—์„œ ๋” ์ด์ƒ ๋ฏธ๋ฃฐ ์ˆ˜ ์—†๋Š” ๊ธด๊ธ‰ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•ด์„œ ๋‹ค์‹œ ๋ธŒ๋žœ์น˜๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์ผ ๊ฒ๋‹ˆ๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ณ  ๋‹ค๋ฃจ๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น์„ ํ”ผํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ๋•Œ๋กœ๋Š” ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ด ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜๋ฅผ ๋™์‹œ์— ์ž‘์—…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. git worktree๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถ”๊ฐ€ ๋ณต์ œ๋ณธ์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ž‘์—… ๋‚ด์šฉ์„ ์ž„์‹œ ์ €์žฅํ•  ํ•„์š” ์—†์ด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ Worktree๋ฅผ ๋งŒ๋“ค๊ธฐ

๋‹ค์Œ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ €์žฅ์†Œ์ธ website๊ฐ€ ํฌํ•จ๋œ repo ๋””๋ ‰ํ† ๋ฆฌ์ž…๋‹ˆ๋‹ค.

repo/
โ””โ”€ website/
   โ””โ”€ index.html

์šฐ๋ฆฌ๋Š” master ๋ธŒ๋žœ์น˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ธ feature-x๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋ช…๋ น

์ด๋Š” ๋ณ„๋„์˜ ๋””๋ ‰ํ† ๋ฆฌ์— ๋งˆ์šดํŠธ๋˜๋Š” Git ์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•จ์œผ๋กœ์จ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด master ๋ธŒ๋žœ์น˜๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. git worktree add ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.

git worktree add ../feature-x-dir feature-x
  • ์ด ๋ช…๋ น์€ ../feature-x-dir์ด๋ผ๋Š” ์ƒˆ ํด๋”๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ํด๋”์—์„œ feature-x ๋ธŒ๋žœ์น˜๋ฅผ ์ฒดํฌ์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ, feature-x ๋ธŒ๋žœ์น˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด Git์—์„œ fatal: invalid reference: feature-x ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

feature-x ๋ธŒ๋žœ์น˜๋ฅผ ์ฆ‰์„์—์„œ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋ธŒ๋žœ์น˜ ์ด๋ฆ„ ์•ž์— -b ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

git worktree add ../feature-x-dir -b feature-x

์ด์ œ ์ด ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

repo/
โ”œโ”€ feature-x-dir/
|  โ””โ”€ index.html
โ””โ”€ website/
   โ””โ”€ index.html

์ด์ œ ์›๋ž˜ ์ €์žฅ์†Œ์—๋Š” master ๋ธŒ๋žœ์น˜๊ฐ€ ์ฒดํฌ์•„์›ƒ๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ feature-x-dir ๋””๋ ‰ํ† ๋ฆฌ์—์„œ feature-x ๋ธŒ๋žœ์น˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…๋ช… ๊ทœ์น™

์ด๋ฆ„ ์ง€์ • ๋ฐฉ์‹์ด ์›๋ž˜ ์ €์žฅ์†Œ์™€ ์ƒ๋‹นํžˆ ๋‹ค๋ฅด๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์„ธ์š”. ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž‘์—… ํŠธ๋ฆฌ์— ๋ช…ํ™•ํ•˜๊ณ  ์„ค๋ช…์ ์ธ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์›ŒํฌํŠธ๋ฆฌ๋“ค์ด ์„œ๋กœ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด <์›๋ณธ ์ €์žฅ์†Œ ์ด๋ฆ„>-<์œ ํ˜•>-<๋ธŒ๋žœ์น˜ ์ด๋ฆ„> ํ˜•์‹์œผ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด website-feat-ImplementNavigation ๋ฐ website-fix-CumulativeLayoutShift์™€ ๊ฐ™์ด ์ด๋ฆ„์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ๋” ๊น”๋”ํ•ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

repo/
โ”œโ”€ website-feat-ImplementNavigation/
|  โ””โ”€ index.html
โ”œโ”€ website-fix-CumulativeLayoutShift/
|  โ””โ”€ index.html
โ””โ”€ website/
   โ””โ”€ index.html

Worktree ๋“ค๋ฅผ ๋‚˜์—ดํ•˜๋‹ค

์ƒ์„ฑ๋œ ๊ฐ ์ž‘์—… ํŠธ๋ฆฌ ๋ชฉ๋ก์€ worktree list ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์˜ˆ์‹œ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค. ์ถœ๋ ฅ์—๋Š” ๋ธŒ๋žœ์น˜ ๊ฒฝ๋กœ, ์ตœ์‹  ์ปค๋ฐ‹ ํ•ด์‹œ, ๊ทธ๋ฆฌ๊ณ  ๋Œ€๊ด„ํ˜ธ ์•ˆ์— ํ‘œ์‹œ๋œ ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์ด ์ˆœ์„œ๋Œ€๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

> git worktree list
D:/repo/website                            f9d49ec [master]
D:/repo/website-feat-ImplementNavigation   f8d48ec [test]
D:/repo/website-fix-CumulativeLayoutShift  f7d47ec [test2]

Worktree๋ฅผ ์‚ญ์ œ

์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜๋ฉด worktree remove ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ํŠธ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘์—… ํŠธ๋ฆฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์„ ํฌํ•จํ•œ ๋ชจ๋“  ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๋ฏ€๋กœ ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ํŠธ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ์ธ์ˆ˜๋กœ ์ œ๊ณตํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฃผ๋ชฉํ•˜๋Š” ๊ฒƒ์„ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋ ค๋ฉด ์ž‘์—… ํŠธ๋ฆฌ๊ฐ€ ๊นจ๋—ํ•œ ์ƒํƒœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ปค๋ฐ‹๋˜๊ฑฐ๋‚˜ ํ๊ธฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€๋ฉด --force ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ทจ์†Œํ•˜๊ณ  ์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

git worktree remove <path>

์˜ˆ๋ฅผ ๋“ค์–ด, ์›๋ž˜ ๋””๋ ‰ํ† ๋ฆฌ website ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

git worktree remove ../website-feat-ImplementNavigation --force

ํ•˜์ง€๋งŒ ์ด ์ž‘์—…์œผ๋กœ ์ž‘์—… ํŠธ๋ฆฌ์™€ ์—ฐ๊ด€๋œ ๋ถ„๊ธฐ๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์š”์•ฝ

๋ช…๋ น์„ค๋ช…
git worktree list๋ชจ๋“  ํ™œ์„ฑ ์ž‘์—… ํŠธ๋ฆฌ ๋‚˜์—ด
git worktree add <path> <branch>์ƒˆ ์ž‘์—… ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ
git worktree remove <path>์ž‘์—… ํŠธ๋ฆฌ ์ œ๊ฑฐ
git worktree prune์˜ค๋ž˜๋˜๊ฑฐ๋‚˜ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž‘์—… ํŠธ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค
git worktree lock์ž‘์—… ํŠธ๋ฆฌ๊ฐ€ ์ •๋ฆฌ๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค

์ด ๋ฉ‹์ง„ ๊ธฐ๋Šฅ์„ ์•Œ๊ฒŒ ๋œ ํ›„๋กœ๋Š” ์ œ๊ฐ€ ์ž‘์—…ํ•˜๋Š” ๋ชจ๋“  ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด ํ•ญ์ƒ ์›ŒํฌํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ 

git-worktree - Manage multiple working trees. Retrieved 2025, November 10 from https://git-scm.com/docs/git-worktree
Git Worktree. Retrieved 2025, November 10 from https://www.gitkraken.com/learn/git/git-worktree
bashbunni. learn git worktrees in under 5 minutes.https://www.youtube.com/watch?v=8vsRb2mTBA8