Skip to main content

๋ช…๋ น์ค„์—์„œ Git ๋‹ค์‹œ ์ง€์ • ์‚ฌ์šฉ

๋ช…๋ น์ค„์—์„œ git rebase๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ž์Šต์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Git ๋‹ค์‹œ ์ง€์ • ์‚ฌ์šฉ

์ด ์˜ˆ์ œ์—์„œ๋Š” exec๋ฅผ ์ œ์™ธํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  git rebase ๋ช…๋ น์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

ํ„ฐ๋ฏธ๋„์— git rebase --interactive HEAD~7๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋‹ค์‹œ ์ง€์ •์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฆ๊ฒจ ์ฐพ๋Š” ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ์— ๋‹ค์Œ ์ค„์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋‹ค์Œ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • squash๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์„ฏ ๋ฒˆ์งธ ์ปค๋ฐ‹(fa39187)์„ "Patch A" ์ปค๋ฐ‹(1fc6c95)์— ์Šค์ฟผ์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹(7b36971)์„ "Patch B" ์ปค๋ฐ‹(6b2481b) ์œ„๋กœ ์ด๋™ํ•˜๊ณ  pick์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • "A fix for Patch B" ์ปค๋ฐ‹(c619268)์„ "Patch B" ์ปค๋ฐ‹(6b2481b)์— ๋ณ‘ํ•ฉํ•˜๊ณ , fixup์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
  • edit์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ ๋ฒˆ์งธ ์ปค๋ฐ‹(dd1475d)์„ ๋‘ ๊ฐœ์˜ ๋” ์ž‘์€ ์ปค๋ฐ‹์œผ๋กœ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.
  • reword๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ ์ž๊ฐ€ ํ‹€๋ฆฐ ์ปค๋ฐ‹(4ca2acc)์˜ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

ํœด์šฐ! ํ•  ์ผ์ด ๋งŽ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ํ•œ ๋ฒˆ์— ํ•œ ๋‹จ๊ณ„์”ฉ ์ˆ˜ํ–‰ํ•˜๋ฉด ์‰ฝ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋ ค๋ฉด ํŒŒ์ผ์˜ ๋ช…๋ น์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๊ฐ ์ค„์˜ ๋ช…๋ น์„ pick์—์„œ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๋ช…๋ น์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ํŽธ์ง‘๊ธฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋‹ซ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋Œ€ํ™”ํ˜• ๋‹ค์‹œ ์ง€์ •์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

Git์€ ์•„๋ฌด๊ฒƒ๋„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ๋‹ค์‹œ ์ง€์ • ๋ช…๋ น pick 1fc6c95๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ช…๋ น squash fa39187๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์—๋Š” ์ž…๋ ฅ์ด ํ•„์š”ํ•˜๋ฏ€๋กœ Git์—์„œ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๊ฐ€ ๋‹ค์‹œ ์—ด๋ฆฝ๋‹ˆ๋‹ค. ์—ด๋ฆฌ๋Š” ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

# This is a combination of two commits.
# The first commit's message is:

Patch A

# This is the 2nd commit message:

something to add to patch A

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
# modified:   a
#

์ด ํŒŒ์ผ์€ Git์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. โ€œ์ง€๊ธˆ ์ด squash๋กœ ํ•˜๋ ค๋Š” ๊ฒŒ ๋ฐ”๋กœ ์ด๊ฒƒ์ด์—์š”.โ€ ์ฒซ ๋ฒˆ์งธ ์ปค๋ฐ‹์˜ ๋ฉ”์‹œ์ง€("Patch A") ๋ฐ ๋‘ ๋ฒˆ์งธ ์ปค๋ฐ‹์˜ ๋ฉ”์‹œ์ง€("something to add to patch A")๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ๋งŒ์กฑํ•˜๋ฉด ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ํŽธ์ง‘๊ธฐ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์กฑํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŽธ์ง‘๊ธฐ๊ฐ€ ๋‹ซํžˆ๋ฉด ๋‹ค์‹œ ์ง€์ •์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

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

Git์€ ๋‘ pick ๋ช…๋ น(pick 7b36971 ๋ฐ pick 6b2481b)์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ƒํ˜ธ ์ž‘์šฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋˜ํ•œ fixup ๋ช…๋ น(fixup c619268)์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. fixup์€ c619268์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๊ทธ ์ด์ „์˜ ์ปค๋ฐ‹์ธ 6b2481b์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ณ€๊ฒฝ ๋‚ด์šฉ ๋ชจ๋‘ ๋™์ผํ•œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค("Patch B").

Git์€ edit dd1475d ์ž‘์—…์— ๋„๋‹ฌํ•˜๋ฉด ๋ฉˆ์ถ˜ ํ›„ ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

์ด ์‹œ์ ์—์„œ ํ”„๋กœ์ ํŠธ์˜ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜์—ฌ ์ถ”๊ฐ€๋กœ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ ์ปค๋ฐ‹์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ, git commit --amend ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ ์ž‘์—…์„ ๋งˆ์ณค์œผ๋ฉด git rebase --continue๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด Git์ด reword 4ca2acc ๋ช…๋ น์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ๊ฐ€ ํ•œ ๋ฒˆ ๋” ์—ด๋ฆฌ๊ณ  ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

i cant' typ goods

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD^1 <file>..." to unstage)
#
# modified:   a
#

์ด์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Git์€ ํŽธ์ง‘ํ•  ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ("i cant' typ goods"), ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ , ํŽธ์ง‘๊ธฐ๋ฅผ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ง€์ •์ด ์™„๋ฃŒ๋˜๊ณ  ํ„ฐ๋ฏธ๋„๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

๋‹ค์‹œ ์ง€์ •๋œ ์ฝ”๋“œ๋ฅผ GitHub์— ํ‘ธ์‹œ

Git ๊ธฐ๋ก์„ ๋ณ€๊ฒฝํ–ˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์ธ git push origin์€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ โ€œ๊ฐ•์ œ ํ‘ธ์‹œโ€ํ•˜์—ฌ ๋ช…๋ น์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# Don't override changes
$ git push origin main --force-with-lease

# Override changes
$ git push origin main --force

๊ฒฝ๊ณ 

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

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