[Git] κΉƒ(Git)을 ν™œμš©ν•œ ν”„λ‘œμ νŠΈ 관리

Posted by Euisuk's Dev Log on May 2, 2023

[Git] κΉƒ(Git)을 ν™œμš©ν•œ ν”„λ‘œμ νŠΈ 관리

κΉƒ(Git)을 ν™œμš©ν•œ ν”„λ‘œμ νŠΈ 관리

κΉƒ(Git)은 λΆ„μ‚° 버전 관리 μ‹œμŠ€ν…œμœΌλ‘œ, λ‹€μ–‘ν•œ ν”„λ‘œμ νŠΈμ—μ„œ μ†ŒμŠ€μ½”λ“œμ™€ λ¬Έμ„œλ₯Ό κ΄€λ¦¬ν•˜κ³  ν˜‘μ—…μ„ ν•  λ•Œ 효율적으둜 μ‚¬μš©λ©λ‹ˆλ‹€. 깃을 ν™œμš©ν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό κ΄€λ¦¬ν•˜λŠ” 방법에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

  1. κΉƒμ˜ μ‚¬μš©λ²•

1. Repository(μ €μž₯μ†Œ) 생성
ν”„λ‘œμ νŠΈλ₯Ό κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¨Όμ € κΉƒ μ €μž₯μ†Œλ₯Ό 생성해야 ν•©λ‹ˆλ‹€. κΉƒ μ €μž₯μ†ŒλŠ” 둜컬 μ €μž₯μ†Œμ™€ 원격 μ €μž₯μ†Œλ‘œ λ‚˜λ‰˜λ©°, 둜컬 μ €μž₯μ†ŒλŠ” 개발자의 개발 ν™˜κ²½μ—μ„œ μ‚¬μš©λ˜λŠ” μ €μž₯μ†Œμ΄λ©°, 원격 μ €μž₯μ†ŒλŠ” λ‹€λ₯Έ κ°œλ°œμžμ™€ ν˜‘μ—…ν•  λ•Œ μ‚¬μš©λ˜λŠ” μ €μž₯μ†Œμž…λ‹ˆλ‹€.

1
2
$ git init            # 둜컬 μ €μž₯μ†Œ 생성
$ git remote add origin [원격 μ €μž₯μ†Œ URL]   # 원격 μ €μž₯μ†Œμ™€ 둜컬 μ €μž₯μ†Œ μ—°κ²°

2. Branch(브랜치) 관리
깃은 브랜치 κΈ°λŠ₯을 μ œκ³΅ν•˜μ—¬, 독립적인 μž‘μ—… λΌμΈμ—μ„œ μž‘μ—…μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ κΈ°λŠ₯ μΆ”κ°€λ‚˜ 버그 μˆ˜μ • 등을 μœ„ν•΄ 독립적인 브랜치λ₯Ό μƒμ„±ν•˜μ—¬ μž‘μ—…ν•˜λ©΄, λ‹€λ₯Έ μž‘μ—… λΌμΈμ—μ„œμ˜ 영ν–₯을 μ΅œμ†Œν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이에 λŒ€ν•΄μ„œ 더 κΆκΈˆν•˜μ‹  뢄은 4. κΉƒ(Git) Branch에 λŒ€ν•œ 이해와 ν™œμš©μ—μ„œ μ’€ 더 μžμ„Έν•œ λ‚΄μš©μ„ 확인해 보싀 수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
$ git branch [브랜치 이름]   # 브랜치 생성
$ git checkout [브랜치 이름]   # 브랜치둜 이동

3. Commit(컀밋) 관리
λ³€κ²½ 내역을 μ €μž₯μ†Œμ— κΈ°λ‘ν•˜λŠ” μž‘μ—…μ„ 컀밋이라고 ν•©λ‹ˆλ‹€. 각각의 컀밋은 κ³ μœ ν•œ ν•΄μ‹œκ°’μ„ κ°€μ§€λ©°, λ³€κ²½ λ‚΄μ—­μ˜ 이λ ₯을 좔적할 수 μžˆμŠ΅λ‹ˆλ‹€.

1
2
$ git add [λ³€κ²½λœ 파일]   # 파일 μΆ”κ°€
$ git commit -m "[컀밋 λ©”μ‹œμ§€]"   # 컀밋 생성

4. ν”„λ‘œμ νŠΈ 이λ ₯ 좔적 및 관리
깃을 ν™œμš©ν•˜λ©΄ ν”„λ‘œμ νŠΈμ˜ λ³€κ²½ 이λ ₯을 μΆ”μ ν•˜κ³  관리할 수 μžˆμŠ΅λ‹ˆλ‹€. 이전 λ²„μ „μœΌλ‘œ λŒμ•„κ°€λŠ” λ“± λ‹€μ–‘ν•œ μž‘μ—…μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

1
2
3
$ git log   # 컀밋 이λ ₯ 확인
$ git diff [컀밋 ν•΄μ‹œ] [컀밋 ν•΄μ‹œ]   # 컀밋 κ°„ 차이점 확인
$ git reset --hard [컀밋 ν•΄μ‹œ]   # νŠΉμ • μ»€λ°‹μœΌλ‘œ 이동
  1. Git μ£Όμš” λͺ…λ Ήμ–΄ 정리 및 μ„€λͺ…

Git은 κ°•λ ₯ν•œ λΆ„μ‚° 버전 관리 μ‹œμŠ€ν…œμœΌλ‘œ, μ†ŒμŠ€ μ½”λ“œμ˜ λ³€κ²½ 이λ ₯을 κ΄€λ¦¬ν•˜κ³  ν˜‘μ—…μ„ 효율적으둜 μ§€μ›ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ λ‹€μ–‘ν•œ λͺ…λ Ήμ–΄λ‘œ 인해 ν˜Όλž€μŠ€λŸ¬μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 κΈ€μ—μ„œλŠ” 자주 μ‚¬μš©λ˜λŠ” μ£Όμš” Git λͺ…령어듀을 μ„€λͺ…κ³Ό ν•¨κ»˜ μ •λ¦¬ν•˜μ˜€μŠ΅λ‹ˆλ‹€.


1. μ €μž₯μ†Œ μ΄ˆκΈ°ν™” 및 볡제

1.1 git init

  • μ„€λͺ…: μƒˆλ‘œμš΄ Git μ €μž₯μ†Œλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. ν˜„μž¬ 디렉토리λ₯Ό Git 관리 ν•˜μ— 두며 .git 디렉토리가 μƒμ„±λ©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git init
    

    이 λͺ…령을 μ‹€ν–‰ν•˜λ©΄ ν˜„μž¬ λ””λ ‰ν† λ¦¬μ—μ„œ Git이 λ³€κ²½ 사항을 μΆ”μ ν•˜κΈ° μ‹œμž‘ν•©λ‹ˆλ‹€.

1.2 git clone <repository_url>

  • μ„€λͺ…: 원격 μ €μž₯μ†Œλ₯Ό 둜컬둜 λ³΅μ œν•©λ‹ˆλ‹€. 이 λͺ…λ Ήμ–΄λŠ” 원격 μ €μž₯μ†Œμ˜ 전체 이λ ₯을 λ‹€μš΄λ‘œλ“œν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git clone https://github.com/user/repository.git
    

    URL에 ν•΄λ‹Ήν•˜λŠ” μ €μž₯μ†Œκ°€ 둜컬 디렉토리에 λ³΅μ œλ©λ‹ˆλ‹€.


2. λ³€κ²½ 사항 관리

2.1 git status

  • μ„€λͺ…: ν˜„μž¬ μž‘μ—… 디렉토리와 μŠ€ν…Œμ΄μ§• μ˜μ—­μ˜ μƒνƒœλ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git status
    

    μˆ˜μ •λœ 파일, μΆ”κ°€λ˜μ§€ μ•Šμ€ 파일, 컀밋 λŒ€κΈ° 파일 등이 ν‘œμ‹œλ©λ‹ˆλ‹€.

2.2 git add <file>

  • μ„€λͺ…: μ§€μ •ν•œ 파일의 λ³€κ²½ 사항을 μŠ€ν…Œμ΄μ§• μ˜μ—­μ— μΆ”κ°€ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git add main.py
    

    main.py의 λ³€κ²½ 사항이 μŠ€ν…Œμ΄μ§• μ˜μ—­μ— μΆ”κ°€λ©λ‹ˆλ‹€.

2.3 git add .

  • μ„€λͺ…: ν˜„μž¬ λ””λ ‰ν† λ¦¬μ˜ λͺ¨λ“  λ³€κ²½ 사항을 μŠ€ν…Œμ΄μ§• μ˜μ—­μ— μΆ”κ°€ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git add .
    

    λ³€κ²½λœ λͺ¨λ“  파일이 μŠ€ν…Œμ΄μ§• μ˜μ—­μ— μΆ”κ°€λ©λ‹ˆλ‹€.

2.4 git commit -m "λ©”μ‹œμ§€"

  • μ„€λͺ…: μŠ€ν…Œμ΄μ§•λœ λ³€κ²½ 사항을 κΈ°λ‘ν•˜λ©°, 컀밋 λ©”μ‹œμ§€λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git commit -m "초기 컀밋"
    

    이 λͺ…령은 μŠ€ν…Œμ΄μ§•λœ λ³€κ²½ 사항을 β€œμ΄ˆκΈ° 컀밋” λ©”μ‹œμ§€μ™€ ν•¨κ»˜ κΈ°λ‘ν•©λ‹ˆλ‹€.


3. 브랜치 관리

3.1 git branch

  • μ„€λͺ…: ν˜„μž¬ μ €μž₯μ†Œμ˜ 브랜치 λͺ©λ‘μ„ ν‘œμ‹œν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git branch
    

    ν˜„μž¬ λΈŒλžœμΉ˜κ°€ λ³„ν‘œ(*)둜 ν‘œμ‹œλ©λ‹ˆλ‹€.

3.2 git branch <branch_name>

  • μ„€λͺ…: μƒˆλ‘œμš΄ 브랜치λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git branch feature/login
    

    feature/loginμ΄λΌλŠ” μƒˆ λΈŒλžœμΉ˜κ°€ μƒμ„±λ©λ‹ˆλ‹€.

3.3 git checkout <branch_name>

  • μ„€λͺ…: μ§€μ •ν•œ 브랜치둜 μ „ν™˜ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git checkout feature/login
    

    feature/login 브랜치둜 μž‘μ—…μ„ μ „ν™˜ν•©λ‹ˆλ‹€.

3.4 git checkout -b <branch_name>

  • μ„€λͺ…: μƒˆ 브랜치λ₯Ό μƒμ„±ν•˜κ³  μ¦‰μ‹œ ν•΄λ‹Ή 브랜치둜 μ „ν™˜ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git checkout -b feature/register
    

    feature/registerλΌλŠ” μƒˆ λΈŒλžœμΉ˜κ°€ μƒμ„±λ˜κ³  μž‘μ—… 브랜치둜 μ „ν™˜λ©λ‹ˆλ‹€.

3.5 git merge <branch_name>

  • μ„€λͺ…: λ‹€λ₯Έ 브랜치λ₯Ό ν˜„μž¬ λΈŒλžœμΉ˜μ— λ³‘ν•©ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git merge feature/login
    

    feature/login 브랜치λ₯Ό ν˜„μž¬ λΈŒλžœμΉ˜μ— λ³‘ν•©ν•©λ‹ˆλ‹€.


4. 원격 μ €μž₯μ†Œ μž‘μ—…

4.1 git remote add origin <repository_url>

  • μ„€λͺ…: 둜컬 μ €μž₯μ†Œμ— 원격 μ €μž₯μ†Œλ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git remote add origin https://github.com/user/repository.git
    

    원격 μ €μž₯μ†Œ origin이 μΆ”κ°€λ©λ‹ˆλ‹€.

4.2 git push origin <branch_name>

  • μ„€λͺ…: 둜컬 λ³€κ²½ 사항을 원격 μ €μž₯μ†Œμ— μ—…λ‘œλ“œν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git push origin main
    

    둜컬 main λΈŒλžœμΉ˜κ°€ 원격 μ €μž₯μ†Œμ— μ—…λ‘œλ“œλ©λ‹ˆλ‹€.

4.3 git pull origin <branch_name>

  • μ„€λͺ…: 원격 μ €μž₯μ†Œμ˜ λ³€κ²½ 사항을 둜컬둜 κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git pull origin main
    

    원격 main 브랜치의 λ³€κ²½ 사항이 둜컬둜 λ³‘ν•©λ©λ‹ˆλ‹€.


5. 둜그 및 이λ ₯ 확인

5.1 git log

  • μ„€λͺ…: 컀밋 이λ ₯을 ν‘œμ‹œν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git log
    

    컀밋 ν•΄μ‹œ, μž‘μ„±μž, λ‚ μ§œ, λ©”μ‹œμ§€κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

5.2 git log --oneline

  • μ„€λͺ…: κ°„λ‹¨ν•œ ν˜•μ‹μœΌλ‘œ 컀밋 이λ ₯을 ν‘œμ‹œν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git log --oneline
    

    각 컀밋이 ν•œ μ€„λ‘œ μš”μ•½λ©λ‹ˆλ‹€.

5.3 git log --graph

  • μ„€λͺ…: λΈŒλžœμΉ˜μ™€ 병합 이λ ₯을 κ·Έλž˜ν”„λ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
  • μ‚¬μš© μ˜ˆμ‹œ:

    1
    
    git log --graph
    

    브랜치 ꡬ쑰λ₯Ό μ‹œκ°μ μœΌλ‘œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

😡 μ–΄? git log μ‹€ν–‰ν–ˆλŠ”λ° λ‚˜κ°ˆ μˆ˜κ°€ μ—†μ–΄μš”!!
git log λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ 터미널에 μ—¬λŸ¬ 컀밋 λ‘œκ·Έκ°€ ν‘œμ‹œλ˜κ³ , 더 λ§Žμ€ 둜그λ₯Ό 보기 μœ„ν•΄ μŠ€ν¬λ‘€ν•  수 μžˆλŠ” μƒνƒœκ°€ λ©λ‹ˆλ‹€.

  • 이 μƒνƒœλŠ” lessλΌλŠ” νŽ˜μ΄μ§€ 넀이터(paginator) 도ꡬλ₯Ό μ‚¬μš©ν•˜λŠ” λͺ¨λ“œμž…λ‹ˆλ‹€.
  • μ—¬κΈ°μ—μ„œ 둜그 화면을 μ’…λ£Œν•˜λ €λ©΄ μ•„λž˜ 단계λ₯Ό 따라야 ν•©λ‹ˆλ‹€:

둜그 보기 μ’…λ£Œ 방법

  1. q ν‚€ λˆ„λ₯΄κΈ°
    git log 좜λ ₯ ν™”λ©΄μ—μ„œ q ν‚€λ₯Ό λˆ„λ₯΄λ©΄ 둜그 보기λ₯Ό μ’…λ£Œν•˜κ³  일반 ν„°λ―Έλ„λ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

μΆ”κ°€ 팁

  • ν™”λ©΄ λ‚΄ 이동

    • μœ„λ‘œ 슀크둀: k λ˜λŠ” ν™”μ‚΄ν‘œ μœ„(↑) ν‚€
    • μ•„λž˜λ‘œ 슀크둀: j λ˜λŠ” ν™”μ‚΄ν‘œ μ•„λž˜(↓) ν‚€
    • νŽ˜μ΄μ§€ λ‹¨μœ„ 이동:
      • μœ„λ‘œ: b ν‚€
      • μ•„λž˜λ‘œ: μŠ€νŽ˜μ΄μŠ€λ°”(Space) ν‚€
  • 검색 κΈ°λŠ₯ μ‚¬μš©

    • /λ₯Ό μž…λ ₯ν•œ ν›„ 검색어λ₯Ό μž…λ ₯ν•˜λ©΄ ν•΄λ‹Ή ν‚€μ›Œλ“œκ°€ ν¬ν•¨λœ λ‚΄μš©μ„ 검색할 수 μžˆμŠ΅λ‹ˆλ‹€.
      예: /fixλ₯Ό μž…λ ₯ν•˜λ©΄ λ©”μ‹œμ§€μ— fixκ°€ ν¬ν•¨λœ 컀밋을 μ°ΎμŠ΅λ‹ˆλ‹€.

6. κ³ κΈ‰ λͺ…λ Ήμ–΄

6.1 λ³€κ²½ 사항 되돌리기

  • git reset <file>: μŠ€ν…Œμ΄μ§•λœ νŒŒμΌμ„ μ–ΈμŠ€ν…Œμ΄μ§•ν•©λ‹ˆλ‹€.

    1
    
    git reset main.py
    
  • git reset --hard HEAD: λ§ˆμ§€λ§‰ 컀밋 μƒνƒœλ‘œ μž‘μ—… 디렉토리λ₯Ό λ˜λŒλ¦½λ‹ˆλ‹€. (주의: λ³€κ²½ 사항 μ‚­μ œ)

    1
    
    git reset --hard HEAD
    
  • git revert <commit_hash>: νŠΉμ • 컀밋을 μ·¨μ†Œν•˜λŠ” μƒˆ 컀밋을 μƒμ„±ν•©λ‹ˆλ‹€.

    1
    
    git revert abc123
    

6.2 μž„μ‹œ μ €μž₯

  • git stash: ν˜„μž¬ μž‘μ—… λ‚΄μš©μ„ μž„μ‹œ μ €μž₯ν•©λ‹ˆλ‹€.

    1
    
    git stash
    
  • git stash pop: κ°€μž₯ 졜근의 μž„μ‹œ μ €μž₯을 μ μš©ν•˜κ³  μŠ€νƒμ—μ„œ μ œκ±°ν•©λ‹ˆλ‹€.

    1
    
    git stash pop
    

6.3 브랜치 재배치

  • git rebase <branch_name>: ν˜„μž¬ 브랜치λ₯Ό λ‹€λ₯Έ 브랜치 μœ„λ‘œ μž¬λ°°μΉ˜ν•©λ‹ˆλ‹€.

    1
    
    git rebase main
    

이 κΈ€μ—μ„œ 닀룬 λͺ…령어듀은 Git의 핡심 κΈ°λŠ₯을 μ΄ν•΄ν•˜κ³  ν™œμš©ν•˜κΈ° μœ„ν•œ κΈ°λ³Έ μ§€μΉ¨μž…λ‹ˆλ‹€. 좔가적인 μ˜΅μ…˜μ΄λ‚˜ κ³ κΈ‰ μ‚¬μš©λ²•μ€ git help <command>λ₯Ό 톡해 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. Git을 효과적으둜 ν™œμš©ν•˜κΈ° μœ„ν•΄ μ§€μ†μ μœΌλ‘œ μ‹€μŠ΅ν•˜κ³  λ‹€μ–‘ν•œ μ‹œλ‚˜λ¦¬μ˜€λ₯Ό κ²½ν—˜ν•΄ λ³΄μ„Έμš”.