[Git] ๐Ÿšซnon-fast-forward (cherry-pick)

๋‹ค์—ฐยท2024๋…„ 7์›” 29์ผ

Git์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๊ฐ€๋” ์˜ค๋ฅ˜๋ฅผ ๋งˆ์ฃผํ•˜๊ณค ํ•˜๋Š”๋ฐ์š”, ์—ญ์‹œ๋‚˜ ํ˜ผ์ž ํ•ด๊ฒฐ๋ชปํ–ˆ์ง€๋งŒ๐Ÿฅฒ ์ด๋ฒˆ์—๋Š” ๋Œ์ด์ผœ๋ณด๋ฉฐ ๋ญ๊ฐ€ ๋ฌธ์  ์ง€ ์•Œ์•„๋ฒ„๋ ค์•ผ๊ฒ ๋‹ค๋Š” ์ง‘๋…์œผ๋กœ ์ž‘์„ฑํ•œ! ์ œ๊ฐ€ ๋งˆ์ฃผํ•œ ์˜ค๋ฅ˜๊ณผ ์›์ธ, ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค. :)

๐Ÿ’ฃ ๋ฌธ์ œ ๋ฐœ์ƒ

์ƒํ™ฉ์€ ์ด๋Ÿฌํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ตฌ๋งˆ์™€ ๊ฐ์ž๊ฐ€ ํ•จ๊ป˜ ์ž‘์—…์ค‘์ž…๋‹ˆ๋‹ค.
1. ๊ณ ๊ตฌ๋งˆ Push
2. ๊ฐ์ž MR (๋ฉ”์ธ๋ธŒ๋Ÿฐ์น˜์™€ ๋ณ‘ํ•ฉ ์ „)
3. ๊ฐ์ž์˜ Merged ํ›„, ๊ณ ๊ตฌ๋งˆ๋Š” pull > rebase > ์ถฉ๋Œํ•ด๊ฒฐ > push
4. ์˜ค๋ฅ˜ ๋ฐœ์ƒ

! [rejected]        <branch-name> -> <branch-name> (non-fast-forward)
error: failed to push some refs to '...'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

๐Ÿ” ๋ฌธ์ œ ์›์ธ

์ง„์ •ํ•˜๊ณ  ์›์ธ์„ ์•Œ์•„๋ด…์‹œ๋‹ค. rebase์˜ ํŠน์ง•๊ณผ merge์™€์˜ ์ฐจ์ด๋ฅผ ์ฐพ์•„๋ด…๋‹ˆ๋‹ค.

Rebase์™€ Merge์˜ ์ฐจ์ด

๋‹ค์Œ๊ณผ ๊ฐ™์€ commit ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ๋น„๊ตํ•ด๋ด…์‹œ๋‹ค.
feature ๋ธŒ๋žœ์น˜์—์„œ master ๋ธŒ๋žœ์น˜๋กœ rebase/merge๋ฅผ ์‹คํ–‰ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

A - B - C (master)
     \
      D - E - F (feature)

๋ฆฌ๋ฒ ์ด์Šค(Rebase)

A - B - C - D' - E' - F' (feature)
  • ํ•œ ๋ธŒ๋Ÿฐ์น˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ์œ„๋กœ ์žฌ์ ์šฉํ•˜๋ฉด์„œ ์ปค๋ฐ‹ ID๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. (D, E, F > D', E', F')
  • ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๊น”๋”ํ•ด์ง€์ง€๋งŒ, ์ด๋ฏธ ํ‘ธ์‹œ๋œ ์ปค๋ฐ‹์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ•์ œ ํ‘ธ์‹œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ(Merge)

A - B - C - M (master)
      \    / 
       D - E - F (feature)
  • ๋‘ ๋ธŒ๋Ÿฐ์น˜ ํ•ฉ์น  ๋•Œ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ†ตํ•ฉํ•ฉ๋‹ˆ๋‹ค. (๊ธฐ์กด์— ์—†๋˜ M ์ปค๋ฐ‹ ์ƒ์„ฑ)
  • ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋ถ„๊ธฐ๋œ ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค.

๊ณ ๊ตฌ๋งˆ๊ฐ€ ๋ฆฌ๋ฒ ์ด์Šค๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ

  1. ๊ณ ๊ตฌ๋งˆ์˜ rebase ์‚ฌ์šฉ์œผ๋กœ, ๊ณ ๊ตฌ๋งˆ์˜ ์ปค๋ฐ‹๋“ค์ด ๋ฉ”์ธ๋ธŒ๋Ÿฐ์น˜์—์„œ ์žฌ์ž‘์„ฑ๋˜์–ด ๊ธฐ์กด ์ปค๋ฐ‹ ID๊ฐ€ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
  2. ์›๊ฒฉ์ €์žฅ์†Œ์— ๊ณ ๊ตฌ๋งˆ๊ฐ€ ์ด์ „์— pushํ•œ ์ปค๋ฐ‹ ID์™€ rebaseํ•œ ์ดํ›„ ์ปค๋ฐ‹ ID๊ฐ€ ๋ถˆ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  3. ํžˆ์Šคํ† ๋ฆฌ ๋ถˆ์ผ์น˜๋กœ "non-fast-forward" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    : ์›๊ฒฉ ๋ธŒ๋Ÿฐ์น˜์˜ ์ปค๋ฐ‹์ด ๋กœ์ปฌ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹๊ณผ ์ถฉ๋Œํ•œ๋‹ค๋Š” ์˜๋ฏธ

Rebase๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ทธ๋Ÿฐ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค...!!!!!!(๊ทธ๋Ÿด์ค„์•Œ์•˜๋‹ค)๐Ÿคฆ๐Ÿปโ€โ™€๏ธ


๐Ÿ’ก ๋ฌธ์ œ ํ•ด๊ฒฐ!

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. Force Push

๋กœ์ปฌ ๋ธŒ๋Ÿฐ์น˜์˜ ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์›๊ฒฉ ๋ธŒ๋žœ์น˜์˜ ํžˆ์Šคํ† ๋ฆฌ์— ๊ฐ•์ œ๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ git push --force

์œ ์˜์‚ฌํ•ญ

  • ์›๊ฒฉ ์ €์žฅ์†Œ์˜ ๊ธฐ์กด ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ๊ฐ™์€ ๋ธŒ๋Ÿฐ์น˜์—์„œ ์ž‘์—…์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Cherry-Pick ๐Ÿ’

Cherry Picking ?

์ผ€์ดํฌ ์œ„์— ์–น์–ด์ ธ ์žˆ๋Š” ์ฒด๋ฆฌ๋งŒ ์ง‘์–ด๋จน๋Š” ํ–‰์œ„๋กœ "์ž์‹ ์ด ์ •ํ™•ํ•˜๊ฒŒ ์›ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์ทจํ•˜๋Š” ํ–‰์œ„"๋ฅผ ๋œปํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Git์— ์ ์šฉํ•˜๋ฉด, ๋‹ค๋ฅธ branch์— ์žˆ๋Š” ๋งŽ์€ commit์ค‘ ์›ํ•˜๋Š” commit๋งŒ ์™ ๊ฐ€์ ธ์˜ค๊ธฐ์ธ๊ฑฐ์ฃ !

$ git cherry-pick <commitID ํ˜น์€ commitID ์•ž ์—ฌ์„ฏ์ž๋ฆฌ> <commit2> ... <commit5>
  • ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์žฌ์ž‘์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ๊ธฐ์กด ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์˜์‚ฌํ•ญ

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

๊ทธ๋ž˜์„œ ๊ณ ๊ตฌ๋งˆ๋Š”์š” ..

  1. ์ƒˆ๋ธŒ๋Ÿฐ์น˜ ์ƒ์„ฑ (๊ฐ์ž์˜ MR์ด ๋ฐ˜์˜๋˜์–ด์žˆ์Œ)
  2. cherry-pick์œผ๋กœ ๊ณ ๊ตฌ๋งˆ์˜ commit ๋‚ด์—ญ ๊ฐ€์ ธ์˜ค๊ธฐ
  3. ์ถฉ๋Œ์žก๊ธฐ
  4. push
  5. ์ด์ „ ๋ธŒ๋Ÿฐ์น˜ ์‚ญ์ œ

์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ต๋‹ˆ๋‹ค ๐Ÿค—


๐Ÿ’ฌ ๋งˆ๋ฌด๋ฆฌ

์ตœ๊ทผ ์•„ํ‹ฐํด์—์„œ Rebase์™€ Merge์˜ ์ฐจ์ด๋ฅผ ์˜ฌ๋ ธ์—ˆ๋Š”๋ฐ, ์ด๋ฒˆ ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ์œผ๋กœ ๋” ์ •ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค..! Rebase๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๋Š” ์ „ ํŒ€์žฅ๋‹˜์˜ ์ง€์‹œ๊ฐ€ ์žˆ์—ˆ์–ด์„œ git์„ ์‹œ์ž‘ํ•  ๋•Œ๋ถ€ํ„ฐ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ Rebaseํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์˜€๋Š”๋ฐ ์ด์ œ๋Š” ์ฐจ์ด๋ฅผ ์•Œ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!(์•Œ์•„๋ฒ„๋ ค์„œ Merge๋งŒ ์“ธ๋“ฏ..) '์™œ ๋‚˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ์ž์ฃผ ๋œจ๋Š”๊ฑฐ์ง€?'๋ผ๋Š” ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋Š”๋ฐ, ๊ทธ์•ผ Rebase๋งŒ ์“ฐ๋‹ˆ๊นŒ.. ์ปค๋ฐ‹ ID๊ฐ€ ๋ฐ”๋€Œ์–ด ๋ฒ„๋ฆฌ๋Š” ํŠน์ง• ๋•Œ๋ฌธ์ด์—ˆ๋‹ค๋Š”๊ฒƒ..

๊ฐœ์ธ์ ์ธ ์˜๊ฒฌ์ด์ง€๋งŒ Rebase๋Š” ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๋งŒ ๊น”๋”ํ•˜๊ฒŒ ํ•ด์ค„ ๋ฟ ํฌ๊ฒŒ ์žฅ์ ์ด ์—†๋Š”๊ฒƒ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์ปค๋ฐ‹ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ๋‹ค ๋‚จ๊ฒŒ๋˜๋Š” Merge๋ฅผ ์“ฐ๋ฉด์„œ ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋„ ์•„๋ฌด๋ ‡์ง€์•Š๊ฒŒ ํ•ด๊ฒฐํ•ด๋ฒ„๋ฆฌ๋Š” ๊ทธ๋‚ ๊นŒ์ง€..! ํ™”์ด๊นƒ


์ฐธ๊ณ  ๋ฐ ์ถœ์ฒ˜
https://dongminyoon.tistory.com/9
https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-%EC%9B%90%ED%95%98%EB%8A%94-commit-%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0-cherry-pick
https://velog.io/@juhyeon1114/Git-Cherry-pick

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 7์›” 31์ผ

๊ณ ๊ตฌ๋งˆ ํ‘ธ์‹œ!!

1๊ฐœ์˜ ๋‹ต๊ธ€