Git - YunByungKwan/Fundamental GitHub Wiki

Git

fast-forward merge vs 3-way merge์— ๋Œ€ํ•ด ์„ค๋ช…

fast-forward merge๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๊ฐ™์€ ์ค„๊ธฐ์— master branch๊ฐ€ ๋’ค์— ์žˆ๊ณ  slave branch๊ฐ€ ์•ž์— ์žˆ๋‹ค๊ณ  ํ–ˆ์„๋•Œ master branch(*)์—์„œ git merge slave๋ฅผ ํ•˜๋ฉด ๋‹จ์ˆœํžˆ master branch์˜ ์ƒํƒœ๊ฐ€ slave branch ์œ„์น˜๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. 3-way merge๋„ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ commit0๋ฅผ ๊ธฐ์ค€์œผ๋กœ slave1 branch์™€ slave2 branch๊ฐ€ ๊ฐ๊ฐ commit1, commit2๋ฅผ ํ•ด์„œ ๊ฐˆ๋ผ์กŒ๋‹ค๊ณ  ํ–ˆ์„๋•Œ slave1 branch์—์„œ git merge slave2๋ฅผ ํ•˜๋ฉด ๋‘ commit์„ ํฌํ•จํ•˜๋Š” ์ƒˆ๋กœ์šด commit์ด ์ƒ๊ธฐ๋Š”๋ฐ ์ด๋ฅผ 3-way merge๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Interactive rebase

๊ฐœ์š”

Repository ์ƒ์„ฑํ•˜๊ธฐ

  • commit: ํ•˜๋‚˜์˜ ๋ฒ„์ „์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ. ํ•œ๋ฒˆ์˜ commit์—๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ ๋˜๋Š” ํ•œ๊ฐœ์˜ ํŒŒ์ผ์„ commitํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Discard: Working directory์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š” ํŒŒ์ผ๋“ค(unstaged files)์„ ๋ณ€๊ฒฝ ์ƒํƒœ ์ด์ „์œผ๋กœ ๋Œ๋ฆฌ๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  • Reset

    • Mixed: commit ๋‚ด์—ญ์ด 5๊ฐœ ์žˆ๋‹ค(1,2,3,4,5) 3๋ฒˆ์งธ commit์—์„œ Reset Mixed๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด 4, 5๋ฒˆ์งธ commit์ด ์‚ฌ๋ผ์ง€๊ณ  ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ๋‹ค ๋‚ ๋ผ๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ working copy๋กœ ๊ฐ„๋‹ค.(์ฆ‰, 4,5๋ฒˆ์งธ commit์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๋“ค์ด ์žˆ๋Š”์ฑ„๋กœ add ์ด์ „ ์ƒํƒœ๋กœ ๊ฐ€๋Š” ๊ฒƒ์ž„)
    • Hard: ์˜ˆ๋ฅผ ๋“ค์–ด์„œ commitํ•œ ๋‚ด์—ญ์ด 5๊ฐœ ์ •๋„๋œ๋‹ค. ๊ทธ์ค‘์— 3๋ฒˆ์งธ ์ปค๋ฐ‹ ์ดํ›„์— ํ•œ 4,5๋ฒˆ์งธ ์ปค๋ฐ‹์„ ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ(์กฐ์‹ฌํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ)
  • Revert: ์†Œ์ŠคํŠธ๋ฆฌ์—์„œ๋Š” Reverse commit์ด๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ฐ”๋กœ ์ฝ”๋“œ๋“ค์„ ๋ฐ”๋กœ ์ „ ์ปค๋ฐ‹ ๋‹จ๊ณ„์ƒํƒœ๋กœ ๋งŒ๋“ค๋ฉด์„œ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ๋‹ค(์ƒˆ๋กœ์šด ์ปค๋ฐ‹์—๋Š” Revert๋ผ๊ณ  ๋œธ)

    • ๋ฐ”๋กœ ์ „๋‹จ๊ณ„ commit์ด ์•„๋‹Œ ์ „์ „๋‹จ๊ณ„ ๋“ฑ์œผ๋กœ ๋„˜์–ด๊ฐ€๋ ค๊ณ  ํ•˜๋ฉด conflict๊ฐ€ ๋œฐ ๊ฒƒ์ด๋‹ค.(์ „์ „ ๋‹จ๊ณ„๋กœ ๊ฐ€๋ ค๋ฉด Revert 2๋ฒˆ ํ•˜๋ฉด ๋ ๋“ฏ)
  • unstaged files(์ด ์˜์—ญ์„ Working copy๋ผ๊ณ  ๋ถ€๋ฆ„) vs staged files(์ด ์˜์—ญ์„ index ๋˜๋Š” staging area๋ผ๊ณ  ๋ถ€๋ฆ„)

    • unstaged files: ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธด ํŒŒ์ผ๋“ค์˜ ๋ชฉ๋ก์ด ๋œจ๋Š” ๊ณณ์ด๋‹ค.
    • staged files: unstaged files ์ค‘์— ์„ ํƒํ•ด์„œ stagedํ•˜๋ฉด ์ด ๊ณณ์œผ๋กœ ๋„˜์–ด์˜จ๋‹ค.
      • Unstaged files์„ ์„ ํƒํ•˜๋Š” ํ–‰์œ„๋ฅผ add๋ผ๊ณ  ํ•œ๋‹ค.(addํ•˜๋ฉด Staged files๋กœ ๋„˜์–ด๊ฐ„๋‹ค.)
      • staging area์— ์˜ฌ๋ผ์™€ ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ commitํ•˜๋ฉด repository์— ํ•˜๋‚˜์˜ ๋ฒ„์ „์œผ๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.
  • branch: branch๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ (์‹คํ—˜์ด๋ž€ ๋ธŒ๋žœ์น˜) ๋งˆ์Šคํ„ฐ๋กœ ์„ ํƒํ•œ ๋‹ค์Œ commit์„ ์ด 3๊ฐœํ–ˆ๋‹ค. ๋งˆ์Šคํ„ฐ๋Š” 3๊ฐœ์˜ ์ปค๋ฐ‹์„ ์‹คํ—˜ ๋ธŒ๋žœ์น˜๋ณด๋‹ค ์•ž์„œ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด์ƒํƒœ์—์„œ ์‹คํ—˜ ๋ธŒ๋žœ์น˜๋ฅผ ์„ ํƒํ•˜๋ฉด ์‹คํ—˜ ๋ธŒ๋žœ์น˜์ผ๋•Œ์˜ ์ƒํ™ฉ์œผ๋กœ ์ฝ”๋“œ๋“ค์ด ๋ฐ”๋€๋‹ค.

  • merge: ์‹คํ—˜ ๋ธŒ๋žœ์น˜, ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ๋‹ค. ์‹คํ—˜ ๋ธŒ๋žœ์น˜ ๋‚ด์šฉ์„ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋กœ mergeํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ, ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋ฅผ ์„ ํƒ(checkout)ํ•˜๊ณ  ์‹คํ—˜ ๋ธŒ๋žœ์น˜ ์˜ค๋ฅธ์ชฝ ๋ˆŒ๋Ÿฌ์„œ merge๋ฅผ ๋ˆ„๋ฅธ๋‹ค.

  • merge conflict ํ•ด๊ฒฐ:

fast-forward vs 3-way-merge

fast-forward๋Š” ๋‹จ์ˆœํžˆ ํฌ์ธํ„ฐ๋ฅผ ์ตœ์‹  ์ปค๋ฐ‹์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ commit 0,1,2๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์žˆ๊ณ  commit 2์— master ๋ธŒ๋žœ์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์นฉ๋‹ˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜์ธ slave๊ฐ€ commit 3์„ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ์นฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ๋ธŒ๋žœ์น˜์ธ slave์—์„œ master ๋ธŒ๋žœ์น˜๋กœ mergeํ•  ๊ฒฝ์šฐ, master ๋ธŒ๋žœ์น˜๊ฐ€ commit 3๋กœ ๋‹จ์ˆœํžˆ ์˜ฎ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” commit3๊ฐ€ commit2์—์„œ ํŒŒ์ƒ๋๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์„ fast-forward๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๋Œ€ ์ฐธ์กฐ

Merge

์ด ์ƒํƒœ์—์„œ git merge mainํ•˜๋ฉด ์•„๋ฌด ์ผ๋„ ์•ˆ ์ผ์–ด๋‚œ๋‹ค.

์ด ์ƒํƒœ์—์„œ git merge subํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

์ด๊ฒŒ fast-forward์ด๋‹ค.

์ด ์ƒํƒœ์—์„œ get merge sub1ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋œ๋‹ค.

์ด๊ฒŒ 3-way merge์ด๋‹ค.

Reference>