노트

git reset (soft·mixed·hard)

git reset

인프라#git · 연결된 개념 2개

쉽게 말하면

git reset은 브랜치가 가리키는 커밋을 예전 지점으로 옮기는 명령이에요. 게임 세이브를 불러오듯 되돌리되, 가방에 담아 둔 것(스테이징)과 손에 든 것(작업 파일)까지 돌릴지를 옵션으로 골라요.

비유가 깨지는 곳 게임과 달리 날린 커밋은 한동안 남아 reflog로 되살릴 수 있어요. 다만 커밋하지 않은 수정을 --hard로 날리면 복구가 어렵고, 이미 푸시한 커밋은 reset 대신 git revert가 안전해요.

git reset <커밋>은 현재 브랜치가 가리키는 커밋(HEAD)을 옮기는 명령이다. 옵션에 따라 스테이징 영역(staging area, index)과 작업 디렉터리(working directory)까지 함께 되돌릴지가 달라진다.

옵션HEAD스테이징작업 디렉터리
--soft이동유지유지
--mixed (기본)이동되돌림유지
--hard이동되돌림되돌림
  • --soft: 방금 한 커밋만 취소하고 변경은 스테이징된 채 남긴다. 커밋 메시지를 고치거나 여러 커밋을 하나로 다시 묶을 때 쓴다
  • --mixed: 커밋과 git add를 취소한다. 파일 내용은 그대로라 다시 골라 담을 수 있다
  • --hard: 커밋하지 않은 변경까지 지운다. 추적되지 않는 파일은 남지만 수정 내용은 복구가 어렵다
git reset --soft HEAD~1   # 마지막 커밋 취소, 변경은 스테이징 유지
git reset HEAD~1          # = --mixed
git reset --hard origin/main

--hard로 커밋을 날렸어도 커밋 자체는 한동안 남아 있어서 reflog로 되살릴 수 있다. 이미 푸시한 커밋을 되돌릴 때는 히스토리를 다시 쓰는 reset 대신 git revert가 안전하다(머지와 리베이스 참고).

출처: git-reset 문서

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 인터랙티브 리베이스로 커밋 정리

    git rebase -i는 최근 커밋 목록을 편집기로 열어 순서를 바꾸고, 합치고, 메시지를 고치게 해 주는 명령이다. 리뷰 전에 "작업하면서 생긴 지저분한 커밋"을 읽기 좋은 단위로 다듬을 때 쓴다.

  • 여러 저장소 합치기

    따로 관리하던 Git 저장소를 하나로 합칠 때, 히스토리를 버리지 않고 옮기는 방법이 두 가지 있다. 저장소 루트끼리 그대로 합치거나(unrelated histories 머지), 한쪽을 다른 쪽의 하위 폴더로 넣는다(subtree). 모노레포로 옮길 때 자주 쓴다.

  • 커밋 메시지와 원자적 커밋

    좋은 커밋은 한 가지 변경만 담고(원자적 커밋, atomic commit), 그 변경이 무엇이고 왜 필요했는지를 메시지로 설명한다. 히스토리는 나중의 나와 동료가 읽는 문서다.

  • 정리(Tidying)

    동작을 바꾸지 않는 아주 작은 구조 변경. 켄트 벡은 리팩터링이라는 말이 "기능 개발 중간의 긴 공사"처럼 쓰이며 동작 보존 원칙이 흐려지자, 더 작고 겁나지 않는 단위를 정리라는 이름으로 따로 불렀다. refactoring의 부분집합이다.

  • GitOps

    GitOps는 "환경이 어떤 상태여야 하는가"를 전부 git 저장소에 선언해 두고, git에 적힌 것을 유일한 진실(single source of truth)로 삼아 실제 환경을 맞추는 운영 방식이다. 서버에 직접 손대지 않고, 바꾸고 싶으면 git을 고친다.

보기 옵션