λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
TIL/Git

1. Git κΈ°λ³Έ - 2. Git의 원리 이해

by Edlin 2022. 6. 23.

 

“μ§€μ˜₯μ—μ„œ 온 κΉƒ”을 μ°Έκ³ ν•˜μ—¬ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

1. κΉƒ - κΈ°λ³Έ

  • Version Control System 쀑 ν•˜λ‚˜
  • 파일 이름을 λ°”κΎΈμ§€ μ•Šκ³  버전을 관리할 수 μžˆλ‹€.
    • How? Commit

1) κΉƒμ˜ 3κ°€μ§€ 핡심 κΈ°λŠ₯

  • Backup
  • Recovery
  • Collaboration

2) κΉƒμ˜ 기본적 μ‚¬μš© 방법

1️⃣ git init - μ €μž₯μ†Œλ₯Ό λ§Œλ“€μ–΄ 버전관리 ν•˜κ² λ‹€.

  • Create an empty Git repository or reinitialize an exisiting one
  • 즉, κΉƒ 리퍼지토리λ₯Ό μƒˆλ‘œ λ§Œλ“€κ±°λ‚˜, 기쑴의 κΉƒ 리퍼지토리λ₯Ό μž¬μ΄ˆκΈ°ν™”ν•˜κ³  싢을 λ•Œ
    • Git repository = Git μ €μž₯μ†Œ
  • 리퍼지토리λ₯Ό κΈ°μ€€μœΌλ‘œ 버전관리가 이루어진닀.

2️⃣ git add file - 이 파일의 버전 관리λ₯Ό μ‹œμž‘ν•˜κ² λ‹€. (컀밋 λŒ€κΈ°μƒνƒœ)

  • add : 컀밋 λŒ€κΈ°μƒνƒœ (stage area에 μ˜¬λΌκ°„ νŒŒμΌλ“€)
  • νŒŒμΌμ„ μ„ νƒν•˜μ—¬ 컀밋 λŒ€κΈ°μƒνƒœμ— 올릴 수 μžˆλ‹€.
# 예λ₯Ό λ“€μ–΄ file.txt λΌλŠ” νŒŒμΌμ„ ν˜„μž¬ μ €μž₯μ†Œμ— λ§Œλ“€μ—ˆλ‹€κ³  κ°€μ •ν•©μ‹œλ‹€ 
# νŒŒμΌμ— λŒ€ν•΄ 버전관리λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€
# νŒŒμΌμ— λŒ€ν•΄ 버전관리λ₯Ό μ‹œμž‘ν•˜κ² λ‹€λŠ” 것을 μ•Œλ €μ£ΌλŠ” 것이 'add' λͺ…λ Ήμ–΄ μž…λ‹ˆλ‹€.
# 파일이 μˆ˜μ •λ˜μ–΄ 버전관리 쀑인 νŒŒμΌμ— μˆ˜μ •μ΄ μΌμ–΄λ‚¬λ‹€λΌλŠ” 것을 μ•Œλ €μ€„ λ•Œλ„ 'add'λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 
>> git add f1.txt
>> git status # μƒˆλ‘œ μΆ”κ°€ν•œ 파일이 μ €μž₯μ†Œμ— λ“±λ‘λ˜μ—ˆλ‹€λŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ git commit - 파일의 버전에 λŒ€ν•œ 세뢀사항을 μž‘μ„±ν•œλ‹€.

  • 버전 = μ˜λ―ΈμžˆλŠ” λ³€ν™”
  • commit : 컀밋 μƒνƒœ (repository에 λ²„μ „μœΌλ‘œ λ“±λ‘λœ μƒνƒœ)
>> git commit # vim 이 μ‹€ν–‰λ©λ‹ˆλ‹€.
>> git commit -m "Initial commit" # κ°„λ‹¨ν•œ λ©”μ‹œμ§€λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
>> git commit -a # add 없이 commit message μž‘μ„± κ°€λŠ₯ (add + commit)
>> git commit -am # add 없이 commit messageλ₯Ό inline으둜 μž‘μ„±ν•  수 μžˆλ‹€. 

4️⃣ git log / git diff

  • 각각의 commit은 고유의 IDκ°€ μžˆλ‹€.
>> git log # ν˜„μž¬κΉŒμ§€ commit된 λ‚΄μš©μ„ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. 
>> git log commit_id # commit_id μ΄μ „κΉŒμ§€μ˜ commit을 μ•Œ 수 μžˆλ‹€.
>> git diff commit_id1..commitid3 # id1κ³Ό id3 μ‚¬μ΄μ˜ λ³€ν™”λ₯Ό μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ git reset vs. git revert

  • ν˜„μž¬μ˜ 둜그λ₯Ό μ·¨μ†Œν•΄μ„œ 과거의 νŠΉμ • 둜그둜 λŒμ•„κ°€κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.
  • local에 λŒ€ν•΄μ„œλ§Œ reset ν•„μš” - push ν›„μ—λŠ” reset ν•˜μ§€ 말 것
>> git log

# νŠΉμ • 둜그(commit_id)둜 λŒμ•„κ°€κ³  싢을 λ•Œ, λ‹€μŒ λͺ…λ Ήμ–΄ μ‚¬μš© 
# νŠΉμ • 둜그 λ’€ 컀밋이 λ‹€ μ§€μ›Œμ§„ κ²ƒμ²˜λŸΌ 보인닀. (μΆ”ν›„ 볡ꡬ κ°€λŠ₯)
# λŒμ•„κ°€κ³  싢은 νŠΉμ • commit_id에 headκ°€ μ‘΄μž¬ν•œλ‹€. 
>> git reset commit_id --hard
# νŠΉμ • 둜그λ₯Ό μ§€μš°κ³ , μƒˆλ‘œμš΄ 버전을 생성할 수 μžˆλ‹€. 
>> git revert 

2. .git

μ§€μ˜₯μ—μ„œ 온 GIT : 원리 - git add

1) git add μ‹œ μƒνƒœ λ³€ν™”

  • f1.txt λΌλŠ” νŒŒμΌμ„ μƒμ„±ν•˜μ—¬ git add f1.txt에 μ €μž₯ν•˜λ©΄ .git 디렉토리 μ•ˆμ— index 파일과 objects 폴더가 생긴닀

  • index : add된 νŒŒμΌμ— λŒ€ν•œ 기둝이 λ‹΄κ²¨μžˆλ‹€.
  • objects/ : add 된 파일의 μ‹€μ œ λ‚΄μš©μ΄ 담겨져 μžˆλ‹€.
    • 기둝은 계속 λ³΄κ΄€λ˜λ©° 이전 μƒνƒœλ‘œ λ˜λŒλ¦¬κ±°λ‚˜ νŠΉμ • μƒνƒœλ‘œ 볡ꡬ μ‹œ μ°Έμ‘°ν•œλ‹€.
  • git은 파일의 κ°œμˆ˜κ°€ 아무리 λ§Žμ•„λ„ λ‚΄μš©μ΄ κ°™λ‹€λ©΄ 같은 객체라고 μ—¬κΈ΄λ‹€. (index νŒŒμΌμ—μ„œ 같은 commit_idλ₯Ό λ³Ό 수 μžˆλ‹€.
  • (= 즉 λ‚΄μš©μ΄ κ°™μœΌλ©΄ 같은 객체둜 μƒκ°ν•œλ‹€. )

🌟 “λ‚΄μš©μ΄ κ°™μœΌλ©΄ 파일 이름이 κ°™λ‹€? (=같은 객체이닀)” 의 λ©”μ»€λ‹ˆμ¦˜

  • git은 μž‘μ„±ν•œ λ‚΄μš©μ„ SHA1 λΌλŠ” μ•Œκ³ λ¦¬μ¦˜μ„ μ΄μš©ν•˜μ—¬ ν•΄μ‰¬κ°’μœΌλ‘œ λ°›λŠ”λ‹€.
πŸ’‘ 깃은 μˆ˜λ§Žμ€ νŒŒμΌμ„ μ–΄λ–»κ²Œ 관리할 수 μžˆμ„κΉŒ? 깃은 λ³€κ²½λœ 파일과 λ³€κ²½λ˜μ§€ μ•Šμ€ νŒŒμΌμ„ μ–΄λ–»κ²Œ κ΅¬λΆ„ν•˜λŠ” κ²ƒμΌκΉŒ?
  • 같은 λ‚΄μš©μ€ 같은 Hash 값을 κ°€μ§€κ²Œ 되기 λ•Œλ¬Έμ— 파일 λͺ…이 달라도 λ‚΄μš©μ„ λ³΅μ‚¬ν•˜μ—¬ λ‚΄μš©μ΄ κ°™λ‹€λ©΄, 같은 객체인 것이닀.

2) git commit

  • λ³€ν™”κ°€ μƒκΈ°λŠ” 파일

 

  • μš°λ¦¬κ°€ commitν•œ λ©”μ‹œμ§€λ₯Ό κΈ°μ€€μœΌλ‘œ objects 디렉토리 μ•ˆ 폴더가 생긴닀.
  • 폴더 μ•ˆ μž‘μ„±ν•œ commit λ©”μ‹œμ§€λ₯Ό λ³΄κ΄€ν•˜λŠ” 파일이 생긴닀.
  • 즉, μš°λ¦¬κ°€ μƒμ„±ν•œ commit에 따라 version이 생기고 각 version은 tree λ₯Ό κ°€μ§€κ³  μžˆλ‹€.
  • νŒŒμΌμ—μ„œ commit λ©”μ‹œμ§€μ™€ ν•¨κ»˜ tree 와 parent 도 확인 κ°€λŠ₯ν•˜λ‹€.
    • treeλŠ” μ»€λ°‹λœ νŒŒμΌλ“€μ— κ΄€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€. (commit_id, 파일λͺ…)
    • parentλŠ” 이전에 μ»€λ°‹λœ λ©”μ‹œμ§€ 정보λ₯Ό λ‹΄κ³  μžˆλ‹€.

3) 정리

  • git add ν›„ add ν•œ νŒŒμΌμ— λŒ€ν•œ 기둝이 index에 λ‹΄κΈ΄λ‹€.
  • git add ν›„ addν•œ 파일의 λ‚΄μš©μ— λŒ€ν•œ Hash 값을 λ°”νƒ•μœΌλ‘œ objects 폴더 μ•ˆ 폴더와 파일이 생긴닀.
  • git commit ν›„ objects 폴더 μ•ˆ commitν•œ λ©”μ‹œμ§€μ— λŒ€ν•œ Hash 값을 λ°”νƒ•μœΌλ‘œ 폴더와 파일이 생긴닀.
    • νŒŒμΌμ„ ν™•μΈν•˜λ©΄, tree와 commit λ©”μ‹œμ§€λ₯Ό λ³Ό 수 μžˆλ‹€.
    • treeλ₯Ό ν΄λ¦­ν•˜λ©΄, μ–΄λ–€ 파일이 add λ˜μ—ˆλŠ”μ§€λ₯Ό 확인할 수 μžˆλ‹€. (add ν•œ νŒŒμΌμ— λŒ€ν•œ 기둝을 확인할 수 μžˆλ‹€.)
    • parentλŠ” 이전에 commit ν•œ λ‚΄μš©μ„ 가리킨닀.
      • 즉, treeλŠ” μ—°κ²° μ—°κ²°λ˜μ–΄, commit λ©”μ‹œμ§€ logλ₯Ό 확인할 수 있고, commit된 λ©”μ‹œμ§€μ˜ treeλ₯Ό ν™•μΈν•˜μ—¬ μ–΄λ–€ 파일이 add λ˜μ—ˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” 것이닀.

 

 

참고자료: μƒν™œμ½”λ”© - μ§€μ˜₯μ—μ„œ 온 git λ™μ˜μƒμ„ μ°Έκ³ ν•˜μ—¬ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.
https://opentutorials.org/course/2708/15210
 

과거의 λ²„μ „μœΌλ‘œ λŒμ•„κ°€κΈ° - μƒν™œμ½”λ”©

μˆ˜μ—…μ†Œκ°œ λ²„μ „κ΄€λ¦¬μ˜ μ€‘μš”ν•œ νš¨μš©μ€ 과거의 μƒνƒœλ‘œ λŒμ•„κ°ˆ 수 μžˆλ‹€λŠ” μ μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 이 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ΄…λ‹ˆλ‹€. ν•œκ°€μ§€ μ£Όμ˜ν•˜μ‹€ 점은 과거둜 λŒμ•„κ°€λŠ” μž‘μ—…μ€ μœ„ν—˜ν•œ μž‘μ—…μž…λ‹ˆλ‹€. μ—¬

opentutorials.org

 

'TIL > Git' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[Error] λΆ„λ¦¬λœ HEAD λ‚΄ 컀밋  (0) 2022.07.24

λŒ“κΈ€