๐Ÿ ๊ธฐํƒ€/์ฝ”๋“œํ”„๋ ˆ์†Œ ์ฒดํ—˜๋‹จ_BE

[Git] Branch์˜ ์ดํ•ด | Merge | Conflict ํ•ด๊ฒฐํ•˜๊ธฐ

Dhey 2022. 1. 17. 01:56
๋ฐ˜์‘ํ˜•

๊ฐ๊ฐ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ž‘์—…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ๋ณ€๊ฒฝ์ ๋“ค์€ ๋‹ค์‹œ master๋ธŒ๋žœ์น˜๋กœ Merge(๋ณ‘ํ•ฉ)๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ด ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ์ˆ˜์ •๋œ ์‚ฌํ•ญ๋“ค์ด ์ตœ์ข… ์ฝ”๋“œ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.

 

Merge ํ•˜๋Š” ๋ฐฉ๋ฒ•
= ๋ธŒ๋žœ์น˜ ๋ณ‘ํ•ฉ

1. merge๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ๋ธŒ๋žœ์น˜๋กœ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค. [ $ git checkout master ]

์ด๋•Œ HEAD๋Š” master๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋จ

2. ํ•ฉ์ณ์งˆ ๋ธŒ๋žœ์น˜๋ฅผ mergeํ•œ๋‹ค. [ $ git merge ๋ธŒ๋žœ์น˜์ด๋ฆ„ ]

๊ทธ ๊ฒฐ๊ณผ master๋ธŒ๋žœ์น˜์— issue๋ธŒ๋žœ์น˜๊ฐ€ merge ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค

master๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋Œ€์ƒ์ด Commit 5๊ฐ€ ๋˜์—ˆ๋‹ค

 

์œ„์— 2๋ฒˆ๊ณผ์ •์—์„œ merge ํ•  ๋•Œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด Fast-forward ๋ผ๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ Fast-forwoard๋ž€, ๋ธŒ๋žœ์น˜์˜ ์œ„์น˜๋งŒ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด๋‹ค. 

๋”ฐ๋ผ์„œ issue๋ฅผ ๋ณ‘ํ•ฉ์‹œํ‚ฌ๋•Œ ๋ธŒ๋žœ์น˜์˜ ์œ„์น˜๊ฐ€ Commit 4์—์„œ Commit 5๋กœ ๋ธŒ๋žœ์น˜์˜ ์œ„์น˜๋งŒ ๋ณ€๊ฒฝ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

โ€ป merge ํ›„ ๋ธŒ๋žœ์น˜๊ฐ€ ๋”์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ณด๋‹ค ํšจ๊ณผ์ ์ธ ์šด์˜์„ ์œ„ํ•ด ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

โ‰ซ $ git branch -d ์‚ญ์ œํ• _๋ธŒ๋žœ์น˜์ด๋ฆ„ ๋ช…๋ น์–ด๋กœ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

issue ๋ธŒ๋žœ์น˜ ์‚ญ์ œ

โ‰ซ $ git branch -v ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•ด๋ณด๋ฉด issue ๋ธŒ๋žœ์น˜๊ฐ€ ์‚ญ์ œ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

issue ๋ธŒ๋žœ์น˜๊ฐ€ ์‚ญ์ œ ๋จ

 

 

์•ž์„œ ์‹ค์Šตํ•œ ๋ธŒ๋žœ์น˜๋“ค์„ ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค ๊ฐ€์ •ํ•˜๊ณ  ํ•˜๋‚˜์˜ ๋ธŒ๋žœ์น˜๋กœ merge ์‹œ์ผœ๋ณด์ž.

โ‰ซ $ git merge feature-login 

โ‰ซ $ git log

master๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ตœ์‹  ์ปค๋ฐ‹์ด Merge ์ปค๋ฐ‹์ด๊ณ , feature-login์— ์žˆ๋˜ Commit 3๋„ ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ

 

์ด๋ฒˆ merge์—์„œ๋Š” ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ Fast-forward ๋ฐฉ์‹์œผ๋กœ merge๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค. 

์™œ๋ƒํ•˜๋ฉด master๋ธŒ๋žœ์น˜์—๋Š” ๋‘ ๊ฐœ์˜ Commit(4,5)์ด ์กด์žฌํ•˜๋Š”๋ฐ ์ด๋•Œ๋Š” master๋ธŒ๋žœ์น˜๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค ํ•ด๋„ merge๋ฅผ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— Fast-forward ๋ฐฉ์‹์œผ๋กœ๋Š” merge๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

 

์ด๋ ‡๊ฒŒ Fast-forward ๋ฐฉ์‹์œผ๋กœ merge๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•  ๊ฒฝ์šฐ,

Git์—์„œ๋Š” โ‘ merger๋ฅผ ์ง„ํ–‰ํ•  master์™€ feature-login ๋ธŒ๋žœ์น˜์˜ ๊ณตํ†ต ๋ถ€๋ชจ ์ปค๋ฐ‹์ธ Commit 2๋ฅผ ์ฐพ๊ฒŒ ๋˜๊ณ , ๋˜ โ‘ก๊ฐ ๋ธŒ๋žœ์น˜์˜ ์ตœ์‹  ์ปค๋ฐ‹์ธ Commit 3๊ณผ Commit 5๋ฅผ ํฌํ•จ ์ด 3๊ฐœ์˜ ์ปค๋ฐ‹์œผ๋กœ merge๋ฅผ ์ง„ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ โ‘ , โ‘ก์˜ ์ปค๋ฐ‹์„ ๋ชจ๋‘ ๊ณ ๋ คํ•˜์—ฌ Mergeํ•˜๋Š” ๋ฐฉ์‹์„ "3-way Merge" ๋ผ๊ณ  ํ•œ๋‹ค.

3-way Merge์˜ ๊ฒฐ๊ณผ๋Š” ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

3-way Merge

Commit 2, 3, 5๊ฐ€ 3-way Merge๊ฐ€ ๋˜์–ด ์ƒˆ๋กœ์šด Merge Commit์„ ์ƒ์„ฑํ•˜์˜€๊ณ , master๋ธŒ๋žœ์น˜๋Š” Merge Commit์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋Ÿผ ๋ธŒ๋žœ์น˜ Merge๋Š” ๋Š˜ ์„ฑ๊ณตํ• ๊นŒ?

โ‰ซ ์•„๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์€ Commit 3์™€ 5๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ๋Œ€ํ•ด ์ˆ˜์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. 

 ๊ทธ๋Ÿผ feature-login์— Commit 6๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Commit 5์™€ ๊ฐ™์ด MainService.java ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ ํ›„ merge๋ฅผ ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

Commit 6 ์ƒ์„ฑ, MainService.java ํŒŒ์ผ ์ˆ˜์ •

โ‰ซ merge๋ฅผ ์œ„ํ•ด master ๋ธŒ๋žœ์น˜๋กœ ์ด๋™ํ•œ ํ›„ [ $ git checkout master ]

โ‰ซ feature-login ๋ธŒ๋žœ์น˜๋ฅผ ๋ณ‘ํ•ฉํ•œ๋‹ค. [ $ git merge feature-login ]

๊ทธ ๊ฒฐ๊ณผ,

merge๊ฐ€ ์‹คํŒจํ–ˆ๋‹ค๋Š” ๋ฉ”์„ธ์ง€๊ฐ€ ๋œฌ๋‹ค (* CONFLICT)

 

์œ„ ์ƒํ™ฉ์—์„œ๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์˜ ์ถฉ๋Œ(Conflict)์ด ๋ฐœ์ƒํ•˜์˜€๋‹ค.

Conflict๋ž€, ๋‘๊ฐœ์˜ ๋ณ€๊ฒฝ์ ์ด ํ•ฉ์ณ์งˆ ๋•Œ ๋ณ€๊ฒฝ์  ์ž์ฒด๊ฐ€ ์„œ๋กœ ์ถฉ๋Œํ•˜๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

ํ˜„์žฌ git์˜ ์ƒํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€๋ฐ,

๋‘ ๊ฐœ์˜ ๋ณ€๊ฒฝ์ ์ด ํ•ฉ์ณ์งˆ ๋•Œ, ์„ธ๋ฒˆ์งธ ๋ผ์ธ์—์„œ conflict๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.  

 

 

๊ทธ๋Ÿผ ์ด๋ฏธ conflict๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ์—์„œ git์€ ๋‘˜ ์ค‘์— ์–ด๋–ค ๋ณ€๊ฒฝ์ ์„ ์ตœ์ข… ํŒŒ์ผ์— ๋ฐ˜์˜ํ• ์ง€ ์Šค์Šค๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์„๊นŒ?

โ‰ซ ํŒ๋‹จํ•  ์ˆ˜ ์—†๋‹ค. ๋•Œ๋ฌธ์— Git์€ conflict๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ์„œ ์‚ฌ์šฉ์ž๋กœ ํ•˜์—ฌ๊ธˆ ํ•ด๋‹น conflict๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ํ•œ๋‹ค.

 

 

Conflict๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

1. ์ง์ ‘ merge ํ•˜๊ธฐ

2. mergetool์„ ์ด์šฉํ•ด์„œ merge ํ•˜๊ธฐ

 

์—ฌ๊ธฐ์„œ ๋‘๋ฒˆ์งธ mergetool์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•ด ๋ณด๋ คํ•œ๋‹ค.

โ‰ซ $ git mergetool

์ดํ›„ vimdiff ์ž…๋ ฅ ํ›„ Enter

์ด๋Š” 3-way Merge ๋ฐฉ์‹์œผ๋กœ ๋ณ‘ํ•ฉ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์„ธ ๊ฐœ์˜ ์ฐฝ์ด ๋œจ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ธ๋ฐ, ์—ฌ๊ธฐ์„œ

์ฒซ๋ฒˆ์งธ ์ฐฝ์€ master๋ธŒ๋žœ์น˜์—์„œ์˜ ๋ณ€๊ฒฝ์ ์„, 

๋‘๋ฒˆ์งธ๋Š” master์™€ feature-login์˜ ๊ณตํ†ต ๋ถ„๋ชจ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์„,

์„ธ๋ฒˆ์งธ๋Š” feature-login๋ธŒ๋žœ์น˜์—์„œ์˜ ๋ณ€๊ฒฝ์ ,

๋งˆ์ง€๋ง‰ ํ•˜๋‹จ์— ์žˆ๋Š” ์ฐฝ์€ ์‹ค์ œ working-directory์— ์žˆ๋Š” MainService.java์˜ ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

์ด๋ ‡๊ฒŒ mergtool์„ ์ด์šฉํ•˜๋ฉด ์„ธ๊ฐ€์ง€ view๋ฅผ ๋™์‹œ์— ๋น„๊ตํ•˜๋ฉด์„œ ๋ณด๋‹ค ํŽธํ•˜๊ฒŒ merge๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์—ฌ๊ธฐ์„œ Tip์„ ํ•œ๊ฐ€์ง€ ๋งํ•˜์ž๋ฉด

์ฝ”๋“œ ํ•œ ์ค„ ์ „์ฒด๋ฅผ ์ง€์šฐ๋Š” ๋ช…๋ น์–ด๋Š” ์ง€์šฐ๊ณ  ์‹ถ์€ ์ฝ”๋“œ ์œ„์— ์ปค์„œ๋ฅผ ์˜ฌ๋ฆฌ๊ณ  'dd' ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๊ณ  'Esc → :wq'๋กœ ์ €์žฅ ํ›„ ์ข…๋ฃŒํ•œ ๋‹ค์Œ, ๋‚˜๋จธ์ง€ ์ฐฝ๋“ค๋„ ์ „๋ถ€ 'Esc → :q'๋กœ ์ข…๋ฃŒํ•œ๋‹ค.

 

์ดํ›„ MainService.java๋ฅผ ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ์ˆ˜์ •๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 


 

 

์ฝ”๋“œํ”„๋ ˆ์†Œ Java ์›น ๊ฐœ๋ฐœ ์ฒดํ—˜๋‹จ ํ™œ๋™ ์ค‘ '์‹ค๋ฌด์ž๊ฐ€ ์•Œ๋ ค์ฃผ๋Š” Git ํ™œ์šฉํ•œ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ' ์ด๋Ÿฌ๋‹ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค :)
์ฝ”๋“œํ”„๋ ˆ์†Œ URL: https://www.codepresso.kr/

 

ํ”„๋ฆฌ๋ฏธ์—„ IT ๊ต์œก ์„œ๋น„์Šค - ์ฝ”๋“œํ”„๋ ˆ์†Œ

 

www.codepresso.kr

 

๋ฐ˜์‘ํ˜•