Git에서 변경 사항 되돌리기: Reset, Restore, Revert 설명
git restore, reset, revert를 이해하여 파일 스테이징 해제, 로컬 편집 취소, 커밋 되돌리기, 공유 히스토리 재작성 방지 방법을 알아보세요.
Git에서 변경 사항 되돌리기: Reset, Restore, Revert 설명
Git에서 변경 사항을 되돌리는 것은 작업 트리, 스테이징 영역, 커밋 히스토리 중 어떤 레이어를 변경하는지 알면 안전합니다. 일반적인 명령어는 git restore, git reset, git revert이며, 각각 다른 문제를 해결합니다.
큰 규칙은 간단합니다: 파일에는 restore, 로컬 히스토리 변경에는 reset, 다른 사람이 이미 가져갔을 수 있는 커밋을 되돌릴 때는 revert를 사용하세요.
핵심 개념 이해하기
이 영역들을 잘 구분하세요:
- 작업 트리: 편집하는 파일들.
- 스테이징 영역(인덱스라고도 함): 다음 커밋을 위해 선택된 변경 사항들.
- 커밋 히스토리: 이미 기록된 커밋들.
HEAD: 현재 브랜치가 가리키는 커밋.
무엇이든 되돌리기 전에 git status를 실행하세요. 변경 사항이 스테이징되지 않았는지, 스테이징되었는지, 아니면 이미 커밋되었는지 알려줍니다.
git restore: 작업 디렉토리와 스테이징 영역의 변경 사항 폐기
브랜치 히스토리를 움직이지 않고 작업 트리나 스테이징 영역의 파일을 변경하려면 git restore를 사용하세요.
파일 스테이징 해제
실수로 파일을 스테이징했다면 --staged로 스테이징을 해제하세요:
git restore --staged <file>
모든 것을 스테이징 해제하려면:
git restore --staged .
파일 편집 내용은 작업 트리에 남아 있습니다. 단지 다음 커밋에서 제거될 뿐입니다.
작업 디렉토리의 변경 사항 폐기
한 파일의 스테이징되지 않은 편집을 버리려면:
git restore <file>
이렇게 하면 작업 트리 복사본이 인덱스와 일치하게 됩니다. 파일이 스테이징되지 않았다면 일반적으로 HEAD로 돌아갑니다. 로컬 편집을 폐기하므로 먼저 git diff를 검토하세요.
파일의 스테이징된 변경과 스테이징되지 않은 변경을 모두 폐기하고 HEAD에서 복원하려면:
git restore --source=HEAD --staged --worktree <file>
특정 커밋에서 파일 복원
이전 커밋에서 하나의 파일을 가져올 수도 있습니다:
git restore --source=<commit> -- path/to/file
이렇게 하면 작업 트리의 파일이 변경됩니다. 이전 버전이 앞으로 원하는 것이라면 커밋하세요.
git reset: 히스토리 다시 쓰기
현재 브랜치 포인터를 이동하려면 git reset을 사용하세요. 모드에 따라 스테이징 영역과 작업 트리도 변경할 수 있습니다.
모드 이해하기 (--soft, --mixed, --hard)
세 가지 일반적인 모드는:
git reset --soft HEAD^
HEAD를 한 커밋 뒤로 이동시키고 되돌린 커밋의 변경 사항을 스테이징된 상태로 유지합니다.
git reset --mixed HEAD^
HEAD를 한 커밋 뒤로 이동시키고 되돌린 커밋의 변경 사항을 스테이징되지 않은 상태로 유지합니다. --mixed가 기본값이므로 git reset HEAD^도 동일합니다.
git reset --hard HEAD^
HEAD를 한 커밋 뒤로 이동시키고 해당 변경 사항을 스테이징 영역과 작업 트리에서 폐기합니다. 이는 파괴적입니다. 가볍게 실행하지 마세요.
유용한 reset 패턴:
git reset --soft HEAD^ # 마지막 로컬 커밋 재실행, 변경 사항 스테이징 유지
git reset HEAD^ # 마지막 로컬 커밋 취소, 변경 사항 스테이징 해제 유지
git reset # 모든 스테이징된 변경 사항 스테이징 해제
git reset --hard origin/main # 로컬 변경 사항 폐기하고 origin/main과 일치
오래된 커밋 리셋
작업 트리에 변경 사항을 유지하면서 브랜치를 두 커밋 뒤로 이동하려면:
git reset --mixed HEAD~2
로컬이거나 팀이 다시 쓰기로 동의한 커밋만 리셋하세요. 커밋이 이미 공유 브랜치에 있다면 git revert를 선호하세요.
git revert: 변경 사항을 취소하는 새 커밋 생성
git revert는 이전 커밋의 역을 적용하는 새 커밋을 만듭니다. 원래 커밋을 삭제하거나 이동하지 않으므로 공유 브랜치에 안전합니다.
하나의 커밋 되돌리기:
git revert <commit-hash>
범위 되돌리기:
git revert HEAD~3..HEAD
충돌이 발생하면 해결하고, 파일을 스테이징한 후 계속하세요:
git add <fixed-files>
git revert --continue
병합 커밋을 되돌릴 때는 Git이 어떤 부모를 메인라인으로 처리해야 하는지 알아야 하므로 추가 주의가 필요합니다:
git revert -m 1 <merge-commit>
병합이 도입한 내용을 이해할 때만 이 작업을 수행하세요. 프로덕션 브랜치의 경우 병합을 되돌리기 전에 검토를 요청하세요.
올바른 명령어 선택하기
이 빠른 가이드를 사용하세요:
- 파일 스테이징 해제:
git restore --staged <file>. - 파일의 스테이징되지 않은 편집 폐기:
git restore <file>. - 마지막 로컬 커밋 취소하고 변경 사항 스테이징 유지:
git reset --soft HEAD^. - 마지막 로컬 커밋 취소하고 변경 사항 스테이징 해제 유지:
git reset HEAD^. - 로컬 변경 사항과 커밋을 파괴적으로 폐기:
git reset --hard <commit>. - 푸시된 커밋을 안전하게 취소:
git revert <commit-hash>.
실용적인 요점
무엇이든 되돌리기 전에 git status를 실행하고 무엇을 변경할지 결정하세요. 파일 수준 정리에는 restore, 로컬 푸시되지 않은 커밋에는 reset, 공유 히스토리에는 revert를 사용하세요. 명령어에 --hard가 포함되면 잠시 멈추고 먼저 git diff를 확인하세요.