Post

[Git] 3. reset & revert

πŸš€ 차이점


λͺ…λ Ήμ–΄λͺ©μ μž‘동 λ°©μ‹νžˆμŠ€ν† λ¦¬
reset컀밋 자체λ₯Ό μ—†μ• κ±°λ‚˜ 되돌림브랜치 HEADλ₯Ό κ³Όκ±° μ»€λ°‹μœΌλ‘œ μ΄λ™νžˆμŠ€ν† λ¦¬ μˆ˜μ •λ¨
revertλ˜λŒλ¦¬λŠ” μƒˆ 컀밋을 생성지정 μ»€λ°‹μ˜ λ³€κ²½ 사항을 λ°˜λŒ€λ‘œ μ μš©ν•œ μƒˆ 컀밋 μƒμ„±νžˆμŠ€ν† λ¦¬ 보쑴됨

μ–Έμ œ 써야 ν• κΉŒ?

  • reset: 둜컬 μž‘μ—… νžˆμŠ€ν† λ¦¬λ₯Ό μˆ˜μ •ν•˜κ³  싢을 λ•Œ
  • revert: 이미 pushν•œ λΈŒλžœμΉ˜μ—μ„œ μ·¨μ†Œν•˜κ³  싢을 λ•Œ

πŸ› οΈ git reset


  • 브랜치 포인터(HEAD)λ₯Ό κ³Όκ±° μ»€λ°‹μœΌλ‘œ μ΄λ™ν•΄μ„œ κ·Έ 이후 컀밋을 μ‚­μ œ
  • 둜컬 νžˆμŠ€ν† λ¦¬λ₯Ό κ°•μ œλ‘œ λ°”κΎΈκΈ° λ•Œλ¬Έμ— 곡유된 λΈŒλžœμΉ˜μ—λŠ” μ‚¬μš© X
  • λͺ¨λ“œμ— 따라 μž‘λ™ λ²”μœ„κ°€ 달라진닀.
    • --soft: HEAD만 이동 β†’ μž‘μ—… 디렉토리와 μŠ€ν…Œμ΄μ§• μ˜μ—­μ€ κ·ΈλŒ€λ‘œ
    • --mixed: HEAD 이동 + μŠ€ν…Œμ΄μ§• μ΄ˆκΈ°ν™” β†’ μž‘μ—… λ””λ ‰ν† λ¦¬λŠ” κ·ΈλŒ€λ‘œ (κΈ°λ³Έκ°’)
    • --hard: HEAD 이동 + μŠ€ν…Œμ΄μ§• μ΄ˆκΈ°ν™” + μž‘μ—… λ””λ ‰ν† λ¦¬κΉŒμ§€ 되돌림 β†’ μœ„ν—˜!

예제

1
2
3
4
5
6
7
8
# λ§ˆμ§€λ§‰ 컀밋을 μ—†μ• κ³  μŠ€ν…Œμ΄μ§•μ€ μœ μ§€
git reset --soft HEAD~1

# λ§ˆμ§€λ§‰ 컀밋을 μ—†μ• κ³  μŠ€ν…Œμ΄μ§• μ΄ˆκΈ°ν™”
git reset HEAD~1

# λ§ˆμ§€λ§‰ 컀밋을 μ—†μ• κ³  μž‘μ—… λ‚΄μš©λ„ μ „λΆ€ 되돌림 (주의!)
git reset --hard HEAD~1

상세 μ˜ˆμ‹œ

상황: μ‹€μˆ˜λ‘œ μ»€λ°‹ν–ˆλŠ”λ°, λ‹€μ‹œ μž‘μ—…ν•˜λ˜ μƒνƒœλ‘œ 되돌리고 싢을 λ•Œ

  • 예λ₯Ό λ“€μ–΄ 컀밋이 μ΄λ ‡κ²Œ λ˜μ–΄μžˆμ„ λ•Œ

    1
    
    A -- B -- C (HEAD)
    
  • HEAD λŠ” C 컀밋을 가리킀고 있고, C 컀밋을 μ—†μ• κ³  μ‹Άλ‹€λ©΄

  1. git reset --soft HEAD~1
    • HEADκ°€ B둜 이동
    • C 컀밋은 μ—†μ–΄μ§€μ§€λ§Œ μž‘μ—… λ‚΄μš©κ³Ό μŠ€ν…Œμ΄μ§•μ€ μœ μ§€λ¨
    1
    
    A -- B (HEAD)
    
    • μž‘μ—… 파일과 μŠ€ν…Œμ΄μ§•μ— 변경사항 λ‚¨μ•„μ„œ λ‹€μ‹œ 컀밋 κ°€λŠ₯
  2. git reset --mixed HEAD~1
    • HEADκ°€ B둜 이동
    • C 컀밋 사라지고, μŠ€ν…Œμ΄μ§• μ˜μ—­μ€ μ΄ˆκΈ°ν™”λ¨
    • μž‘μ—… νŒŒμΌμ€ κ·ΈλŒ€λ‘œ (μˆ˜μ • μƒνƒœλ‘œ 남아 있음)

πŸ› οΈ git revert


  • κΈ°μ‘΄ 컀밋은 μœ μ§€ν•˜κ³ , κ·Έ 컀밋을 μ·¨μ†Œν•˜λŠ” λ‚΄μš©μ˜ μƒˆ 컀밋을 좔가함
  • μ•ˆμ „ν•˜κ²Œ 기둝을 되돌릴 수 μžˆμ–΄, 이미 pushν•œ λΈŒλžœμΉ˜μ—μ„œλ„ μ‚¬μš© κ°€λŠ₯
  • ν˜‘μ—… μ€‘μ—λŠ” reset λŒ€μ‹  revert ꢌμž₯!

예제

1
2
3
4
5
# νŠΉμ • 컀밋 λ˜λŒλ¦¬λŠ” μƒˆ 컀밋 생성
git revert μ»€λ°‹ν•΄μ‹œ

# 예) λ§ˆμ§€λ§‰ 컀밋 되돌리기
git revert HEAD

상세 μ˜ˆμ‹œ

상황: 이미 원격 μ €μž₯μ†Œμ— ν‘Έμ‹œν•œ 컀밋 Cλ₯Ό μ·¨μ†Œν•˜κ³  싢을 λ•Œ

  • C 컀밋을 μ‚­μ œν•˜λ©΄ νžˆμŠ€ν† λ¦¬κ°€ κΌ¬μ΄λ‹ˆκΉŒ, μ·¨μ†Œ 컀밋을 λ§Œλ“€μ–΄μ„œ λ˜λŒλ¦°λ‹€

    1
    2
    
    A -- B -- C -- D (HEAD)
                    ↑ revert 컀밋 D    
    
  • git revet C λͺ…λ Ήμ–΄κ°€ C μ»€λ°‹μ˜ λ³€κ²½ λ‚΄μš©μ„ λ°˜λŒ€λ‘œ μ μš©ν•œ D 컀밋을 μƒˆλ‘œ λ§Œλ“œλŠ” 것
  • ν˜‘μ—… 쀑인 ν”„λ‘œμ νŠΈμ—μ„œ μ•ˆμ „ν•˜κ²Œ μ·¨μ†Œν•  수 μžˆλ‹€

Β© Hoon. Some rights reserved.