Skip to main content

Git ๋‹ค์‹œ ์ง€์ • ์ •๋ณด

git rebase ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ์ผ๋ จ์˜ ์ปค๋ฐ‹์„ ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ธฐ๋ก์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•จ๊ป˜ ์ปค๋ฐ‹์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ํŽธ์ง‘ํ•˜๊ฑฐ๋‚˜ ์Šค์ฟผ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ git rebase๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด์ „ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํŽธ์ง‘
  • ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ
  • ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ปค๋ฐ‹ ์‚ญ์ œ ๋˜๋Š” ๋˜๋Œ๋ฆฌ๊ธฐ

๊ฒฝ๊ณ 

์ปค๋ฐ‹ ๊ธฐ๋ก์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฏธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ํ‘ธ์‹œํ•œ ๊ฒฝ์šฐ ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ถ€์ ์ ˆํ•œ ์‚ฌ๋ก€๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•˜๊ฒŒ ๋‹ค์‹œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ๋ณ‘ํ•ฉ ์ •๋ณด์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋ถ„๊ธฐ์— ๋Œ€ํ•œ ์ปค๋ฐ‹ ๋‹ค์‹œ ์ง€์ •

๋‹ค๋ฅธ ๋ถ„๊ธฐ์™€ ํ˜„์žฌ ๋ถ„๊ธฐ ์ƒํƒœ ๊ฐ„์˜ ๋ชจ๋“  ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ง€์ •ํ•˜๋ ค๋ฉด ์…ธ(Windows ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ ๋˜๋Š” Mac ๋ฐ Linux์šฉ ํ„ฐ๋ฏธ๋„)์—์„œ ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

git rebase --interactive OTHER-BRANCH-NAME

ํŠน์ • ์‹œ์ ์— ๋Œ€ํ•œ ์ปค๋ฐ‹ ๋‹ค์‹œ ์ง€์ •

ํ˜„์žฌ ๋ถ„๊ธฐ์—์„œ ๋งˆ์ง€๋ง‰ ๋ช‡ ๊ฐœ์˜ ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ง€์ •ํ•˜๋ ค๋ฉด ์…ธ์— ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

git rebase --interactive HEAD~7

๋‹ค์‹œ ์ง€์ •ํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น

๋‹ค์‹œ ์ง€์ •ํ•˜๋Š” ๋™์•ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 6๊ฐ€์ง€ ๋ช…๋ น์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pick
pick๋Š” ๋‹จ์ˆœํžˆ ์ปค๋ฐ‹์ด ํฌํ•จ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. pick ๋ช…๋ น ์ˆœ์„œ๋ฅผ ๋‹ค์‹œ ์ •๋ ฌํ•˜๋ฉด ๋‹ค์‹œ ์ง€์ • ์ค‘์ผ ๋•Œ ์ปค๋ฐ‹ ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹์„ ํฌํ•จํ•˜์ง€ ์•Š๋„๋ก ์„ ํƒํ•œ ๊ฒฝ์šฐ ์ „์ฒด ์ค„์„ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
reword
reword ๋ช…๋ น์€ pick์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•œ ํ›„์—๋Š” ๋‹ค์‹œ ์ง€์ • ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋˜๋ฏ€๋กœ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹์— ์˜ํ•ด ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
edit
edit๋ฅผ ์ปค๋ฐ‹์œผ๋กœ ์„ ํƒํ•˜๋ฉด ์ปค๋ฐ‹์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ปค๋ฐ‹์„ ์™„์ „ํžˆ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ง€์ •์„ ๊ณ„์†ํ•˜๊ธฐ ์ „์— ๋” ๋งŽ์€ ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํฐ ์ปค๋ฐ‹์„ ๋” ์ž‘์€ ์ปค๋ฐ‹์œผ๋กœ ๋ถ„ํ• ํ•˜๊ฑฐ๋‚˜ ์ปค๋ฐ‹์—์„œ ์ž˜๋ชป๋œ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
squash
์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ปค๋ฐ‹์„ ๋‹จ์ผ ์ปค๋ฐ‹์œผ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹์€ ์œ„์˜ ์ปค๋ฐ‹์— ๋ฐ€์–ด ๋„ฃ์–ด์ง‘๋‹ˆ๋‹ค. Git์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‘ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์„ค๋ช…ํ•˜๋Š” ์ƒˆ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
fixup
์ด๋Š” squash์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๋ณ‘ํ•ฉํ•  ์ปค๋ฐ‹์—์„œ๋Š” ํ•ด๋‹น ๋ฉ”์‹œ์ง€๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ปค๋ฐ‹์€ ๋‹จ์ˆœํžˆ ์œ„์˜ ์ปค๋ฐ‹์— ๋ณ‘ํ•ฉ๋˜๋ฉฐ, ์ด์ „ ์ปค๋ฐ‹์˜ ๋ฉ”์‹œ์ง€๋Š” ๋‘ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ชจ๋‘ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
exec
์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปค๋ฐ‹์— ๋Œ€ํ•ด ์ž„์˜์˜ ์…ธ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

git rebase๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ

์–ด๋–ค ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋“  Git์€ ๊ธฐ๋ณธ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์„ ํƒํ•œ ๋ฒ”์œ„์˜ ์ปค๋ฐ‹์„ ์ž์„ธํžˆ ํ‘œ์‹œํ•˜๋Š” ํŒŒ์ผ์„ ์—ฝ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

pick 1fc6c95 Patch A
pick 6b2481b Patch B
pick dd1475d something I want to split
pick c619268 A fix for Patch B
pick fa39187 something to add to patch A
pick 4ca2acc i cant' typ goods
pick 7b36971 something to move before patch B

# Rebase 41a72e6..7b36971 onto 41a72e6
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

์ด ์ •๋ณด๋ฅผ ์œ„์—์„œ ์•„๋ž˜๋กœ ๋‚˜๋ˆ„๋ฉด ๋‹ค์Œ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • ์‹œ์ž‘์ ๊ณผ ํ˜„์žฌ ๋ถ„๊ธฐ ์ƒํƒœ ์‚ฌ์ด์— 7๊ฐœ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด ์žˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” 7๊ฐœ์˜ ์ปค๋ฐ‹์ด ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ์ง€์ •ํ•˜๋„๋ก ์„ ํƒํ•œ ์ปค๋ฐ‹์€ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ณ€๊ฒฝ ๋‚ด์šฉ(๋งจ ์œ„)๋ถ€ํ„ฐ ์ตœ์‹  ๋ณ€๊ฒฝ ๋‚ด์šฉ(์•„๋ž˜์ชฝ)์˜ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ์ค„์—๋Š” ๋ช…๋ น(๊ธฐ๋ณธ์ ์œผ๋กœ pick), ์ปค๋ฐ‹ SHA ๋ฐ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด git rebase ํ”„๋กœ์‹œ์ €๋Š” ์„ธ ์—ด์˜ ์กฐ์ž‘์„ ์ค‘์‹ฌ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ์€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— _๋‹ค์‹œ ์ง€์ •_๋ฉ๋‹ˆ๋‹ค.
  • ์ปค๋ฐ‹ ํ›„์— Git์€ ์ž‘์—… ์ค‘์ธ ์ปค๋ฐ‹ ๋ฒ”์œ„๋ฅผ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค(41a72e6..7b36971).
  • ๋งˆ์ง€๋ง‰์œผ๋กœ Git์€ ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์„ ์•Œ๋ ค ์ค๋‹ˆ๋‹ค.

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ