๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป | CS/Git

[Git&Github] Git ์ •๋ฆฌ-5 (๋‹ค์–‘ํ•œ merge๋ฐฉ๋ฒ•, 3way, fast-forward, rebase, squash, ๋ธŒ๋žœ์น˜ ์‚ญ์ œ)

by KASSID 2023. 10. 29.

๋ชฉ์ฐจ

    728x90

    merge ๋ฐฉ๋ฒ•๋“ค์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

     

    1. 3-way

    ์ €๋ฒˆ ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ merge๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•ํƒœ์ด๋‹ค.

    ์ด๊ฒƒ์ด ๋ฐ”๋กœ 3-way merge ์ด๋‹ค.

    ๊ฐ branch์— ์ƒˆ๋กœ์šด commit์ด ํ•˜๋‚˜์”ฉ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜ํ–‰๋˜๋Š” merge์ด๋‹ค.

    ์ƒˆ๋กœ์šด commit์— 2๊ฐœ์˜ branch๋ฅผ ํ•ฉ์น˜๋Š” ๊ฒƒ์ด๋‹ค.

    ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

     

     

     

    2. fast-forward

    3-way์™€ ๋‹ค๋ฅด๊ฒŒ ์ƒˆ๋กœ์šด branch์—๋งŒ commit์ด ์กด์žฌํ•˜๊ณ 

    ๊ธฐ์กด branch์—์„œ๋Š” commit์„ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ž๋™์œผ๋กœ fast-forward merge๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.

    ์ด์ „
    ์ดํ›„

    ์ด์ฒ˜๋Ÿผ fast-forward merge๋ผ๋Š” ํ„ฐ๋ฏธ๋„ ๋ฉ”์„ธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ๋งŒ์•ฝ fast-forward๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ์•„๋ž˜์˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

    git merge --no--ff ๋ธŒ๋žœ์น˜๋ช…

     

    - mergeํ•œ ์ดํ›„ branch์˜ ์ƒํƒœ(๋ธŒ๋žœ์น˜ ์‚ญ์ œ)

    3-way๋‚˜ fast-foward merge๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์„œ๋ธŒ ๋ธŒ๋žœ์น˜๋Š” ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋‚จ์•„์žˆ๋‹ค.

    ์ด๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ์•„๋ž˜์˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•œ๋‹ค.

    // ๋ณ‘ํ•ฉ ์™„๋ฃŒ๋œ ๋ธŒ๋žœ์น˜์ธ ๊ฒฝ์šฐ
    git branch -d ๋ธŒ๋žœ์น˜๋ช…
    
    // ์•„์ง ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š์€ ๋ธŒ๋žœ์น˜์ธ ๊ฒฝ์šฐ
    git branch -D ๋ธŒ๋žœ์น˜๋ช…

     

     

     

    3. rebase ํ›„ merge(๊ฐ•์ œ fast-forward)

    rebase๋ž€,

    ๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘์ ์„ ๋‹ค๋ฅธ commit์œผ๋กœ ์˜ฎ๊ฒจ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

     

    rebase

    ์ด๋ฅผ ์˜ˆ์‹œ๋กœ reabase ํ›„ ๋‘ ๋ธŒ๋žœ์น˜์˜ ๋ณ‘ํ•ฉ์€

    sub๋ธŒ๋žœ์น˜์˜ ์‹œ์ž‘์ ์„ main์˜ ์ตœ๊ทผ commit์œผ๋กœ ์˜ฎ๊ฒจ์ค€ ํ›„ (rebase)

    fast-forward merge๋ฅผ ํ•œ๋‹ค.

    ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ๊ฐ•์ œ fast-forward merge๋ผ๊ณ  ํ•œ๋‹ค.

     

    ์‚ฌ์šฉ๋ฒ•

    ๋จผ์ € ์‹œ์ž‘์ ์„ ์˜ฎ๊ธธ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•œ๋‹ค.

    git switch ์ƒˆ๋กœ์šด๋ธŒ๋žœ์น˜๋ช…

     

    main ๋ธŒ๋žœ์น˜๋กœ rebaseํ•œ๋‹ค.

    git rebase main

     

    ๋‹ค์‹œ main์œผ๋กœ ๋Œ์•„๊ฐ€์„œ fast-forward merge๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    git switch main
    git merge ์ƒˆ๋กœ์šด๋ธŒ๋žœ์น˜๋ช…

     

    rebase๋ฅผ ์“ฐ๋Š” ์ด์œ ๋Š”

    ๋ณต์žกํ•œ ๋ธŒ๋žœ์น˜ ๊ตฌ์กฐ์—์„œ 3-way merge๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด git log๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค.

    ์„ธ์ƒ์—๋‚˜..

    ๊ฐ„๋‹จํ•˜๊ณ  ์งง์€ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด์„œ rebase๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ์ •๋ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ํ•˜์ง€๋งŒ ๋‹จ์ ์€

    conflict ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•ด์ฃผ์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.

     

     

     

    4. squash ํ›„ merge

    squash๋ฅผ ์ด์šฉํ•˜๋ฉด ์กฐ๊ธˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ๋ธŒ๋žœ์น˜๋“ค์„ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค.

    squash๋Š” ์œ„์˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•ฉ์ณ์งˆ ๋ธŒ๋žœ์น˜์˜ commit๋“ค์„

    ์ƒˆ๋กœ์šด commit์— ๋‹ด๋Š” ๊ฒƒ์ด๋‹ค.

     

    ์‚ฌ์šฉ๋ฒ•

    main ๋ธŒ๋žœ์น˜๋กœ ์˜ฎ๊ฒจ๊ฐ„ ๋’ค

    git switch main

     

    ์•„๋ž˜์˜ ๋ช…๋ น์„ ์ž…๋ ฅํ•˜์—ฌ squash๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    git merge --squash ํ•ฉ์น ๋ธŒ๋žœ์น˜๋ช…

     

    ์ดํ›„ commit์„ ํ•˜์—ฌ merge๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค.

    git commit -m "๋ฉ”์„ธ์ง€"

     

     

     

    5. 3-way์™€ rebase or squash ํ›„ ff ์˜ ์ฐจ์ด์ 

    3-way์˜ ๊ฒฝ์šฐ์—๋Š” mergeํ•œ ํ›„ ๋กœ๊ทธ๋“ค์„ ์‚ดํŽด๋ณด๋ฉด

    main ๋ธŒ๋žœ์น˜ commit ๋‚ด์—ญ์ด์ง€๋งŒ ํ•ฉ์ณ์ง„ ๋ธŒ๋žœ์น˜๋“ค์˜ ๋‚ด์—ญ๊นŒ์ง€ ๋ชจ๋‘ ๋ณด์—ฌ์ง„๋‹ค.

    3-way

    ์ด๋Š” commit์— ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์„ ๋“ค์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ์ถœ๋ ฅํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

     

    rebase์™€ squash์˜ ๊ฒฝ์šฐ์—๋Š”

    ์ด ์„ ๋“ค์„ ์ œ๊ฑฐํ•ด์ฃผ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊น”๋”ํ•˜๊ฒŒ ์ •๋ˆ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

    ๋Œ“๊ธ€