Git

1TBhardΒ·2020λ…„ 12μ›” 22일
0
post-thumbnail

Git μ΄λž€?

Git μ΄λž€ μ†ŒμŠ€ μ½”λ“œ 관리λ₯Ό μœ„ν•œ λΆ„μ‚° 버전 관리 μ‹œμŠ€ν…œμœΌλ‘œ Git을 μ΄μš©ν•˜μ—¬ μž‘μ—… ν΄λ”μ˜ λ³€κ²½ 내역을 좔적할 수 μžˆλ‹€.
즉, Git을 μ΄μš©ν•˜λ©΄ 버그 λ°œμƒμ‹œ 이전 λ²„μ „μœΌλ‘œ λ˜λŒλ¦¬λŠ” rollback을 ν•˜κ±°λ‚˜ μˆ˜μ •λœ λ‚΄μš©μ„ νŒŒμ•…ν•  수 μžˆλ‹€.

πŸ’‘ λΆ„μ‚° 버전 관리 μ‹œμŠ€ν…œ

μ†Œν”„νŠΈμ›¨μ–΄ 버전 관리λ₯Ό μœ„ν•œ μ‹œμŠ€ν…œμœΌλ‘œ 각 κ°œλ°œμžκ°€ 쀑앙 μ„œλ²„μ— μ ‘μ†ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μ½”λ“œ μž‘μ—…μ„ ν•  수 μžˆλ‹€.

πŸ“– git μ„€μΉ˜λ²•μ€ 링크 λ₯Ό μ°Έμ‘°


μ €μž₯μ†Œ

μ €μž₯μ†Œλž€ νŒŒμΌμ΄λ‚˜ 폴더λ₯Ό μ €μž₯ν•˜λŠ” 곳으둜 μ•„λž˜μ™€ 같이 2μ’…λ₯˜κ°€ μ‘΄μž¬ν•œλ‹€.

  • 원격 μ €μž₯μ†Œ: μ„œλ²„ λ“± λ„€νŠΈμ›Œν¬μ— μžˆλŠ” μ €μž₯μ†Œ
  • 둜컬 μ €μž₯μ†Œ: 자기 PC에 μžˆλŠ” μ €μž₯μ†Œ


μŠ€λƒ…μƒ·μ„ μ°Έμ‘°

델타 기반 버전관리 μ‹œμŠ€ν…œμΈ CVS, Subversion, Perfoce, Bazaar λ“±κ³Ό 달리 Git은 데이터λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ·¨κΈ‰μ„ν•˜μ§€ μ•ŠλŠ”λ‹€.
λŒ€μ‹ μ— Git은 데이터λ₯Ό μ†Œν˜• 파일 μ‹œμŠ€ν…œμ˜ 일련의 μŠ€λƒ… μƒ·μ²˜λŸΌ μ—¬κΈ΄λ‹€.
ν”„λ‘œμ νŠΈμ˜ μƒνƒœλ₯Ό 컀밋 ν˜Ήμ€ μ €μž₯ν•  λ•Œλ§ˆλ‹€ λͺ¨λ“  파일이 μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ—ˆλŠ”μ§€ 사진을 찍어 μŠ€λƒ…μƒ·μ— λŒ€ν•œ μ°Έμ‘°λ₯Ό μ €μž₯ν•œλ‹€.

πŸ’‘ μŠ€λƒ… μƒ· : 과거의 ν•œ λ•Œ μ‘΄μž¬ν•˜κ³  μœ μ§€μ‹œν‚¨ 컴퓨터 파일과 λ””λ ‰ν„°λ¦¬μ˜ λͺ¨μž„
πŸ’‘ 델타 기반 버전관리 μ‹œμŠ€ν…œ : 각 파일의 λ³€ν™”λ₯Ό μ‹œκ°€μˆœμœΌλ‘œ κ΄€λ¦¬ν•˜λ©΄μ„œ 파일의 집합을 관리

μ‹œκ°„μˆœμ΄ μ•„λ‹Œ μŠ€λƒ… 샷을 μ°Έκ³ ν•¨μœΌλ‘œμ„œ Git은 μ•„λž˜μ™€ 같은 νŠΉμ§•μ„ κ°–λŠ”λ‹€.

  • λͺ¨λ“  μž‘μ—…μ΄ λ‘œμ»¬μ— μ‘΄μž¬ν•œλ‹€.
    • 둜컬 파일과 λ¦¬μ†ŒμŠ€ 만 있으면 μž‘λ™ν•œλ‹€.
    • μž‘μ—… νžˆμŠ€ν† λ¦¬λ₯Ό λ³΄κΈ°μœ„ν•΄ λ„€νŠΈμ›Œν¬ 접속이 ν•„μš”κ°€ μ—†λ‹€.
  • 무결성 을 가진닀.
    • λͺ¨λ“  νŒŒμΌμ€ μ €μž₯ν•˜κΈ° μ „ μ΄μ „μ˜ 체크섬을 거친 ν›„ ν•΄λ‹Ή 체크섬에 μ˜ν•΄ μ°Έμ‘°λœλ‹€.
    • 체크섬에 SHA-1 ν•΄μ‹œλ₯Ό μ΄μš©ν•œλ‹€.

πŸ’‘ 무결성 : λ°μ΄ν„°μ˜ μ •ν™•μ„±κ³Ό 일관성을 μœ μ§€ν•˜κ³  λ³΄μ¦ν•˜λŠ” 것
πŸ’‘ 체크섬 : 쀑볡 κ²€μ‚¬μ˜ ν•œ ν˜•νƒœλ‘œ 였λ₯˜ 정정을 톡해 자료의 무결성을 λ³΄ν˜Έν•˜λŠ” 방법
πŸ’‘ SHA-1 ν•΄μ‹œ(Secure Hash Algorithm)
μ•”ν˜Έν™” ν•΄μ‹œ ν•¨μˆ˜(ν•΄μ‹œ κ°’μœΌλ‘œ λΆ€ν„° μ›λž˜ κ°’ μ°ΎκΈ° νž˜λ“€κ²Œν•˜λŠ” ν•¨μˆ˜)λ“€μ˜ λͺ¨μŒμΈ SHA 쀑 ν•˜λ‚˜λ‘œ 이닀.


세가지 μƒνƒœ

Git은 νŒŒμΌμ„ Commited, Modifed, Staged 세가지 μƒνƒœλ‘œ κ΄€λ¦¬ν•œλ‹€.

  • Commit(컀밋) : 데이터가 둜컬 μ €μž₯μ†Œμ— μ•ˆμ „ν•˜κ²Œ μ €μž₯λλ‹€λŠ” 것을 의미
  • Modifed : μˆ˜μ •ν•œ νŒŒμΌμ„ 아직 둜컬 μ €μž₯μ†Œμ— μ»€λ°‹ν•˜μ§€ μ•Šμ€ 것
  • Staged : ν˜„μž¬ μˆ˜μ •ν•œ νŒŒμΌμ„ 곧 컀밋할 것이라고 ν‘œμ‹œν•œ μƒνƒœ

πŸ’‘ Working Directory : 파일 μˆ˜μ •, μ €μž₯ λ“±μ˜ μž‘μ—…μ„ ν•˜λŠ” 디렉토리
πŸ’‘ 브랜치(branch) : 컀밋 사이λ₯Ό κ°€λ³κ²Œ 이동할 수 μžˆλŠ” μ–΄λ–€ 포인터 같은 것
πŸ’‘ checkout : 브랜치λ₯Ό μ΄λ™ν•˜λŠ” git λͺ…λ Ήμ–΄

πŸ“– Staging Areaκ°€ ν•„μš”ν•œ 이유

Staging AreaλŠ” μ–΄λ–€ 변경사항이 μ €μž₯μ†Œμ— μ»€λ°‹ν•˜κΈ° 전에 κ±°μΉ˜λŠ” 쀑간단계이닀. λ˜ν•œ, Staging Areaλ₯Ό index라고도 ν•œλ‹€.
이λ₯Ό 톡해 λ³€κ²½λœ μΌλΆ€λΆ„λ§Œ μ €μž₯μ†Œμ— 컀밋을 ν•  수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μ €μž₯μ†Œμ— 좩돌이 λ‚˜λŠ” 경우 좩돌이 λ‚˜μ§€ μ•Šμ€ νŒŒμΌλ“€μ„ λ¨Όμ € 컀밋할 수 μžˆλ‹€.

예제

Git을 μ΄μš©ν•΄ λ³€κ²½ 사항을 μ €μž₯μ†Œμ— κΈ°λ‘ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같은 μž‘μ—…μ„ μ§„ν–‰ν•΄μ•Όν•œλ‹€.


1-1. 원격 μ €μž₯μ†Œ 생성

μ €μž₯μ†Œλ₯Ό μƒμ„±ν•˜λŠ” 방법은 2가지가 μžˆλ‹€.

  • 버전관리가 μ•ˆλœ 둜컬 디렉토리에 Git μ €μž₯μ†Œλ₯Ό 적용 (둜컬 μ €μž₯μ†Œ 생성)
  • μ–΄λ”˜κ°€μ—μ„œ Git μ €μž₯μ†Œλ₯Ό Clone (원격 μ €μž₯μ†Œμ—μ„œ 클둠)

πŸ’‘ 원격 μ €μž₯μ†Œ μ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” 곳은 GitHub, Bitbucket 등이 μžˆλ‹€.

λ³Έ μ˜ˆμ œλŠ” '버전관리가 μ•ˆλœ 둜컬 디렉토리에 Git μ €μž₯μ†Œ' λ₯Ό μ μš©ν•˜λŠ” 것을 μ§„ν–‰ν•œλ‹€.
λ˜ν•œ, 원격 μ €μž₯μ†ŒλŠ” GitHubλ₯Ό μ΄μš©ν•œλ‹€.

λ¨Όμ € GitHub에 κ°€μž…μ„ μ§„ν–‰ν•œλ‹€.

κ°€μž… ν›„ GitHub에 μƒˆλ‘œμš΄ repository(원격 μ €μž₯μ†Œ)λ₯Ό μƒμ„±ν•˜μž

μƒˆλ‘œμš΄ repository의 섀정을 ν•΄μ€€λ‹€.

  • μ˜΅μ…˜
    • Description : 이 repository 에 λŒ€ν•œ μ„€λͺ…(적지 μ•Šμ•„λ„ λ¬΄λ°©ν•˜λ‹€.)
    • 곡유 λ²”μœ„ μ„€μ •
      • Public : μ„€μ •ν•œ 경우 λ‹€λ₯Έ μ‚¬λžŒλ„ μ‰½κ²Œ λ³Ό 수 μžˆλŠ” κ³΅μœ ν•  수 μžˆλŠ” repository둜 μ„€μ •ν•œλ‹€.
      • Private : λ‹€λ₯Έ μ‚¬λžŒμ΄ λ³Ό 수 μ—†λŠ” repository 생성
    • Initialize this repository with a README
      이 μ˜΅μ…˜μ€ README.mdνŒŒμΌμ„ repository와 ν•¨κ»˜ λ§Œλ“€μ§€λ₯Ό μ„€μ •ν•œλ‹€.

μ˜΅μ…˜κΉŒμ§€ μ„€μ •ν•˜μ—¬ repositoryλ₯Ό μƒμ„±ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

이후 λ‹¨κ³„λŠ” git bashλ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μ§„μ˜ ...or create a new repository on the command line 처럼 λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ 및 μ§„ν–‰ν•˜λ©΄ λœλ‹€.


git bashgit bash μ‹€ν–‰

1-2 둜컬 μ €μž₯μ†Œ 생성

둜컬 μ €μž₯μ†Œλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ›ν•˜λŠ” μž‘μ—…νŠΈλ¦¬μ— git init λͺ…λ Ήμ–΄λ‘œ Git μ €μž₯μ†Œλ₯Ό μƒμ„±ν•΄μ•Όν•œλ‹€.

$ git init

이 λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ .git 파일이 μƒμ„±μ΄λœλ‹€.

둜컬 μ €μž₯μ†Œλ₯Ό μƒμ„±ν•œ ν›„ μ–΄λ–€ νŒŒμΌμ΄λ“ μ§€ μΆ”κ°€ν•˜κ³  μˆ˜μ •μ„ ν•΄λ³΄μž
λ³Έ μ˜ˆμ œλŠ” test.txt νŒŒμΌμ„ μΆ”κ°€ν•˜μ˜€λ‹€.


2. μŠ€ν…Œμ΄μ§•(staging)

μŠ€ν…Œμ΄μ§•μ„ ν•˜κΈ° μœ„ν•œ λͺ…λ Ήμ–΄λŠ” git add λͺ…령어이닀.
μ›ν•˜λŠ” νŒŒμΌμ„ μŠ€ν…Œμ΄μ§•ν•˜κΈ° μœ„ν•΄ μ•„λž˜μ™€ 같이 μ‚¬μš©ν•œλ‹€.

$ git add file_name

# ν˜Ήμ€

$ git add μ˜΅μ…˜

μ΄λ•Œ μ˜΅μ…˜μ—λŠ” μ•„λž˜κ°€ λ“€μ–΄κ°ˆ 수 μžˆλ‹€.

μ˜΅μ…˜μ„€λͺ…
-uλ³€κ²½κ³Ό μ‚­μ œλœ κ²ƒλ§Œ μŠ€ν…Œμ΄μ§•(단 μΆ”κ°€λœ νŒŒμΌμ€ μ œμ™Έ)
*.jsν™•μž₯μžκ°€ js 파일 λͺ¨λ‘λ₯Ό μŠ€ν…Œμ΄μ§•
.λ³€κ²½λœ 파일과 μΆ”κ°€λœ 파일 λͺ¨λ‘λ₯Ό μŠ€ν…Œμ΄μ§•(단 μ‚­μ œλœ 파일 μ œμ™Έ)
-all, -Aλ³€κ²½λœ λͺ¨λ“  사항을 μŠ€ν…Œμ΄μ§•ν•œλ‹€.

3. 컀밋(commit)

컀밋 λͺ…λ Ήμ–΄λŠ” μ•„λž˜μ™€ κ°™λ‹€.

$ git commit -m '컀밋 λ©”μ‹œμ§€'

πŸ’‘ git commit -am : add와 commit을 λ™μ‹œμ— 진행

⚠️ 컀밋 λ©”μ‹œμ§€κ°€ μ—†λŠ” 경우 컀밋을 쀑단해버린닀


4. 둜컬 μ €μž₯μ†Œμ™€ 원격 μ €μž₯μ†Œ μ—°κ²°

둜컬 μ €μž₯μ†Œμ™€ 원격 μ €μž₯μ†Œλ₯Ό μ—°κ²°ν•΄μ•Ό ν•œλ‹€.

# '원격-μ €μž₯μ†Œ-URL'을 origin μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ 원격 μ €μž₯μ†Œλ‘œ 등둝함
$ git remote add origin 원격-μ €μž₯μ†Œ-URL

πŸ“– origin, master 의미?

master : 졜초둜 μ»€λ°‹ν•œ 브랜치 이름
origin : 원격 μ €μž₯μ†Œλ‘œ Git은 μžλ™μœΌλ‘œ origin μ΄λΌλŠ” 이름을 뢙인닀.

⚠️ λ§Œμ•½ Git μ„€μΉ˜μ‹œ μƒˆ μ €μž₯μ†Œ 브랜치λͺ… 섀정을 μ»€μŠ€ν…€ν•˜κ²Œ ν•΄μ€€ 경우 master λŒ€μ‹  ν•΄λ‹Ή 브랜치λͺ… 을 μ‚¬μš©ν•΄μ•Όν•œλ‹€.


5. 푸쉬(push)

푸쉬(push) λͺ…λ Ήμ–΄λž€ 둜컬 μ €μž₯μ†Œμ— μ»€λ°‹λœ 사항듀을 원격 μ €μž₯μ†Œμ— μ˜¬λ¦¬λŠ” λͺ…령어이닀.

# 리λͺ¨νŠΈ μ €μž₯μ†Œμ— 둜컬 브랜치λ₯Ό ν‘Έμ‰¬ν•œλ‹€.
$ git push <리λͺ¨νŠΈ μ €μž₯μ†Œ 이름> <둜컬 브랜치 이름>

μ΄λ•Œ κΉƒν—ˆλΈŒ κ³„μ •μœΌλ‘œ λ‘œκ·ΈμΈμ„ ν•˜λΌκ³  λ‚˜μ˜¨λ‹€. 이λ₯Ό ν•΄κ²°ν•˜λ©΄ pushκ°€ μ™„λ£Œλœλ‹€.

⚠️ λ§Œμ•½ μ—¬λŸ¬ μ‚¬λžŒμ΄ pushν•œ 후에 pushν•˜λ €κ³  ν•˜λ©΄ pushν•  수 μ—†λ‹€.
λ¨Όμ € λ‹€λ₯Έ μ‚¬λžŒμ΄ μž‘μ—…ν•œ 것을 κ°€μ Έμ™€μ„œ Merge ν•œ 후에 pushλ₯Ό ν•  수 μžˆλ‹€.

푸쉬λ₯Ό ν•  λ•Œ λ§ˆλ‹€ <리λͺ¨νŠΈ μ €μž₯μ†Œ 이름> <둜컬 브랜치 이름>을 계속 μ‚¬μš©ν•˜λŠ” 것이 번거둜울 수 μžˆλ‹€.
이λ₯Ό μœ„ν•΄ git push -u origin master λͺ…λ Ήμ–΄λ₯Ό ν•œλ²ˆ μ‚¬μš©ν•˜λ©΄ git push λͺ…λ Ήμ–΄λ§Œ μ‚¬μš©ν•΄λ„ 푸쉬할 수 μžˆλ‹€.

$ git push -u origin master

# 이후 pushλŠ”
$ git push

-u μ˜΅μ…˜μ€ μ„€μ •νŒŒμΌμ— ν˜„μž¬μ˜ master 브랜치 λ₯Ό origin의(μ—¬κΈ°μ„œλŠ” fork 받은 μžμ‹ μ˜ 원격저μž₯μ†Œ) master 브랜치둜 μ—°κ²°ν•΄μ€€λ‹€.

즉, λ‹€μŒλΆ€ν„°λŠ” μžλ™μœΌλ‘œ master 브랜치 μ—μ„œ git pushλ₯Ό ν•˜λ©΄ origin의 master 브랜치 둜 ν‘Έμ‹œκ°€ 되고 git pull을 ν•˜λ©΄ origin의 masterλ₯Ό fetchν•΄μ„œ 둜컬의 master둜 merge ν•˜λ„λ‘ μ„€μ •ν•œλ‹€.


git bashλ₯Ό μ‚¬μš©ν•˜μ—¬ 1-2 ~ 5 κΉŒμ§€μ˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•œ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.

원격 μ €μž₯μ†Œμ˜ κ²°κ³ΌλŠ” μ•„λž˜μ™€ κ°™λ‹€.


μΆœμ €

https://git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F

profile
기얡을 λ„˜μ–΄ μŠ΅κ΄€μœΌλ‘œ

0개의 λŒ“κΈ€