๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[Git]

init๋ถ€ํ„ฐ merge๊นŒ์ง€ Git์˜ ๋‚ด๋ถ€์—์„œ ์ผ์–ด๋‚˜๋Š” ์ผ

by ํŒกํŽ‘ํ 2025. 4. 30.
728x90
๐Ÿ’ก ์ง€๊ธˆ๊ป git init๋ถ€ํ„ฐ ๋ธŒ๋žœ์น˜ ๊ฐ„์˜ merge๊นŒ์ง€ ์ˆ˜๋ฐฑ ๋ฒˆ ๋„˜๊ฒŒ ๊ฒฝํ—˜ํ•˜๋ฉด์„œ ๋‹จ ํ•œ ๋ฒˆ๋„ Git์˜ ๋‚ด๋ถ€ ๋™์ž‘์ด๋‚˜ ์›๋ฆฌ์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•จ์„ ๊ฐ€์ ธ๋ณธ ์ ์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ทธ ๋‚ด๋ถ€๋ฅผ ์ƒ…์ƒ…์ด ์‚ดํŽด๋ณด๋ฉด์„œ Git์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์ดํ•ดํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

๐Ÿ“Œ Git์˜ ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ๋ฒ• ์ •๋„๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿฅธ ์„ ์ˆ˜ ์ง€์‹

  • Git ๋‚ด๋ถ€์˜ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•  ์šฉ์–ด ๋ฐ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
  • ์•„๋ž˜ ๋‚ด์šฉ์€ ๊ฐ€๋ณ๊ฒŒ ์ฝ์–ด๋ณด์‹œ๊ณ , ์‹ค์Šต ๋ถ€๋ถ„์—์„œ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์‹œ๋ฉด ๋Œ์•„์™€ ํ•ด๋‹น ๊ฐœ๋…์„ ๋‹ค์‹œ ์ฝ์œผ์‹œ๋ฉด ๋ณด๋‹ค ์ˆ˜์›”ํ•˜๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.

 

โœ๐Ÿป ์šฉ์–ด ์ •๋ฆฌ

๐Ÿ”ธ HEAD

  • Git์—์„œ HEAD๋Š” ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ "๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ"๋ฅผ ๋งํ•œ๋‹ค.
    • ๊ฐ€์žฅ ์ตœ์‹  ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ํฌ์ธํ„ฐ์ธ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ”ธ Git์˜ ์ €์žฅ ๋‹จ์œ„ : Object

  • Git์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ์ฒด(Object)๋ผ๋Š” ์ด๋ฆ„์˜ ์ €์žฅ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์ด ๊ฐ์ฒด๋“ค์€ Git์˜ ๋ชจ๋“  ๋™์ž‘์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋ฉฐ, ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • Object์—๋Š” blob, commit, tree, tag๊ฐ€ ์žˆ๋‹ค.
  • ๋ชจ๋“  ๊ฐ์ฒด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ SHA-1 ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • Git 2.29 ์ด์ƒ์—์„œ๋Š” core.objectFormat=sha256 ์„ค์ •์„ ํ†ตํ•ด SHA-256์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๐Ÿ”˜ Blob(Binary Large Object)

  • git add ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
    • git add ์‹œ blob ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • git add๋กœ ์ถ”๊ฐ€๋œ ๊ฐœ๋ณ„ ํŒŒ์ผ์˜ ๋‚ด์šฉ๋งŒ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
    • ํŒŒ์ผ ์ด๋ฆ„์ด๋‚˜ ์œ„์น˜ ์ •๋ณด๋Š” ์—†๊ณ  ์˜ค์ง ๋‚ด์šฉ๋งŒ์„ ๋‹ด๋Š”๋‹ค.
  • ๋™์ผํ•œ ๋‚ด์šฉ์ด๋ฉด ์–ธ์ œ๋‚˜ ๋™์ผํ•œ SHA-1 ํ•ด์‹œ๊ฐ’์„ ๊ฐ€์ง€๋ฏ€๋กœ ์ค‘๋ณต ์ €์žฅ์ด ๋˜์ง€ ์•Š์•„ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•œ๋‹ค.
  • ํŒŒ์ผ์ด ์ˆ˜์ •๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ปค๋ฐ‹์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•ด๋„ ๋™์ผํ•œ blob์ด ์žฌ์‚ฌ์šฉ๋œ๋‹ค.

 

๐Ÿ”˜ Commit

  • commit์€ Git์—์„œ ํ•˜๋‚˜์˜ ์Šค๋ƒ…์ƒท(๋ฒ„์ „)์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ํ”„๋กœ์ ํŠธ์˜ ํŠน์ • ์‹œ์ ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • git commit ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
    • ๋ง๊ทธ๋Œ€๋กœ git commit์„ ํ†ตํ•ด ์ €์žฅ๋œ ์Šค๋ƒ…์ƒท(๋ฒ„์ „)์„ ์ €์žฅํ•˜๋Š” ๊ฐ์ฒด์ธ ๊ฒƒ์ด๋‹ค.
  • ํ•˜๋‚˜์˜ commit ๊ฐ์ฒด๋Š” ํ•˜๋‚˜์˜ tree ๊ฐ์ฒด(ํŒŒ์ผ ๊ตฌ์กฐ ์ „์ฒด)๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•œ๋‹ค.
    • tree ํ•ด์‹œ๊ฐ’
    • ๋ถ€๋ชจ ์ปค๋ฐ‹ ํ•ด์‹œ๊ฐ’(parent๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ์ฒซ ์ปค๋ฐ‹์ด๋ผ๋ฉด ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.)
    • ์ž‘์„ฑ์ž(author) / ์ปค๋ฐ‹ํ„ฐ(committer)
    • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€

 

๐Ÿ”˜ Tree

  • git commit ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋˜๋Š” ๊ฐ์ฒด์ด๋‹ค.
    • ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด Git์—์„œ commit์„ ํ•œ๋‹ค๋Š” ๊ฑด ํ•ด๋‹น ์‹œ์ ์˜ ์Šค๋ƒ…์ƒท(๋ฒ„์ „)์„ ์ €์žฅํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค.
    • tree๋Š” commit ์‹œ์˜ ํŠน์ • ์‹œ์ ์— ๋Œ€ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ(ํด๋”) ๊ตฌ์กฐ์™€ ๊ทธ ์•ˆ์˜ ํŒŒ์ผ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์ด๋‹ค.
  • ์ด ๊ฐ์ฒด๋Š” ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ์— ํฌํ•จ๋œ ํŒŒ์ผ๊ณผ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ(tree ๋˜๋Š” blob ๊ฐ์ฒด๋“ค)์˜ ๋ชฉ๋ก์„ ํŠธ๋ž˜ํ‚นํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์ด๋ฆ„, ๊ถŒํ•œ, ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๊ฐ์ฒด์˜ ํ•ด์‹œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ข€ ๋” ์ •ํ™•ํžˆ ์„ค๋ช…ํ•˜๋ฉด ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด์˜ ํŒŒ์ผ ๋ชฉ๋ก, ์ด๋ฆ„, ๊ถŒํ•œ(100644, 100755), ํƒ€์ž…(blob/tree), ํ•ด์‹œ๊ฐ’(blob ๋˜๋Š” tree์˜ SHA-1 ํ•ด์‹œ)์„ ๊ฐ€์ง„๋‹ค.
    • ๊ถŒํ•œ์ด๋ž€?
      • ๊ถŒํ•œ์—์„œ 6์ž๋ฆฌ ์ˆซ์ž๋Š” ํŒŒ์ผ์˜ ๋ชจ๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 
      • ex) 100644์—์„œ ์•ž์— ๋‘ ์ž๋ฆฌ๋Š” ํŒŒ์ผ์˜ ํƒ€์ž…์ด๋‹ค.
        • 10์€ ์ผ๋ฐ˜ ํŒŒ์ผ, 12๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ, 04๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์ด๋‹ค.
      • ๋’ค ๋„ค์ž๋ฆฌ๋Š” ๊ถŒํ•œ ๋น„ํŠธ(8์ง„์ˆ˜)๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • ํ•œ๋งˆ๋””๋กœ ์ •๋ฆฌํ•˜๋ฉด, tree ๊ฐ์ฒด๋Š” commit ์‹œ์˜ ํŠน์ • ์‹œ์ ์— ๋Œ€ํ•œ blob ๊ฐ์ฒด(ํŒŒ์ผ)๋‚˜ ๋‹ค๋ฅธ tree ๊ฐ์ฒด(ํ•˜์œ„ ํด๋”)๋ฅผ ํฌํ•จํ•œ๋‹ค.

 

๐Ÿ”˜ Tag

  • ํŠน์ • commit์— ์ด๋ฆ„ํ‘œ(label) ๋ฅผ ๋ถ™์ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • git tag๋กœ ์ƒ์„ฑํ•œ๋‹ค.
  • ๋ฒ„์ „์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜๊ณ , ๋ฆด๋ฆฌ์Šค๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.
    • Lightweight tag : ๋‹จ์ˆœํžˆ ์ปค๋ฐ‹์˜ ํ•ด์‹œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ์ด๋ฉฐ ๊ฐ์ฒด๋Š” ์•„๋‹ˆ๋‹ค.
    • Annotated tag : ๋ฉ”์‹œ์ง€, ์ž‘์„ฑ์ž ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ฉฐ ๋ณ„๋„์˜ ๊ฐ์ฒด๋กœ ์ €์žฅ๋œ๋‹ค.

 

๐Ÿ‘€ Git ๋‚ด๋ถ€ ๊ตฌ์กฐ ํ•œ๋ˆˆ์— ๋ณด๊ธฐ

HEAD
 โ””โ”€โ–ถ Commit
       โ”œโ”€โ–ถ Tree
       โ”‚    โ”œโ”€โ–ถ Blob (hello.txt)
       โ”‚    โ””โ”€โ–ถ Tree (src/) โ”€โ–ถ Blob (main.java)
       โ””โ”€โ–ถ Parent Commit (์ด์ „ ์Šค๋ƒ…์ƒท)
  • ์œ„์˜ Git ๊ฐ์ฒด์— ๋Œ€ํ•œ ์„ค๋ช…์„ ํ† ๋Œ€๋กœ Git ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ํ•˜๋‚˜์”ฉ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž.
    • ์ด ์˜ˆ์‹œ๋Š” ์ปค๋ฐ‹์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์ผ์–ด๋‚œ ํŠน์ • ๋ธŒ๋žœ์น˜์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ธ ๊ฒƒ์ด๋‹ค.
  • Head๋Š” ํ˜„์žฌ ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰(๊ฐ€์žฅ ์ตœ์‹ ) commit์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ comitt ๊ฐ์ฒด์—๋Š” ํ•˜๋‚˜์˜ tree ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ํ•˜๋‚˜์˜ tree ๊ฐ์ฒด๋Š” Git์— ์˜ํ•ด Commitํ•œ ์‹œ์ ์—์„œ์˜ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋‚˜, ๊ฐœ๋ณ„ ํŒŒ์ผ์„ ์ €์žฅํ•œ๋‹ค.
  • Head๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” commit ๊ฐ์ฒด๊ฐ€ ์ตœ์ดˆ์˜ commit์ด ์•„๋‹Œ ๊ฒฝ์šฐ, parent commit(๋ถ€๋ชจ ์ปค๋ฐ‹ ๊ฐ์ฒด)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
    • ์ฆ‰, ํ•˜๋‚˜์˜ commit์€ ๋ถ€๋ชจ commit(๋ฐ”๋กœ ์ง์ „์˜ commit)์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋ฐ‹ ์ทจ์†Œ์™€ ๊ฐ™์€ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

 

๐Ÿš€ Git์˜ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์˜์—ญ

๊ตฌ๋ถ„ ์„ค๋ช… ํ™•์ธ ์œ„์น˜
Working Directory Git์—์„œ ์ž‘์—… ์ค‘์ธ ๋กœ์ปฌ ํด๋”๋ฅผ ๋งํ•œ๋‹ค.(ํด๋”, ํŒŒ์ผ ๋“ฑ) ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”
Staging Area(Index) ์ปค๋ฐ‹ํ•  ์ค€๋น„๊ฐ€ ๋œ ํŒŒ์ผ๋“ค์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณณ์ด๋‹ค. .git/index
Repository(Git Directory) Git์˜ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณณ์ด๋‹ค. .git/objects

 

๐Ÿ›ธ Git state ๋ช…์นญ๊ณผ ์„ค๋ช…

๐Ÿ”˜ Untracked

  • Git์ด ์•„์ง ์ถ”์ ํ•˜์ง€ ์•Š๋Š” ์ƒˆ ํŒŒ์ผ์„ ์˜๋ฏธํ•œ๋‹ค.
  • git add ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ Git์ด ํ•ด๋‹น ํŒŒ์ผ์„ ์ถ”์ (๊ด€๋ฆฌ)ํ•˜๋„๋ก ์ค€๋น„ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ํ•œ ๋ฒˆ ์ถ”์ ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด unmodified๋‚˜ modified์™€ ๊ฐ™์ด ํŠธ๋ž˜ํ‚น ๋˜๋ฉด์„œ ๋ณ€๊ฒฝ ๊ฐ์ง€๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

โ˜‘๏ธ Unmodified

  • ์ด๋ฏธ Tracked ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.(์ด๋ฏธ Git์ด ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ)
  • Working Directory์˜ ํŒŒ์ผ์ด ๋งˆ์ง€๋ง‰(๊ฐ€์žฅ ์ตœ์‹ ) ์ปค๋ฐ‹๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ์˜๋ฏธ๋กœ, ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Working Directory ๋‚ด ํŒŒ์ผ์˜ ํ•ด์‹œ๊ฐ’๊ณผ, HEAD commit์˜ blob ํ•ด์‹œ๊ฐ’์ด ๋™์ผํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค.

 

โ˜‘๏ธ Modified

  • ์ด๋ฏธ Tracked ๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค.(์ด๋ฏธ Git์ด ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํŒŒ์ผ)
    • unmodified์™€์˜ ์ฐจ์ด์ ์€ ๊ธฐ์กด ํŒŒ์ผ๊ณผ์˜ ๋ณ€๊ฒฝ ์—ฌ๋ถ€์ด๋‹ค.
  • ์ถ”์  ์ค‘์ธ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ Git์ด ์ธ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์•„์ง staging area์—๋Š” ์˜ฌ๋ฆฌ์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” Working Directory ๋‚ด ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์˜ ํ•ด์‹œ๊ฐ’๊ณผ, HEAD commit์˜ blob ํ•ด์‹œ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค๋Š” ๋œป์ด๋‹ค.

 

๐Ÿ”˜ Staged

  • ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์„ git add ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ staging area์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์Œ ์ปค๋ฐ‹์— ํฌํ•จ๋  ์ค€๋น„๊ฐ€ ๋œ ์ƒํƒœ์ด๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” .git/index์— ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ์˜ blob ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ ์ €์žฅ๋œ๋‹ค.

 

๐Ÿ”˜ Committed

  • staging area์˜ ๋‚ด์šฉ์ด ์‹ค์ œ๋กœ ์ปค๋ฐ‹๋œ ์ƒํƒœ์ด๋‹ค.
  • Git์ด ์™„์ „ํžˆ ์ถ”์ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” .git/objects์— Tree ๊ฐ์ฒด์™€ Commit ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ ์ €์žฅ๋œ๋‹ค.
    • tree ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ƒˆ๋กœ์šด Commit ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๐ŸŽจ ๊ทธ๋ฆผ์œผ๋กœ Git state์™€ Git ๋‚ด๋ถ€ ๋ณ€ํ™” ์ดํ•ดํ•˜๊ธฐ

  • git ๋ช…๋ น์–ด์— ์˜ํ•ด ๊ฐ์ฒด๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉฐ, ์ด๋Š” .git ํด๋” ๋‚ด์—์„œ ์ผ์–ด๋‚œ๋‹ค.
  • Working Directory๋Š” Git์ด ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ปฌ ์‹œ์Šคํ…œ ์ƒ์˜ ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ Git์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜๋Š” ํŒŒ์ผ์„ ํŽธ์ง‘, ์ƒ์„ฑ, ์‚ญ์ œํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
  • Staging Area๋Š” .git/index์—, Git Repository๋Š” .git/object ๋‚ด๋ถ€์— ๊ฐ์ฒด๋กœ ๊ธฐ๋ก๋œ๋‹ค.

 

๐Ÿ”ธ ์ƒˆ๋กœ ๋งŒ๋“  ํŒŒ์ผ: Untracked -> Staged -> Committed

  • ์ฒ˜์Œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด Git์€ ์ด ํŒŒ์ผ์˜ ์กด์žฌ๋งŒ์„ ๊ฐ์ง€ํ•  ๋ฟ์ด๋‹ค. ์–ด๋– ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋“ฑ์˜ ์ถ”์ ์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๊ฒƒ์ด Untracked ์ƒํƒœ์ด๋‹ค.
  • git add๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด Staging area๋กœ ๋“ค์–ด๊ฐ€ Git์˜ ์ถ”์ ์„ ๋ฐ›์„ ์ค€๋น„๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.
    • ์ด๋•Œ, ํ•ด๋‹น ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ blob ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด .git/objects/์— ์ €์žฅ๋œ๋‹ค.
      • ์ด๋ฏธ ๋™์ผํ•œ ๋‚ด์šฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋˜ํ•œ, .git/index์— ์žˆ๋Š” ์Šคํ…Œ์ด์ง• ์˜์—ญ ์ •๋ณด์— ์ €์žฅ๋œ๋‹ค.
  • ์ดํ›„ commit์„ ํ•˜๊ฒŒ ๋˜๋ฉด Git์— ์˜ํ•ด ๊ฐ์ฒด๋กœ์„œ ์ถ”์  ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ๋˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.
    • ์ด๋•Œ, ํ•ด๋‹น ํŒŒ์ผ์˜ tree ๊ฐ์ฒด์™€ commit ๊ฐ์ฒด๊ฐ€ .git/objects/์— ์ƒ์„ฑ๋œ๋‹ค.

 

๐Ÿ”ธ ๊ธฐ์กด ํŒŒ์ผ ์ˆ˜์ •: (Unmodified → Modified) → Staged → Committed

  • ๊ธฐ์กด ํŒŒ์ผ์€ ์ด๋ฏธ Git์— ์˜ํ•ด ์ถ”์ ๋˜์–ด์ง€๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ Git์€ ํ•ด๋‹น ํŒŒ์ผ์ด ์ˆ˜์ •๋˜์—ˆ๋Š”์ง€ ์•„๋‹Œ์ง€๋ฅผ ํ•ญ์ƒ ์ฒดํฌํ•œ๋‹ค.
  • ํŒŒ์ผ์ด ์ˆ˜์ •๋˜๋ฉด Unmodified์—์„œ modified๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
    • Git์ด ๋ณ€๊ฒฝ ๊ฐ์ง€๋ฅผ ํ•œ ๊ฒƒ์ด๋‹ค.
  • ์ดํ›„ git add๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด Staging area๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ ์ปค๋ฐ‹์„ ์ค€๋น„ํ•˜๊ฒŒ ๋œ๋‹ค.
    • ์ด ๊ณผ์ •์—์„œ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋œ ์ƒˆ blob ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
      • ์ด๋ฏธ ๋™์ผํ•œ ๋‚ด์šฉ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ดํ›„ commit์„ ํ•˜๊ฒŒ ๋˜๋ฉด  Git์€ ์ด ํŒŒ์ผ์„ ์ •์‹์œผ๋กœ ์ €์žฅ์†Œ์— ๊ธฐ๋กํ•œ๋‹ค.
    • ์ด๋•Œ, ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜๋œ ์ƒˆ tree๊ณผ commit ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

 

๐Ÿคง ๊ด€๋ จ ๋ช…๋ น์–ด

# ์Šคํ…Œ์ด์ง• ์˜์—ญ ์ •๋ณด ํ™•์ธ
$ git ls-files --stage

# ํ˜„์žฌ ์ปค๋ฐ‹ ํ•ด์‹œ ํ™•์ธ
$ git rev-parse HEAD

# ๊ฐ์ฒด ํƒ€์ž… ํ™•์ธ
$ git cat-file -t <ํ•ด์‹œ>

# ๊ฐ์ฒด ๋‚ด์šฉ ๋ณด๊ธฐ
$ git cat-file -p <ํ•ด์‹œ>

# tree ๋‚ด๋ถ€ ๊ตฌ์กฐ ๋ณด๊ธฐ
$ git ls-tree <treeํ•ด์‹œ>
  • ์•„๋ž˜ ์‹ค์Šต ๋•Œ ์‚ฌ์šฉํ•  ๋ช…๋ น์–ด์ด๋‹ค.
  • Git์˜ ๋‚ด๋ถ€ ๊ฐ์ฒด๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋ณ„๋„์˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๐Ÿ‘จ๐Ÿป‍๐Ÿ”ฌ init๋ถ€ํ„ฐ merge๊นŒ์ง€ Git์˜ ๋‚ด๋ถ€์˜ ๋ณ€ํ™” ์‚ดํŽด๋ณด๊ธฐ

# 1 ๋‹จ๊ณ„: Commit ํ•ด๋ณด๊ธฐ
git init
git add
git commit

# 2 ๋‹จ๊ณ„: ๋ธŒ๋žœ์น˜๋ฅผ ๋‚˜๋ˆ„๊ณ  merge ํ•ด๋ณด๊ธฐ
git checkout -b feature/test1
git merge
  • ์œ„ ์„ ์ˆ˜ ์ง€์‹ ๋‚ด์šฉ์„ ์–ด๋А์ •๋„ ์ดํ•ดํ•œ ์ƒํƒœ์—์„œ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด Git ๋‚ด๋ถ€์˜ ๋ณ€ํ™”๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

 

โ˜๐Ÿป 1 ๋‹จ๊ณ„: Commit ํ•ด๋ณด๊ธฐ

๐Ÿ–‹๏ธ ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ์‚ดํŽด๋ณด๊ธฐ(init -> commit)

  • ํ๋ฆ„ ์ˆœ์œผ๋กœ ๊ทธ๋ ค๋ณด์•˜๋‹ค.
  • ํฌ๊ฒŒ ์ƒˆ ํŒŒ์ผ ์ƒ์„ฑ๊ณผ ๊ธฐ์กด ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ ธ๋‹ค.
  • ์ž์„ธํ•œ ์„ค๋ช…์€ ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•˜์ž.

 

๐Ÿ‘‰๐Ÿป git init

$ mkdir git-internal-test
$ cd git-internal-test 
$ ls -al

# ์ถœ๋ ฅ(git ์ƒ์„ฑ ์ „)
total 0
drwxr-xr-x  2 root  staff   64  4 26 02:07 .
drwxr-xr-x  8 root  staff  256  4 26 02:07 ..

$ git init

# ์ถœ๋ ฅ(git ์ƒ์„ฑ ํ›„)
Initialized empty Git repository in /๊ฒฝ๋กœ/git-internal-test/.git/

$ ls -al
total 0
drwxr-xr-x  3 root  staff   96  4 26 02:07 .
drwxr-xr-x  8 root  staff  256  4 26 02:07 ..
drwxr-xr-x  9 root  staff  288  4 26 02:07 .git
  • git init ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ ํ•ด๋‹น ๋ฃจํŠธ ํด๋”์— .git ํด๋”๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ์ด์ œ ํ•ด๋‹น ํด๋”๋Š” working directory๊ฐ€ ๋˜๋ฉฐ Git์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

 

๐Ÿ“Œ .git ํด๋” ๋‚ด๋ถ€ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ธฐ

/.git$ ll

# ์ถœ๋ ฅ
total 24
-rw-r--r--   1 root  staff  137  4 26 02:07 config
-rw-r--r--   1 root  staff   73  4 26 02:07 description
-rw-r--r--   1 root  staff   21  4 26 02:07 HEAD
drwxr-xr-x  15 root  staff  480  4 26 02:07 hooks
drwxr-xr-x   3 root  staff   96  4 26 02:07 info
drwxr-xr-x   4 root  staff  128  4 26 02:07 objects
drwxr-xr-x   4 root  staff  128  4 26 02:07 refs
  • .git ๋‚ด๋ถ€์—๋Š” ๊ฝค๋‚˜ ๋งŽ์€ ํŒŒ์ผ๊ณผ ํด๋”๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๋œฏ์–ด๋ณด์ž.
  • Git์˜ ๊ฐ์ฒด ์ดํ•ด์— ์ดˆ์ ์„ ๋‘๊ณ  ์‹ถ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์€ ๊ฑด๋„ˆ๋›ฐ์–ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.

 

๐Ÿ’ผ  ํŒŒ์ผ

๐Ÿ”ต config ํŒŒ์ผ

$ cat config 

# ์ถœ๋ ฅ
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
  • Git Repository์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ์„ค์ • ํŒŒ์ผ์ด๋‹ค.
  • ๊ฐ€๋ณ๊ฒŒ ๋„˜์–ด๊ฐ€์ž.

๐Ÿ”ธ repositoryformatversion

  • Repository์˜ ํฌ๋งท ๋ฒ„์ „์„ ๋œปํ•˜๋ฉฐ, ์ดˆ๊ธฐ ํฌ๋งท์€ 0์ด๋‹ค.
  • Git์— ์˜ํ•ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

๐Ÿ”ธ filemode

  • true์ผ ์‹œ git์ด ํŒŒ์ผ์˜ chmod ์‹คํ–‰ ๊ถŒํ•œ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•œ๋‹ค.
  • false์ผ ๊ฒฝ์šฐ ๊ถŒํ•œ์€ ๋ฌด์‹œํ•˜๊ณ  ๋‚ด์šฉ ๋ณ€๊ฒฝ๋งŒ ์ถ”์ ํ•œ๋‹ค.

๐Ÿ”ธ bare

  • bare repository์ธ์ง€์˜ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • true์ผ ๊ฒฝ์šฐ bare repository๋ผ๋Š” ๋œป์ด๋‹ค.
    • .git ํด๋”๋งŒ ์ €์žฅํ•˜๋Š”๋ฐ, ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ์ผ ๋‚ด์šฉ(Working Directory) ์—†์ด git์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋งŒ์„ ์ €์žฅํ•œ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ฝ”๋“œ ํŒŒ์ผ์ด ์กด์žฌํ•  ๊ฒฝ์šฐ ํŒŒ์ผ ๊ผฌ์ž„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— .git ํด๋”๋งŒ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋‚ด๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(์ปค๋ฐ‹, ๋ธŒ๋žœ์น˜ ๋“ฑ)๋งŒ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
      • ๋”ฐ๋ผ์„œ bare repository๋Š” ๋ฒ„์ „(commit ๊ธฐ๋ก)๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ™œ์šฉํ•ด ์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ์ €์žฅ์†Œ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • GitHub๋Š” ์ด bare repository๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์›น์ƒ์—์„œ ์ฝ”๋“œ ํŒŒ์ผ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์‹œ๊ฐํ™”ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค๋‹ค.
      • GitHub ํ™”๋ฉด์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฝ”๋“œ ํŒŒ์ผ์„ ๋ณด๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ด์œ ๋Š” bare repository์— ์ €์žฅ๋œ Git ๊ฐ์ฒด๋“ค(blob, tree ๋“ฑ)์„ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • false์ผ ๊ฒฝ์šฐ working directory๊ฐ€ ์กด์žฌํ•˜๋Š”, ์šฐ๋ฆฌ๊ฐ€ ์•„๋Š” ์ผ๋ฐ˜ ๊นƒ ์ €์žฅ์†Œ์ด๋‹ค.

๐Ÿ”ธ logallrefupdates

  • ๋ธŒ๋žœ์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งˆ๋‹ค ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธธ์ง€ ์—ฌ๋ถ€์ด๋‹ค.
  • true์ผ ๊ฒฝ์šฐ ๋ธŒ๋žœ์น˜๊ฐ€ ์˜ฎ๊ฒจ๊ฐˆ ๋•Œ๋งˆ๋‹ค .git/logs/ ๋ฐ‘์— ๊ธฐ๋ก์ด ์Œ“์ธ๋‹ค.

๐Ÿ”ธ ignorecase

  • ํŒŒ์ผ ์ด๋ฆ„ ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—ฌ๋ถ€์ด๋‹ค.

๐Ÿ”ธ precomposeunicode

  • ์œ ๋‹ˆ์ฝ”๋“œ ์ •๊ทœํ™” ๊ด€๋ จ ์„ค์ • ์—ฌ๋ถ€์ด๋‹ค.
    • MacOS์—์„œ๋Š” ํŒŒ์ผ ์ด๋ฆ„์— ์œ ๋‹ˆ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ๋•Œ ์กฐํ•ฉํ˜•(normalization)์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
    • true์ผ ๊ฒฝ์šฐ ์ด๋ฅผ ๊ฐ์•ˆํ•ด์„œ ์ด๋ฆ„์„ ๋งž์ถฐ์„œ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•œ๋‹ค.

 

๐Ÿ”ต description ํŒŒ์ผ

$ cat description 

# ์ถœ๋ ฅ
Unnamed repository; edit this file 'description' to name the repository.
  • ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ์ œ๊ณตํ•œ๋‹ค.

 

๐Ÿ”ต HEAD ํŒŒ์ผ

$ cat HEAD

# ์ถœ๋ ฅ
ref: refs/heads/main
  • Git์—์„œ ํ˜„์žฌ ์ฒดํฌ์•„์›ƒํ•œ ๋ธŒ๋žœ์น˜์˜ ํด๋” ๊ฒฝ๋กœ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.

 

๐Ÿ’ผ ๋””๋ ‰ํ„ฐ๋ฆฌ

๐ŸŸข hooks/

/hooks$ ll

# ์ถœ๋ ฅ
total 120
-rwxr-xr-x  1 root  staff   478  4 26 02:07 applypatch-msg.sample
-rwxr-xr-x  1 root  staff   896  4 26 02:07 commit-msg.sample
-rwxr-xr-x  1 root  staff  4726  4 26 02:07 fsmonitor-watchman.sample
-rwxr-xr-x  1 root  staff   189  4 26 02:07 post-update.sample
-rwxr-xr-x  1 root  staff   424  4 26 02:07 pre-applypatch.sample
-rwxr-xr-x  1 root  staff  1643  4 26 02:07 pre-commit.sample
-rwxr-xr-x  1 root  staff   416  4 26 02:07 pre-merge-commit.sample
-rwxr-xr-x  1 root  staff  1374  4 26 02:07 pre-push.sample
-rwxr-xr-x  1 root  staff  4898  4 26 02:07 pre-rebase.sample
-rwxr-xr-x  1 root  staff   544  4 26 02:07 pre-receive.sample
-rwxr-xr-x  1 root  staff  1492  4 26 02:07 prepare-commit-msg.sample
-rwxr-xr-x  1 root  staff  2783  4 26 02:07 push-to-checkout.sample
-rwxr-xr-x  1 root  staff  3650  4 26 02:07 update.sample
  • git์˜ ์ด๋ฒคํŠธ ์ž๋™ํ™” ํด๋”์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด commit์ด๋‚˜ push๋ฅผ ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

 

๐ŸŸข info/

/info$ ll

# ์ถœ๋ ฅ
total 8
-rw-r--r--  1 root  staff  240  4 26 02:07 exclude
  • ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํด๋”์ด๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ์„ค์ • ์™ธ์— exclude(ํŠน์ • ํŒŒ์ผ๋งŒ ๋ฌด์‹œํ•˜๋Š” ์„ค์ •) ํŒŒ์ผ ๋“ฑ์ด ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค.

 

๐ŸŸข object/

/objects$ ll

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  2 root  staff  64  4 26 02:07 info
drwxr-xr-x  2 root  staff  64  4 26 02:07 pack

/objects/info$ls -al

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  2 root  staff   64  4 26 02:07 .
drwxr-xr-x  4 root  staff  128  4 26 02:07 ..

/objects/pack$ls -al

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  2 root  staff   64  4 26 02:07 .
drwxr-xr-x  4 root  staff  128  4 26 02:07 ..
  • git์˜ ํ•ต์‹ฌ ํด๋”์ด๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  ์ปค๋ฐ‹, ํŒŒ์ผ, ํด๋” ๋“ฑ ์ง„์งœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ชจ๋‘ ์—ฌ๊ธฐ์— ์ €์žฅ๋œ๋‹ค.
  • ์••์ถ•๋œ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ๋ช…๋ น์–ด๋‚˜ ์™ธ๋ถ€ parser๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋…ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐ŸŸข refs/

/refs$ ll

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  2 root  staff  64  4 26 02:07 heads
drwxr-xr-x  2 root  staff  64  4 26 02:07 tags

/refs/heads$ ls -al

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  2 root  staff   64  4 26 02:07 .
drwxr-xr-x  4 root  staff  128  4 26 02:07 ..
  • ๋ธŒ๋žœ์น˜๋ž‘ ํƒœ๊ทธ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • git init์œผ๋กœ ์–ด๋– ํ•œ ์ปค๋ฐ‹์ž‘์—…๋„ ์—†์„ ๋•Œ์—๋Š” heads, tags ํด๋”๊ฐ€ ๋น„์–ด์žˆ๋‹ค.
    • ๋‚˜์ค‘์— commit์„ ํ•˜๊ฒŒ ๋˜๋ฉด heads์— ๋ธŒ๋žœ์น˜ ๋ช…์˜ ํŒŒ์ผ ์ƒ์„ฑ๋œ๋‹ค.
    • ํ˜น์€ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น ๋ธŒ๋žœ์น˜ ๋ช…์˜ ํŒŒ์ผ์ด ์ถ”๊ฐ€๋œ๋‹ค.
    • ์ด ํŒŒ์ผ์— ํ•ด๋‹น ๋ธŒ๋žœ์น˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ปค๋ฐ‹์˜ SHA-1 ํ•ด์‹œ๊ฐ€ ์ €์žฅ๋œ๋‹ค.

 

๐Ÿ‘จ๐Ÿป‍๐Ÿ”ฌ ๋ณธ๊ฒฉ์ ์ธ ์‹ค์Šต ์‹œ์ž‘

๐Ÿ‘‰๐Ÿป git add

๐Ÿ”ธ git ํด๋” ๋‚ด ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ƒ์„ฑ

# git init์„ ํ•œ ์ตœ์ดˆ ํด๋” ๋‚ด๋ถ€์—์„œ fitst.text ํŒŒ์ผ์— i am iron man. ์ž…๋ ฅ ํ›„ ์ €์žฅ
$ echo "i am iron man." > first.text

$ ll

# ์ถœ๋ ฅ
total 8
-rw-r--r--  1 root  staff  15  4 28 01:39 first.text
  • ์šฐ์„  ์ƒˆ๋กœ์šด ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.
  • ์ตœ์ดˆ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด Git์— ์˜ํ•ด ์ถ”์ ๋˜์ง€ ์•Š๊ณ  ์žˆ๋Š” untracked ํŒŒ์ผ์ด ์ถ”๊ฐ€๋œ๋‹ค.

 

๐Ÿ”ธ git add - ์Šคํ…Œ์ด์ง• ์˜์—ญ์— ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ถ”๊ฐ€ํ•˜๊ธฐ

# git add ํ•˜๊ธฐ ์ „
$ git status # ์ƒํƒœ ํ™•์ธ ๋ช…๋ น์–ด

# ์ถœ๋ ฅ
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	first.text

nothing added to commit but untracked files present (use "git add" to track)

# git add ํ•œ ํ›„
$ git add first.text
$ git status  

# ์ถœ๋ ฅ
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   first.text
  • git add ๋ช…๋ น์–ด๋ฅผ ํ•˜๊ธฐ ์ „๊ณผ ํ›„ git status๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด Git์ด first.text ํŒŒ์ผ์„ ์ถ”์ ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๊ฐ€, ์ถ”์ ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋Š” git add๋กœ ์ธํ•ด first.text ํŒŒ์ผ์ด ์Šคํ…Œ์ด์ง• ์˜์—ญ(Index)์œผ๋กœ ๋“ค์–ด๊ฐ”์Œ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์•„์ง ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ปค๋ฐ‹ํ•  ์ค€๋น„๋ฅผ ๋๋ƒˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”ธ Git ๋‚ด๋ถ€์—์„œ๋Š”?

# ์Šคํ…Œ์ด์ง• ์˜์—ญ ์ •๋ณด ํ™•์ธ ๋ช…๋ น์–ด
$ git ls-files --stage

# ์ถœ๋ ฅ
100644 8e21e230620d2380b2fee92cf506ea4e4dc3363a 0	first.text

# objects ํด๋” ๋‚ด blob ๊ฐ์ฒด ์ƒ์„ฑ ํ™•์ธํ•ด๋ณด๊ธฐ
/.git/objects$ ll

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  3 root  staff  96  4 28 01:43 8e
drwxr-xr-x  2 root  staff  64  4 26 02:07 info
drwxr-xr-x  2 root  staff  64  4 26 02:07 pack

/.git/object$ cd 8e 
/.git/objects/8e$ ll

# ์ถœ๋ ฅ
total 8
-r--r--r--  1 root  staff  31  4 28 01:43 21e230620d2380b2fee92cf506ea4e4dc3363a

# blob ๊ฐ์ฒด ๋‚ด์šฉ ํ™•์ธ ํ•ด๋ณด๊ธฐ
$ git cat-file -p 8e21e230620d2380b2fee92cf506ea4e4dc3363a

# ์ถœ๋ ฅ
i am iron man.
  • git add ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด first.text ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ฝ๊ณ  SHA-1 ํ•ด์‹œ๋ฅผ ์ƒ์„ฑ(๋‹ค๋ฅธ ๊ฐ์ฒด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€)ํ•œ๋‹ค.
  • ์ด ๋‚ด์šฉ์„ blob ๊ฐ์ฒด๋กœ ๋งŒ๋“ค์–ด .git/object ํด๋” ์•ˆ์— ์ €์žฅํ•˜๋Š”๋ฐ ํ•ด์‹œ๊ฐ’์˜ ์•ž ๋‘ ๊ธ€์ž๋ฅผ ํด๋”๋ช…์œผ๋กœ ํ•˜๊ณ  ๋‚˜๋จธ์ง€ ๊ธ€์ž๋ฅผ ๋‚ด๋ถ€ ํŒŒ์ผ๋ช…์œผ๋กœ ํ•œ๋‹ค.
    • ์œ„์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด ๋งŒ๋“ค์–ด์ง„ blob ๊ฐ์ฒด๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋‹ค.

 

๐Ÿ”ธ .git/index

/.git$ ll 

# ์ถœ๋ ฅ
total 40
-rw-r--r--   1 root  staff  137  4 26 02:07 config
-rw-r--r--   1 root  staff   73  4 26 02:07 description
-rw-r--r--   1 root  staff   21  4 26 02:07 HEAD
drwxr-xr-x  15 root  staff  480  4 26 02:07 hooks
-rw-r--r--   1 root  staff  145  4 28 02:10 index # ์ƒˆ๋กœ ์ƒ์„ฑ
drwxr-xr-x   3 root  staff   96  4 26 02:07 info
drwxr-xr-x   4 root  staff  128  4 28 02:10 logs
drwxr-xr-x   7 root  staff  224  4 28 02:10 objects
drwxr-xr-x   4 root  staff  128  4 26 02:07 refs

# cat ๋ช…๋ น์–ด๋กœ ๋‚ด๋ถ€ ๋‚ด์šฉ ํ™•์ธํ•˜๊ธฐ(์‹คํŒจ)
/.git$ cat index 

# ์ถœ๋ ฅ
#????,??NM?6:?'za?
first.textTREE1 0
#??t"/?R?? ?nSz?q?H?9x???฿ฃ8???@??%

# ๋ณ„๋„์˜ ๋ช…๋ น์–ด๋กœ ๋‚ด๋ถ€ ๋‚ด์šฉ ํ™•์ธํ•˜๊ธฐ(์„ฑ๊ณต)
/.git$ git ls-files --stage

# ์ถœ๋ ฅ
100644 8e21e230620d2380b2fee92cf506ea4e4dc3363a 0	first.text
  • .git/index๊ฐ€ ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. ์ด๋Š” Git์˜ ์Šคํ…Œ์ด์ง• ์˜์—ญ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์ด๋‹ค.  
    • ์ด ํŒŒ์ผ์—๋Š” git add๋ฅผ ํ†ตํ•ด ์ถ”๊ฐ€๋œ ํŒŒ์ผ๋“ค์˜ blob ํ•ด์‹œ์™€ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค. 
    • .git/index๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ํฌ๋งท์ด๋ฏ€๋กœ cat ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ๋ณด๋ฉด ๊นจ์ง„๋‹ค. 
    • git ls-files --stage์™€ ๊ฐ™์€ ๋ณ„๋„์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ํŒŒ์ผ์˜ blob ํ•ด์‹œ์™€ ์Šคํ…Œ์ด์ง• ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ‘‰๐Ÿป git commit

$ git commit -m "first commit"

# ์ถœ๋ ฅ
[main (root-commit) b19a9f1] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 first.text
  • ์ฒซ ๋ฒˆ์งธ commit์ด ์‹คํ–‰๋จ์œผ๋กœ์จ Git์€ first.text๋ผ๋Š” ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ฒซ๋ฒˆ์งธ ๋ฒ„์ „์„ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

๐Ÿ”ธ Git ๋‚ด๋ถ€์—์„œ๋Š”?

/.git$ cd objects 
/.git/objects$ll

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  3 root  staff  96  4 28 02:10 82 # ์ƒˆ๋กœ ์ƒ์„ฑ
drwxr-xr-x  3 root  staff  96  4 28 01:43 8e
drwxr-xr-x  3 root  staff  96  4 28 02:10 b1 # ์ƒˆ๋กœ ์ƒ์„ฑ
drwxr-xr-x  2 root  staff  64  4 26 02:07 info
drwxr-xr-x  2 root  staff  64  4 26 02:07 pack

# ํ˜„์žฌ HEAD๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ์ปค๋ฐ‹ ํ•ด์‹œ ์กฐํšŒ
/.git$ git rev-parse HEAD

# ์ถœ๋ ฅ
b19a9f14568ce6ed7b22f02f2cecdd6aeff6929e
  • .git/objects/์— tree, commit ๊ฐ์ฒด๊ฐ€ ์ถ”๊ฐ€๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฐธ๊ณ ๋กœ, ํ˜„์žฌ HEAD์— ์ปค๋ฐ‹ ํ•ด์‹œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด commit ๊ฐ์ฒด์˜ ํ•ด์‹œ๊ฐ’์ด ๋‚˜์˜จ๋‹ค.

 

๐Ÿ”ธ refs/heads

/.git/$ cd refs
/.git/refs$ cd heads 
/.git/refs/heads$ ll

# ์ถœ๋ ฅ
total 8
-rw-r--r--  1 root  staff  41  4 28 02:10 main

# main ์ถœ๋ ฅ
/.git/refs/heads$ cat main 
b19a9f14568ce6ed7b22f02f2cecdd6aeff6929e
  • ๋˜ํ•œ, .git/refs/heads/main์— ์ด ์ปค๋ฐ‹ ๊ฐ์ฒด์˜ ํ•ด์‹œ๊ฐ’์ด ๊ธฐ๋ก๋œ๋‹ค.

 

๐Ÿ”ธ commit ๊ฐ์ฒด๋กœ tree, blob ํ•ด์‹œ๊ฐ’ ์ฐพ์•„๋ณด๊ธฐ

# ๊ฐ์ฒด ํƒ€์ž… ํ™•์ธ
/.git$ git cat-file -t b19a9f14568ce6ed7b22f02f2cecdd6aeff6929e

# ์ถœ๋ ฅ
commit

# ๊ฐ์ฒด ์ •๋ณด ํ™•์ธ
/.git$ git cat-file -p b19a9f14568ce6ed7b22f02f2cecdd6aeff6929e

# ์ถœ๋ ฅ
tree 82a374221b7e2f8252a0f020c56e53167aab71b0
author root <111210881+xxxxxx@users.noreply.github.com> 1745773845 +0900
committer root <111210881+xxxxxx@users.noreply.github.com> 1745773845 +0900

# ๊ฐ์ฒด ์ •๋ณด ํ™•์ธ
/.git$ git cat-file -p 82a374221b7e2f8252a0f020c56e53167aab71b0

# ์ถœ๋ ฅ
100644 blob 8e21e230620d2380b2fee92cf506ea4e4dc3363a	first.text
  • git cat-file -t์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ํƒ€์ž…์„ ์ถœ๋ ฅํ•œ๋‹ค.
  • git cat-file -p์˜ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ์ด๋ฅผ ์ด์šฉํ•˜์—ฌ commit๊ฐ์ฒด๋ฅผ ๊ฐ€์ง€๊ณ  tree์™€ blob ๊ฐ์ฒด๊นŒ์ง€ ํ•ด์‹œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿซฅ ์ค‘๊ฐ„ ์ •๋ฆฌ

  • Git์€ add์™€ commit ๊ณผ์ •์„ ํ†ตํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ blob, tree, commit ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ณ€๊ฒฝ ๋‚ด์—ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

โœŒ๐Ÿป 2 ๋‹จ๊ณ„: ๋ธŒ๋žœ์น˜๋ฅผ ๋‚˜๋ˆ„๊ณ  merge ํ•ด๋ณด๊ธฐ

  • ์ด์ œ ๋ธŒ๋žœ์น˜๋ฅผ ๋‚˜๋ˆ„๊ณ  merge ํ•˜๋Š” ๊ณผ์ •์„ ๊ฐ€๋ณ๊ฒŒ ์•Œ์•„๋ณด์ž. Git ๋‚ด๋ถ€์ ์ธ ๊ฐ์ฒด์˜ ๋ณ€ํ™”๋Š” ์œ„์— ์ถฉ๋ถ„ํžˆ ์„ค๋ช…ํ–ˆ์œผ๋ฏ€๋กœ ์ƒ๋‹น ๋ถ€๋ถ„ ์ƒ๋žตํ•œ๋‹ค.

 

๐Ÿ‘‰๐Ÿป  git checkout -b feature/test1

# feature/test1 ๋ธŒ๋žœ์น˜๋กœ ๋ณ€๊ฒฝ
$ git checkout -b feature/test1

# ์ถœ๋ ฅ
Switched to a new branch 'feature/test1'

# HEAD์˜ ๋ธŒ๋žœ์น˜ ์กฐํšŒํ•˜์—ฌ ๋ธŒ๋žœ์น˜ ๋ณ€๊ฒฝ ํ™•์ธ
/.git $cat HEAD
ref: refs/heads/feature/test1

# ์‹ค์ œ ํด๋” ๊ฒฝ๋กœ ๋“ค์–ด๊ฐ€์„œ ์ƒˆ๋กœ ์ƒ์„ฑ๋จ์„ ํ™•์ธํ•ด๋ณด๊ธฐ
/.git$ cd refs/heads 
/.git/refs/heads$ ll

# ์ถœ๋ ฅ
total 8
drwxr-xr-x  3 root  staff  96  4 29 02:32 feature # ์ƒˆ๋กœ ์ƒ์„ฑ
-rw-r--r--  1 root  staff  41  4 28 02:10 main

/feature$ ll

# ์ถœ๋ ฅ
total 8
-rw-r--r--  1 wonyong  staff  41  4 29 02:32 test1
  • ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  HEAD ๋ธŒ๋žœ์น˜๋ฅผ ์กฐํšŒํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ๋ธŒ๋žœ์น˜์ž„์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ, ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด feature/test1์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ธŒ๋žœ์น˜ ํด๋” ๋ฐ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”ธ ํŒŒ์ผ ๋ณ€๊ฒฝํ•ด ๋ณด๊ธฐ

# ํŒŒ์ผ ๋ณ€๊ฒฝ ์ „
/git-internal-test$ git status                        

# ์ถœ๋ ฅ
On branch feature/test1
nothing to commit, working tree clean

# ํŒŒ์ผ ๋ณ€๊ฒฝ
/git-internal-test$ echo "i am not iron man." > first.text # ">"๋Š” ํŒŒ์ผ ๋ฎ์–ด์“ฐ๊ธฐ์ž„
/git-internal-test$ git status

# ์ถœ๋ ฅ
On branch feature/test1
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   first.text

no changes added to commit (use "git add" and/or "git commit -a")
  • ์œ„์˜ ์„ค๋ช…์— ์ด์–ด feature/test1์—์„œ ์ง„ํ–‰ ์ค‘์ด๋‹ค.
  • ํŒŒ์ผ์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†๋Š” unmodified์˜€๋‹ค๊ฐ€, ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ modified๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค.

 

๐Ÿ”ธ blob ๊ฐ์ฒด ์ถ”๊ฐ€ ํ™•์ธํ•˜๊ธฐ

/git-internal-test$ git add first.text 
/git-internal-test$ cd .git/objects 
/.git/objects$ ll

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  3 root  staff  96  4 28 02:10 82
drwxr-xr-x  3 root  staff  96  4 28 01:43 8e # ์ฒซ๋ฒˆ์งธ blob ๊ฐ์ฒด
drwxr-xr-x  3 root  staff  96  4 29 02:47 9f # ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ blob ๊ฐ์ฒด
drwxr-xr-x  3 root  staff  96  4 28 02:10 b1
drwxr-xr-x  2 root  staff  64  4 26 02:07 info
drwxr-xr-x  2 root  staff  64  4 26 02:07 pack

# ์Šคํ…Œ์ด์ง• ์˜์—ญ ์ •๋ณด ํ™•์ธํ•˜๊ธฐ
$ git ls-files --stage

# ์ถœ๋ ฅ(first.text์— ํ•ด๋‹นํ•˜๋Š” blob ๊ฐ์ฒด์˜ ํ•ด์‹œ๊ฐ’์ด ๋ณ€๊ฒฝ๋จ)
100644 9fe8f948e6de78c9f7627aba2632e6b0c80c6fb7 0	first.text
  • ์œ„์˜ ์„ค๋ช…์— ์ด์–ด feature/test1์—์„œ ์ง„ํ–‰ ์ค‘์ด๋‹ค.
  • git add ๋ช…๋ น์–ด๋กœ first.text์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์Šคํ…Œ์ด์ง• ์˜์—ญ์œผ๋กœ ์˜ฌ๋ ธ๋‹ค.
  • ๋ณ€๊ฒฝ๋œ ์ƒˆ๋กœ์šด blob ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ ์Šคํ…Œ์ด์ง• ์˜์—ญ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด ๋ณด๋ฉด ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ blob ๊ฐ์ฒด๋กœ ํ•ด์‹œ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ‘‰๐Ÿป  git commit

# ๋‘๋ฒˆ์งธ ์ปค๋ฐ‹ํ•˜๊ธฐ
$ git commit -m "second commit"
 
 # ์ถœ๋ ฅ
[feature/test1 8ed69f8] second commit
 1 file changed, 1 insertion(+), 1 deletion(-)
 
# ์ปค๋ฐ‹ ์ •๋ณด ํ™•์ธํ•˜๊ธฐ
$ git rev-parse HEAD
8ed69f812495b68a4bafb47074f8efa7e9a0e845

# object์— ๋‘๋ฒˆ์งธ ์ปค๋ฐ‹์— ์˜ํ•ด ์ถ”๊ฐ€๋œ tree, commit ๊ฐ์ฒด ํ™•์ธํ•ด๋ณด๊ธฐ
/.git$ cd objects 
/.git/objects$ ll

# ์ถœ๋ ฅ
total 0
drwxr-xr-x  3 root  staff   96  4 29 02:50 76 # ๋‘๋ฒˆ์งธ tree ๊ฐ์ฒด
drwxr-xr-x  3 root  staff   96  4 28 02:10 82 # ์ฒซ๋ฒˆ์งธ tree ๊ฐ์ฒด
drwxr-xr-x  4 root  staff  128  4 29 02:50 8e # ๋‘๋ฒˆ์งธ commit ๊ฐ์ฒด, ์ฒซ๋ฒˆ์งธ blob ๊ฐ์ฒด(๋‘ ๊ฐ์ฒด์˜ ํ•ด์‹œ๊ฐ’ ์ฒซ ๋‘์ž๋ฆฌ๊ฐ€ ๊ฐ™์•„์„œ ๊ฐ™์€ ํด๋”์— ๋“ค์–ด๊ฐ)
drwxr-xr-x  3 root  staff   96  4 29 02:47 9f # ๋‘๋ฒˆ์งธ blob ๊ฐ์ฒด
drwxr-xr-x  3 root  staff   96  4 28 02:10 b1 # ์ฒซ๋ฒˆ์งธ commit ๊ฐ์ฒด
drwxr-xr-x  2 root  staff   64  4 26 02:07 info
drwxr-xr-x  2 root  staff   64  4 26 02:07 pack

# commit ๊ฐ์ฒด ์ •๋ณด ์ถœ๋ ฅ
$ git cat-file -p 8ed69f812495b68a4bafb47074f8efa7e9a0e845
tree 766ad35e3fee28e3b41e90d64ee650546fa88383
parent b19a9f14568ce6ed7b22f02f2cecdd6aeff6929e # ๋ถ€๋ชจ tree ๊ฐ์ฒด ์ถ”๊ฐ€
author root <111210881+xxxxxx@users.noreply.github.com> 1745862647 +0900
committer root <111210881+xxxxxx@users.noreply.github.com> 1745862647 +0900

second commit

# ๊นƒ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„ ์ถœ๋ ฅ
$ git log --oneline --graph --all

* 8ed69f8 (HEAD -> feature/test1) second commit
* b19a9f1 (main) first commit
  • ์œ„์˜ ์„ค๋ช…์— ์ด์–ด feature/test1์—์„œ ์ง„ํ–‰ ์ค‘์ด๋‹ค.
  • commit์„ ์™„๋ฃŒํ•˜๋ฉด ์ƒˆ๋กœ์šด tree ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • commit์„ ์™„๋ฃŒํ•˜๋ฉด commit ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค.
  • ๋˜ํ•œ, ๋‘ ๋ฒˆ์งธ commit ๊ฐ์ฒด ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋ถ€๋ชจ tree ๊ฐ์ฒด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ถ”๊ฐ€๋กœ ํ‘œ์‹œ๋œ๋‹ค.
  • ์ปค๋ฐ‹ ์ด๋ ฅ์„ ๊ทธ๋ž˜ํ”„ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๋ฉด feature/test1 ๋ธŒ๋žœ์น˜์—์„œ second commit ๊ธฐ๋ก์ด ์ถ”๊ฐ€๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ”ธ main ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์˜ค๊ธฐ

$ git checkout main

# ์ถœ๋ ฅ
Switched to branch 'main'

# main ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์™€ ์Šคํ…Œ์ด์ง• ์˜์—ญ ์ •๋ณด ์ถœ๋ ฅํ•˜๊ธฐ
$ git ls-files --stage
100644 8e21e230620d2380b2fee92cf506ea4e4dc3363a 0	first.text

# main ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์™€ HEAD์˜ ์ปค๋ฐ‹ ๊ฐ์ฒด ํ•ด์‹œ๊ฐ’ ์ถœ๋ ฅํ•˜๊ธฐ
$ git rev-parse HEAD

# ์ถœ๋ ฅ
b19a9f14568ce6ed7b22f02f2cecdd6aeff6929e
  • main ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์˜ค๋ฉด ๊ธฐ์กด์— ์žˆ๋˜ ๊ทธ๋Œ€๋กœ ์ฒซ ๋ฒˆ์งธ ์Šคํ…Œ์ด์ง• ์˜์—ญ์˜ blob ๊ฐ์ฒด์™€, ์ฒซ๋ฒˆ์งธ commit ๊ฐ์ฒด ํ•ด์‹œ๊ฐ’์ด ์ถœ๋ ฅ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • main ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์˜ค๋ฉด HEAD๊ฐ€ ๋‹ค์‹œ main ๋ธŒ๋žœ์น˜์˜ ๋งˆ์ง€๋ง‰ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๊ณ , .git/index๋„ ํ•ด๋‹น ์ปค๋ฐ‹์— ๋งž๊ฒŒ ๋ณต์›๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋”ฐ๋ผ์„œ ์ด์ „์— main ๋ธŒ๋žœ์น˜์—์„œ ์Šคํ…Œ์ด์ง• ๋œ ์ƒํƒœ์™€ commit ๋‚ด์šฉ์ด ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋ธŒ๋žœ์น˜๋งˆ๋‹ค HEAD ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” commit ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด ๋ธŒ๋žœ์น˜ ๋ณ„ ์ž‘์—…์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ‘‰๐Ÿป  git merge

  • ์šฐ์„  main ๋ธŒ๋žœ์น˜์™€ feature/test1์„ merge ํ•ด๋ณด์ž.
# main ๋ธŒ๋žœ์น˜์—์„œ first.txt ์ถœ๋ ฅ
$ cat first.text 

# ์ถœ๋ ฅ
i am iron man. # ๋งจ ์ฒ˜์Œ main ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ

# main ๋ธŒ๋žœ์น˜์—์„œ ๊นƒ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„ ์ถœ๋ ฅ
$ git log --oneline --graph --all

# ์ถœ๋ ฅ
* 8ed69f8 (feature/test1) second commit
* b19a9f1 (HEAD -> main) first commit # HEAD๊ฐ€ main์œผ๋กœ ๋‚˜์˜ด

# main ๋ธŒ๋žœ์น˜์—์„œ ์ƒˆ๋กœ์šด ํŒŒ์ผ ์ถ”๊ฐ€
$ echo "i am thanos." >> second.txt 

# git add & git commit
$ git add second.txt 
$ git commit -m "second commit in main" 

# ์ถœ๋ ฅ
[main 0a4bb61] second commit in main
 1 file changed, 1 insertion(+)
 create mode 100644 second.txt
 
# main ๋ธŒ๋žœ์น˜์—์„œ ๊นƒ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„ ๋‹ค์‹œ ์ถœ๋ ฅ
# A : ํ˜„์žฌ main ๋ธŒ๋žœ์น˜(first commit ๋Œ€๋น„ ๋ณ€๊ฒฝ์‚ฌํ•ญ : second.txt "i am thanos.")
# B : feature/test1 ๋ธŒ๋žœ์น˜(first commit ๋Œ€๋น„ ๋ณ€๊ฒฝ์‚ฌํ•ญ : first.text "i am not iron man.")
$ git log --oneline --graph --all
* 0a4bb61 (HEAD -> main) second commit in main # A
| * 8ed69f8 (feature/test1) second commit # B
|/  
* b19a9f1 first commit

# feature/test1 ๋ธŒ๋žœ์น˜์™€ merge ํ•ด๋ณด๊ธฐ
$ git merge feature/test1

# ์ถœ๋ ฅ
Merge made by the 'ort' strategy.
 first.text | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

# first.txt ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ
$ cat first.text 

# ์ถœ๋ ฅ
i am not iron man.

# merge ํ›„ main ๋ธŒ๋žœ์น˜์—์„œ ๊นƒ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„ ์ถœ๋ ฅํ•˜๊ธฐ
$ git log --oneline --graph --all

# ์ถœ๋ ฅ
# merge(first.text "i am not iron man., second.txt "i am thanos.")
*   283c20c (HEAD -> main) Merge branch 'feature/test1'
|\  
| * 8ed69f8 (feature/test1) second commit
* | 0a4bb61 second commit in main
|/  
* b19a9f1 first commit

# merge commit ๊ฐ์ฒด ์ •๋ณด ์กฐํšŒํ•˜๊ธฐ
/.git/objects/28$ git cat-file -p 283c20c2160c49dcade03214b6755cea8c370833

# ์ถœ๋ ฅ(ํ˜„์žฌ ๋ธŒ๋žœ์น˜์™€ ๋ณ‘ํ•ฉ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ ์ปค๋ฐ‹ ํ•ด์‹œ๊ฐ€ parent commit ํ•ด์‹œ๋กœ ๋‘ ๊ฐœ ๋‚˜์˜จ๋‹ค.)
tree 39b858e782d8e744d823614963c8b20b685730f2
parent 0a4bb610d806d091823ffed17f3add24bd859e3f
parent 8ed69f812495b68a4bafb47074f8efa7e9a0e845
author root <111210881+xxxxxx@users.noreply.github.com> 1745866013 +0900
committer root <111210881+xxxxxx@users.noreply.github.com> 1745866013 +0900
  • merge์— ์„ฑ๊ณตํ•˜๋ฉด feature/test1 ๋ธŒ๋žœ์น˜์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด main ๋ธŒ๋žœ์น˜์— ๋ฐ˜์˜๋˜๊ณ , ๋‘ ๋ธŒ๋žœ์น˜์˜ ๊ธฐ๋ก์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ƒˆ๋กœ์šด merge commit์ด ์ƒ์„ฑ๋œ๋‹ค.
    • ์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด main ๋ธŒ๋žœ์น˜์˜ second.txt ํŒŒ์ผ("i am thanos.")์™€ feature/test1 ๋ธŒ๋žœ์น˜์˜ first.text ํŒŒ์ผ("i am not iron man.")์ด ๋ชจ๋‘ ๋ฐ˜์˜๋œ ์ƒˆ๋กœ์šด merge commit์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ํ•ด๋‹น merge commit ๊ฐ์ฒด๋Š” parent๊ฐ€ ๋‘ ๊ฐœ(ํ˜„์žฌ ๋ธŒ๋žœ์น˜, ๋ณ‘ํ•ฉ ๋Œ€์ƒ ๋ธŒ๋žœ์น˜์˜ commit ๊ฐ์ฒด)์ด๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ๋ณ‘ํ•ฉ๋œ ํŒŒ์ผ ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” tree ๊ฐ์ฒด๊ฐ€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฉฐ, ํŒŒ์ผ ๋‚ด์šฉ์ด ์ถ”๊ฐ€๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋Š” blob ๊ฐ์ฒด๋„ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.

 

๐Ÿ”ธ  ๊ณ ์˜๋กœ ์ถฉ๋Œ ๋‚ด๋ณด๊ธฐ

# main ๋ธŒ๋žœ์น˜์—์„œ feature/test2 ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
/git-internal-test$ git checkout -b feature/test2

# ์ถœ๋ ฅ
Switched to a new branch 'feature/test2'

# second.txt์— ๋ฌธ์žฅ ์ถ”๊ฐ€
$ echo "i am thor" >> second.txt

# feature/test2์˜ second.txt ์ถœ๋ ฅํ•ด๋ณด๊ธฐ 
$ cat second.txt 

# ์ถœ๋ ฅ
i am thanos.
i am thor

# main ๋ธŒ๋žœ์น˜๋กœ ๋Œ์•„์˜ค๊ธฐ
$ git switch main

# ์ถœ๋ ฅ
Switched to branch 'main'

# second.txt์— ๋‹ค๋ฅธ ๋ฌธ์žฅ ์ถ”๊ฐ€
$ echo "i am captain america" >> second.txt

# main์˜ second.txt ์ถœ๋ ฅํ•ด๋ณด๊ธฐ 
$ cat second.txt 

# ์ถœ๋ ฅ
i am thanos.
i am captain america

# ๊นƒ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ
$ git log --oneline --graph --all   

# ์ถœ๋ ฅ
# main ๋ธŒ๋žœ์น˜๋Š” "i am captain america"
# test2 ๋ธŒ๋žœ์น˜๋Š” "i am thor"
* 41b266d (HEAD -> main) feature/test2 - captain america
| * 4b19a0f (feature/test2) feature/test2 - thor 
|/  
*   283c20c Merge branch 'feature/test1'
|\  
| * 8ed69f8 (feature/test1) second commit
* | 0a4bb61 second commit in main
|/  
* b19a9f1 first commit

# merge ํ•ด๋ณด๊ธฐ
$ git merge feature/test2

# ์ถœ๋ ฅ(second.txt์— ๋‚ด์šฉ์ด ๋‹ฌ๋ผ ์ถฉ๋Œ ๋ฐœ์ƒ)
Auto-merging second.txt
CONFLICT (content): Merge conflict in second.txt
Automatic merge failed; fix conflicts and then commit the result.

# main์˜ second.txt ๋‹ค์‹œ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ 
$ cat second.txt 

# ์ถœ๋ ฅ(Git์—์„œ ์นœ์ ˆํžˆ ์ถฉ๋Œ ์ง€์ ์„ ํ‘œ์‹œํ•ด์คŒ)
i am thanos.
# <<<<<<< HEAD
i am captain america
=======
i am thor
>>>>>>> feature/test2

# ์ง์ ‘ ์ˆ˜์ • ํ•˜๋“ , ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์ˆ˜์ •ํ•˜๋“  main์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๊ธฐ
$ git checkout --ours second.txt

# main์˜ second.txt ๋‹ค์‹œ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ 
$ cat second.txt 

# ์ถœ๋ ฅ(main์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ์ถฉ๋Œ ํ•ด๊ฒฐ ํ•จ.)
i am thanos.
i am captain america

# git add & commit ํ†ตํ•ด merge commit ์ƒ์„ฑํ•˜์—ฌ ์ถฉ๋Œ ํ•ด๊ฒฐ
$ git add second.txt
$ git commit -m "merge conflict solved"

# ์ถœ๋ ฅ
[main 3e7e5ea] merge conflict solved

# ๊นƒ ์ปค๋ฐ‹ ๊ทธ๋ž˜ํ”„ ๋‹ค์‹œ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ
# A : merge ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ์ƒˆ๋กœ์šด merge ์ปค๋ฐ‹์ด ์ƒ์„ฑ ๋จ
# B : ์ถฉ๋Œ ์ปค๋ฐ‹("i am thor")
# C : ์ถฉ๋Œ ์ปค๋ฐ‹("i am captain america")
$ git log --oneline --graph --all 
*   3e7e5ea (HEAD -> main) merge conflict solved # A 
|\  
| * 4b19a0f (feature/test2) feature/test2 - thor # B
* | 41b266d feature/test2 - captain america # C
|/  
*   283c20c Merge branch 'feature/test1'
|\  
| * 8ed69f8 (feature/test1) second commit
* | 0a4bb61 second commit in main
|/  
* b19a9f1 first commit
  • ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ํ›„ git checkout --ours ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ํ˜„์žฌ(main) ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์„ ์„ ํƒํ–ˆ๋‹ค.
    • Auto๋กœ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์–ด ์ˆ˜๋™์œผ๋กœ ์ง์ ‘ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ด๋‹ค.
  • ์ดํ›„ git add๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ(merge ์ถฉ๋Œ ํ•ด๊ฒฐํ•œ ๋ถ€๋ถ„)์„ ์Šคํ…Œ์ด์ง• ์˜์—ญ์— ์˜ฌ๋ ธ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์— ๋”ฐ๋ผ ์ƒˆ๋กœ์šด blob ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ์ˆ˜๋„ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ง€๊ธˆ๊ณผ ๊ฐ™์ด ํ˜„์žฌ(main) ๋ธŒ๋žœ์น˜์˜ ๋‚ด์šฉ์„ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅด๋ฉด ๊ธฐ์กด blob ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์ฐธ์กฐํ•˜์—ฌ ์ƒˆ๋กœ์šด blob ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.
    • ๋งŒ์•ฝ, "i am antman."๊ณผ ๊ฐ™์€ ์ „ํ˜€ ๋‹ค๋ฅธ ์ƒˆ๋กœ์šด ๋‚ด์šฉ์œผ๋กœ ์ˆ˜์ •ํ•˜์—ฌ ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๋ฉด ์ƒˆ๋กœ์šด blob ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ git commit์„ ์‹คํ–‰ํ•˜๋ฉด ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•œ tree ๊ฐ์ฒด์™€ ๋‘ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ merge commit ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, ๋ณ‘ํ•ฉ ๊ฒฐ๊ณผ๊ฐ€ Git์— ์ตœ์ข…์ ์œผ๋กœ ๊ธฐ๋ก๋œ๋‹ค.

 

 

 

์ฐธ๊ณ 

Chat GPT

2025 ์˜คํ”ˆ์†Œ์Šค ์ปจํŠธ๋ฆฌ๋ทฐ์…˜ ์•„์นด๋ฐ๋ฏธ Git & Redis ์ˆ˜์—… ์ž๋ฃŒ

728x90