본문으둜 κ±΄λ„ˆλ›°κΈ°

🌈 Chapter 1: μ‹œμž‘ν•˜κΈ°

πŸ“š 버전 κ΄€λ¦¬λž€?​

  • 버전 관리 μ‹œμŠ€ν…œμ€ 파일 λ³€ν™”λ₯Ό μ‹œκ°„μ— 따라 κΈ°λ‘ν–ˆλ‹€κ°€ λ‚˜μ€‘μ— νŠΉμ • μ‹œμ μ˜ 버전을 λ‹€μ‹œ κΊΌλ‚΄μ˜¬ 수 μžˆλŠ” μ‹œμŠ€ν…œμ΄λ‹€.
  • VCS(Version Control System)λ₯Ό μ‚¬μš©ν•˜λ©΄ 각 νŒŒμΌμ„ 이전 μƒνƒœλ‘œ 되돌릴 수 있고, μ‹œκ°„μ— 따라 μˆ˜μ • λ‚΄μš©μ„ 비ꡐ해 λ³Ό 수 있고, λˆ„κ°€ 문제λ₯Ό μΌμœΌμΌ°λŠ”μ§€λ„ 좔적할 수 있고, λˆ„κ°€ μ–Έμ œ λ§Œλ“€μ–΄λ‚Έ μ΄μŠˆμΈμ§€λ„ μ•Œ 수 μžˆλ‹€.
  • VCSλ₯Ό μ‚¬μš©ν•˜λ©΄ νŒŒμΌμ„ μžƒμ–΄λ²„λ¦¬κ±°λ‚˜ 잘λͺ» 고쳀을 λ•Œλ„ μ‰½κ²Œ 볡ꡬ할 수 μžˆλ‹€.

πŸ”₯ 둜컬 버전 관리​

πŸ”₯ 쀑앙집쀑식 버전 관리(CVCS)​

  • ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ‹€ 보면 λ‹€λ₯Έ κ°œλ°œμžμ™€ ν•¨κ»˜ μž‘μ—…ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ λ§Žμ€λ° 이럴 λ•Œ μƒκΈ°λŠ” 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ CVCSκ°€ κ°œλ°œλλ‹€.
  • CVS, Subversion, Perforce 같은 μ‹œμŠ€ν…œμ€ νŒŒμΌμ„ κ΄€λ¦¬ν•˜λŠ” μ„œλ²„κ°€ λ³„λ„λ‘œ 있고 ν΄λΌμ΄μ–ΈνŠΈκ°€ 쀑앙 μ„œλ²„μ—μ„œ νŒŒμΌμ„ λ°›μ•„μ„œ μ‚¬μš©(Checkout)ν•œλ‹€.
  • 이 방법은 치λͺ…적인 결점이 μžˆλŠ”λ° κ°€μž₯ λŒ€ν‘œμ μΈ 것이 쀑앙 μ„œλ²„μ— λ°œμƒν•œ λ¬Έμ œμ΄λ‹€.
  • λ§Œμ•½ μ„œλ²„κ°€ λ‹€μš΄λ˜λ©΄ κ·Έλ™μ•ˆ 아무것도 ν•  수 μ—†λ‹€.

πŸ”₯ λΆ„μ‚° 버전 관리 μ‹œμŠ€ν…œβ€‹

  • Git, Mecurial, Bazaar, Darcs 같은 DVCSμ—μ„œμ˜ ν΄λΌμ΄μ–ΈνŠΈλŠ” λ‹¨μˆœνžˆ 파일의 λ§ˆμ§€λ§‰ μŠ€λƒ…μƒ·μ„ Checkoutν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έλƒ₯ μ €μž₯μ†Œλ₯Ό μ „λΆ€ λ³΅μ œν•œλ‹€.
  • μ„œλ²„μ— λ¬Έμ œκ°€ 생기면 이 볡제물둜 λ‹€μ‹œ μž‘μ—…ν•  수 μžˆλ‹€. λͺ¨λ“  Checkout은 λͺ¨λ“  데이터λ₯Ό 가진 μ§„μ •ν•œ 백업이닀.
  • DVCS ν™˜κ²½μ—μ„œλŠ” 리λͺ¨νŠΈ μ €μž₯μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”λ° λ§Žμ„ μˆ˜λ„ μžˆλ‹€. κ·Έλž˜μ„œ μ‚¬λžŒλ“€μ€ λ™μ‹œμ— λ‹€μ–‘ν•œ κ·Έλ£Ήκ³Ό λ‹€μ–‘ν•œ λ°©λ²•μœΌλ‘œ ν˜‘μ—…ν•  수 μžˆλ‹€.

πŸ“š Git κΈ°μ΄ˆβ€‹

πŸ”₯ 차이가 μ•„λ‹ˆλΌ μŠ€λƒ…μƒ·β€‹

  • VCSλ“€κ³Ό Git의 κ°€μž₯ 큰 차이점은 데이터λ₯Ό λ‹€λ£¨λŠ” 방법에 μžˆλ‹€.
  • 큰 ν‹€μ—μ„œ 봀을 λ•Œ VCS λŒ€λΆ€λΆ„μ€ κ΄€λ¦¬ν•˜λŠ” 정보가 νŒŒμΌλ“€μ˜ λͺ©λ‘μ΄λ‹€. 각 파일의 λ³€ν™”λ₯Ό μ‹œκ°„μˆœμœΌλ‘œ κ΄€λ¦¬ν•˜λ©΄μ„œ νŒŒμΌλ“€μ˜ 집합을 κ΄€λ¦¬ν•œλ‹€.
  • ν•˜μ§€λ§Œ Git은 데이터λ₯Ό 파일 μ‹œμŠ€ν…œ μŠ€λƒ…μƒ·μœΌλ‘œ μ·¨κΈ‰ν•˜κ³  크기가 μ•„μ£Ό μž‘λ‹€.
  • 파일이 달라지지 μ•Šμ•˜μœΌλ©΄ Git은 μ„±λŠ₯을 μœ„ν•΄μ„œ νŒŒμΌμ„ μƒˆλ‘œ μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 단지 이전 μƒνƒœμ˜ νŒŒμΌμ— λŒ€ν•œ 링크만 μ €μž₯ν•œλ‹€.
  • Git은 데이터λ₯Ό μŠ€λƒ…μƒ·μ˜ 슀트림처럼 μ·¨κΈ‰ν•œλ‹€.

πŸ”₯ 거의 λͺ¨λ“  λͺ…령을 λ‘œμ»¬μ—μ„œ 싀행​

  • 거의 λͺ¨λ“  λͺ…령이 둜컬 파일과 λ°μ΄ν„°λ§Œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ„€νŠΈμ›Œν¬μ— μžˆλŠ” λ‹€λ₯Έ μ»΄ν“¨ν„°λŠ” ν•„μš” μ—†λ‹€.
  • ν”„λ‘œμ νŠΈμ˜ λͺ¨λ“  νžˆμŠ€ν† λ¦¬κ°€ 둜컬 λ””μŠ€ν¬μ— 있기 λ•Œλ¬Έμ— λͺ¨λ“  λͺ…령을 μˆœμ‹κ°„μ— μ‹€ν–‰λœλ‹€.
  • 즉, μ˜€ν”„λΌμΈ μƒνƒœμ΄κ±°λ‚˜ VPN으둜 μ—°κ²°ν•  수 없어도 λ§‰νž˜μ—†μ΄ 일할 수 μžˆλ‹€.

πŸ”₯ Git의 무결성​

  • Git은 데이터λ₯Ό μ €μž₯ν•˜κΈ° 전에 항상 체크섬을 κ΅¬ν•˜κ³  κ·Έ μ²΄ν¬μ„¬μœΌλ‘œ 데이터λ₯Ό κ΄€λ¦¬ν•œλ‹€. κ·Έλž˜μ„œ 체크섬 μ—†μ΄λŠ” μ–΄λ– ν•œ νŒŒμΌμ΄λ‚˜ 디렉터리도 λ³€κ²½ν•  수 μ—†λ‹€.
  • 체크섬은 Gitμ—μ„œ μ‚¬μš©ν•˜λŠ” κ°€μž₯ 기본적인 데이터 λ‹¨μœ„μ΄μž Git의 κΈ°λ³Έ 철학이닀.
  • Git은 SHA-1 ν•΄μ‹œλ₯Ό μ‚¬μš©ν•˜μ—¬ 체크섬을 λ§Œλ“ λ‹€. λ§Œλ“  체크섬은 40자 길이의 16μ§„μˆ˜ λ¬Έμžμ—΄μ΄λ‹€.

πŸ”₯ Git은 데이터λ₯Ό μΆ”κ°€ν•  뿐​

  • Git으둜 무얼 ν•˜λ“  Git λ°μ΄ν„°λ² μ΄μŠ€μ— 데이터가 μΆ”κ°€λœλ‹€.
  • λ˜λŒλ¦¬κ±°λ‚˜ 데이터λ₯Ό μ‚­μ œν•  방법이 μ—†λ‹€.
  • 일단 μŠ€λƒ…μƒ·μ„ μ»€λ°‹ν•˜κ³  λ‚˜λ©΄ 데이터λ₯Ό μžƒμ–΄λ²„λ¦¬κΈ° μ–΄λ ΅λ‹€.

πŸ”₯ μ„Έ 가지 μƒνƒœβ€‹

  • Git은 νŒŒμΌμ„ Committed, Modified, Staged μ΄λ ‡κ²Œ μ„Έ 가지 μƒνƒœλ‘œ κ΄€λ¦¬ν•œλ‹€.
  • Committedλž€ 데이터가 둜컬 λ°μ΄ν„°λ² μ΄μŠ€μ— μ•ˆμ „ν•˜κ²Œ μ €μž₯λλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.
  • Modifiedλž€ μˆ˜μ •ν•œ νŒŒμΌμ„ 아직 둜컬 λ°μ΄ν„°λ² μ΄μŠ€μ— μ»€λ°‹ν•˜μ§€ μ•ŠλŠ” 것을 λ§ν•œλ‹€.
  • Stagedλž€ ν˜„μž¬ μˆ˜μ •ν•œ νŒŒμΌμ„ 곧 컀밋할 것이라고 ν‘œμ‹œν•œ μƒνƒœλ₯Ό μ˜λ―Έν•œλ‹€.
  • 이 μ„Έ 가지 μƒνƒœλŠ” Git ν”„λ‘œμ νŠΈμ˜ μ„Έ 가지 단계와 연결돼 μžˆλ‹€. Git 디렉터리, μ›Œν‚Ή 디렉터리, Staging Area μ΄λ ‡κ²Œ μ„Έ 가지 단계이닀.
  • Git λ””λ ‰ν„°λ¦¬λŠ” Git이 ν”„λ‘œμ νŠΈμ˜ 메타데이터와 객체 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ €μž₯ν•˜λŠ” 곳을 λ§ν•œλ‹€. 이 디렉터리가 Git의 핡심이닀.
  • μ›Œν‚Ή λ””λ ‰ν„°λ¦¬λŠ” ν”„λ‘œμ νŠΈμ˜ νŠΉμ • 버전을 Checkoutν•œ 것이닀.
  • Staging AreaλŠ” Git 디렉터리에 μžˆλ‹€. λ‹¨μˆœν•œ 파일이고 곧 컀밋할 νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό μ €μž₯ν•œλ‹€.
  • Git으둜 ν•˜λŠ” 일은 기본적으둜 μ•„λž˜μ™€ κ°™λ‹€.
  1. μ›Œν‚Ή λ””λ ‰ν„°λ¦¬μ—μ„œ νŒŒμΌμ„ μˆ˜μ •ν•œλ‹€.
  2. Staging Area에 νŒŒμΌμ„ Stageν•΄μ„œ 컀밋할 μŠ€λƒ…μƒ·μ„ λ§Œλ“ λ‹€.
  3. Staging Area에 μžˆλŠ” νŒŒμΌλ“€μ„ μ»€λ°‹ν•΄μ„œ Git 디렉터리에 영ꡬ적인 μŠ€λƒ…μƒ·μœΌλ‘œ μ €μž₯ν•œλ‹€.
  • Git 디렉터리에 μžˆλŠ” νŒŒμΌλ“€μ€ Committed μƒνƒœμ΄λ‹€.
  • νŒŒμΌμ„ μˆ˜μ •ν•˜κ³  Staging Area에 μΆ”κ°€ν–ˆλ‹€λ©΄ Staged이닀.
  • Checkoutν•˜κ³  λ‚˜μ„œ μˆ˜μ •ν–ˆμ§€λ§Œ, 아직 Staging Area에 μΆ”κ°€ν•˜μ§€ μ•Šμ•˜μœΌλ©΄ Modified이닀.

πŸ“š CLI​

  • Git의 λͺ¨λ“  κΈ°λŠ₯을 μ§€μ›ν•˜λŠ” 것은 CLI(Command Line Interface)뿐이닀.

πŸ“š Git μ„€μΉ˜β€‹

πŸ“š Git 졜초 섀정​

  • Git의 μ‚¬μš© ν™˜κ²½μ„ μ μ ˆν•˜κ²Œ μ„€μ •ν•΄ μ£Όμ–΄μ•Ό ν•œλ‹€.
  • git configλΌλŠ” λ„κ΅¬λ‘œ μ„€μ • λ‚΄μš©μ„ ν™•μΈν•˜κ³  λ³€κ²½ν•  수 μžˆλ‹€. Git은 이 섀정에 따라 λ™μž‘ν•œλ‹€.
  1. /etc/gitconfig 파일
    • μ‹œμŠ€ν…œμ˜ λͺ¨λ“  μ‚¬μš©μžμ™€ λͺ¨λ“  μ €μž₯μ†Œμ— μ μš©λ˜λŠ” 섀정이닀.
    • git config --system μ˜΅μ…˜μœΌλ‘œ 이 νŒŒμΌμ„ 읽고 μ“Έ 수 μžˆλ‹€.
  2. ~/.gitconfig, ~/.config/git/config 파일
    • νŠΉμ • μ‚¬μš©μžμ—κ²Œλ§Œ μ μš©λ˜λŠ” 섀정이닀.
    • git config --global μ˜΅μ…˜μœΌλ‘œ 이 νŒŒμΌμ„ 읽고 μ“Έ 수 μžˆλ‹€.
  3. .git/config 파일
    • Git 디렉터리에 있고 νŠΉμ • μ €μž₯μ†Œμ—λ§Œ μ μš©λœλ‹€.
  • 각 섀정은 μ—­μˆœμœΌλ‘œ μš°μ„ μ‹œλœλ‹€.

πŸ”₯ μ‚¬μš©μž 정보​

  • Git은 컀밋할 λ•Œ μ‚¬μš©μž 이름과 이메일 μ£Όμ†Œλ₯Ό μ‚¬μš©ν•œλ‹€. ν•œλ²ˆ μ»€λ°‹ν•œ ν›„μ—λŠ” 정보λ₯Ό λ³€κ²½ν•  수 μ—†λ‹€.
> git config --global user.name "John Doe"
> git config --global user.email "John@example.com"
  • 단 ν•œ 번만 --global둜 μ„€μ •ν•˜λ©΄ λœλ‹€.

πŸ”₯ νŽΈμ§‘κΈ°β€‹

  • ν…μŠ€νŠΈ νŽΈμ§‘κΈ°λ₯Ό κ³ λ₯Ό 수 μžˆλ‹€. κΈ°λ³Έ νŽΈμ§‘κΈ°λŠ” Viλ‚˜ Vim이닀.
> git config --global core.editor emacs

πŸ”₯ μ„€μ • 확인​

  • git config --list λͺ…령을 μ‹€ν–‰ν•˜λ©΄ μ„€μ •ν•œ λͺ¨λ“  것을 보여쀀닀.

πŸ”₯ 도움말 보기​

> git help <verb>
> git <verb> --help
> man git-<verb>