โ† ๋ชฉ๋ก์œผ๋กœ
Git commit strategy

Git์œผ๋กœ ํ˜‘์—…ํ•˜๋ฉด์„œ ๋“ค์—ˆ๋˜ ์ƒ๊ฐ๋“ค์„ ํ•œ๋ฒˆ ์ •๋ฆฌ ํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋˜๋„๋ก Rebase

์ด๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ์˜๊ฒฌ์ด ๊ฐ€๋ฆฌ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. git rebase ์„ค์ •์„ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด
๊ฐ„ํ˜น ์ž‘์—…๋ฌผ์„ ๋‚ ๋ฆด์ˆ˜๋„ ์žˆ๊ณ , ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ merge๋Š” git graph๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์–ด Git ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
Git์„ ์‚ฌ์šฉํ•˜๋Š” ๋ชฉ์ ์€ ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋˜๋„๋ก rebase๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

์ปค๋ฐ‹์˜ ๋‹จ์œ„์™€ ์˜๋ฏธ

์ผ์ •์ด ๋น ๋“ฏํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ๊ฐ™์€ ๋‚ด์šฉ์˜ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์œผ๋กœ ๋‚˜๋ˆŒ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•œ ์‚ฌ์ดํด ๋‚ด์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ž‘์—…์ด๋ผ๋ฉด ๋˜๋„๋ก ์ž‘์—… ๋‚ด์šฉ๊ณผ ์ปค๋ฐ‹์ด 1๋Œ€1๋กœ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ์ด ๊ทœ์น™๋Œ€๋กœ ์ปค๋ฐ‹์„ ํ•˜๋‹ค๋ณด๋ฉด ์ž์—ฐ์Šค๋ ˆ ๊ฐ๊ฐ์˜ ์ปค๋ฐ‹์€ ์˜๋ฏธ๋ฅผ ์ง€๋‹ˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋จผ์ € ์ž‘์—… ๋‚ด์šฉ์„ ๊ณ„ํšํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์ž‘์—…์ด ์ปค๋ฐ‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์ž‘์—… ๋‹จ์œ„๋กœ ์ปค๋ฐ‹์„ ํ•˜์˜€๋Š”๋ฐ ์ด์ „์˜ ์ž‘์—… ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์Šคํƒ ๋ธŒ๋žœ์น˜

Stacked PR ๋˜๋Š” Stacked branch ๋ผ๋Š” ๊ฐœ๋…์€ ๋“ค์–ด๋ณด์…จ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ ๋ธŒ๋žœ์น˜๋กœ ๋‚˜๋ˆ„๋˜ ์ด์ „ ์ž‘์—… ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์ž‘์—… ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“œ๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค.

์ด ์ „๋žต์€ ์ด์ „ ์ž‘์—… ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๋‹ค๋ฅธ ์ž‘์—… ๋ธŒ๋žœ์น˜๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ rebase ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด ์ „๋žต์„ ์“ฐ๊ณ ์ž ํ•œ๋‹ค๋ฉด Graphite๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” gt cli๋ฅผ ํ†ตํ•ด ์Šคํƒ ๋ธŒ๋žœ์น˜๋“ค์„ ์†์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ํŠน์ • ์ž‘์—… ๋ธŒ๋žœ์น˜๊ฐ€ ๋ณ€๊ฒฝ์ด ์ƒ๊ธฐ๋ฉด
์ž๋™์œผ๋กœ ๊ทธ์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ž‘์—… ๋ธŒ๋žœ์น˜๋“ค์„ rebase ํ•ฉ๋‹ˆ๋‹ค.
๋‹ค๋งŒ gt cli์˜ ๋ช…๋ น์–ด๋“ค์„ ์ตํ˜€์•ผํ•˜๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

GitButler

GitButler์€ ์ƒˆ๋กœ์šด ์ „๋žต์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค.
ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ž‘์—…์„ ๋™์‹œ์— ์ง„ํ–‰ํ•˜๊ณ  ๊ฐ ์ž‘์—… ๋‚ด์šฉ์„ ๊ฐ€์ƒ ๋ธŒ๋žœ์น˜๋ผ๋Š” ๊ณณ์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐ๊ฐ์˜ ๊ฐ€์ƒ ๋ธŒ๋žœ์น˜๋Š” ์ถ”ํ›„ ์‹ค์ œ ๋ธŒ๋žœ์น˜๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋งŒ๋“ค์–ด์ง„์ง€ ์–ผ๋งˆ๋˜์ง€ ์•Š์•„ ์•„์ง ๋ฒ„๊ทธ๊ฐ€ ๋งŽ์ด ์กด์žฌํ•˜์ง€๋งŒ
๋„๊ตฌ๊ฐ€ ์ข€ ๋” ์„ฑ์ˆ™ํ•ด ์ง„๋‹ค๋ฉด GitButler๋ฅผ ์ด์šฉํ•ด ์ž‘์—…ํ•ด ๋ณผ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

Git

์ˆœ์ˆ˜ํ•˜๊ฒŒ Git์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰์‹œ --fixup ์ด๋ผ๋Š” ์˜ต์…˜์„ ํ†ตํ•ด ํŠน์ • ์ปค๋ฐ‹์— ์—ฐ๊ฒฐ ํ•  ์ˆ˜ ์žˆ๊ณ 
rebase๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ปค๋ฐ‹์ด ํ•ฉ์ณ์งˆ ์ˆ˜ ์žˆ๊ฒŒํ•˜์—ฌ ์ž‘์—…๊ณผ ์ปค๋ฐ‹์ด 1๋Œ€1์ด ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ํŠน์ • ์ปค๋ฐ‹๊ณผ ํ•ด๋‹น ์ปค๋ฐ‹์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€ ์•ž์— fixup! ๋ฌธ์ž์—ด์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.
git commit -a -m 'change comment' --fixup=<์ด์ „ ์ฃผ์„์„ ๋ณ€๊ฒฝํ•œ ์ปค๋ฐ‹ ํ•ด์‹œ>

# autosquash ์˜ต์…˜์€ rebase ์‹œ์— fixup! ์ด๋ผ๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ์กด์žฌํ•˜๋Š” ์ปค๋ฐ‹์„ ์—ฐ๊ฒฐ๋œ ์ปค๋ฐ‹๊ณผ ์ž๋™์œผ๋กœ ํ•ฉ์นฉ๋‹ˆ๋‹ค.
git rebase --autosquash <base ์ปค๋ฐ‹ ํ•ด์‹œ>