Git 버전 되돌리기
Git 버전 되돌리기: reset, restore, revert 가이드
Git에서 버전 되돌리기는 과거의 특정 시점으로 프로젝트 상태를 되돌리는 다양한 방법을 의미하며, 주로 git reset, git restore, git revert 세 가지 명령어를 통해 수행됩니다. 이 명령어들은 각각 다른 목적과 영향을 가지므로, 상황에 맞게 신중하게 선택하여 사용해야 합니다.
Git은 프로젝트의 모든 과정을 사진처럼 저장하는 스냅샷 방식으로 변경 기록을 관리하며, 문제가 발생했을 때 특정 시점의 커밋으로 되돌아갈 수 있게 합니다. 특히 협업 환경에서는 각 명령어의 영향력을 이해하고 적절한 도구를 선택하는 것이 매우 중요합니다.
1. git reset: 과거의 기록을 지우는 방식
git reset은 특정 커밋 이후의 모든 기록을 삭제하여 프로젝트를 과거로 되돌립니다. 마치 “지우개로 과거 페이지를 완전히 지우는 것”과 같으며, “아무 일도 없던 것처럼” 상태를 바꾸고 싶을 때 사용됩니다.
⚠️ 주의: 커밋 로그 자체가 사라지므로, 이미 원격 저장소에 공유된 이력에는 절대 사용해서는 안 됩니다. 주로 개인 로컬 저장소에서 커밋 기록을 깔끔하게 정리하고 싶을 때 적합합니다.
git reset에는 세 가지 주요 옵션이 있습니다.
git reset --soft <커밋 해시>- 역할: 커밋 기록만 되돌립니다. 변경된 파일 내용은 Staging Area에 그대로 유지됩니다.
- 상태: 즉시 다시 커밋할 수 있는 상태입니다.
- 비유: “과거로 돌아가지만 노트에 적었던 내용은 그대로 두고, 그 페이지만 다시 펼쳐보는 것.”
git reset --mixed <커밋 해시>(기본 옵션)- 역할: 커밋 기록과 Staging Area를 함께 되돌립니다. 변경된 파일 내용은 Working Directory에만 유지됩니다.
- 상태:
git add부터 다시 시작해야 하는 상태입니다. - 비유: “과거로 돌아가고 노트에 적은 내용을 다시 읽지만, 발표 준비 목록에서는 제외하는 것.”
git reset --hard <커밋 해시>- 역할: 커밋 기록, Staging Area, Working Directory의 모든 변경 사항을 완전히 삭제하여 과거 시점으로 초기화합니다.
- 상태: 되돌린 이후의 작업 내용은 복구가 거의 불가능합니다.
- 비유: “과거로 돌아가면서, 노트와 준비된 내용 모두 지워버리는 것.”
- 사용 시점: 보안에 민감한 비밀번호나 계정 정보 등이 커밋에 “실수로” 올라갔을 경우처럼, 해당 기록이 “절대” 남아선 안 되는 특수한 상황에서 제한적으로 사용됩니다.
2. git restore: 파일 단위로 되돌리는 방식
git restore는 커밋 기록 자체에는 영향을 주지 않고, 특정 파일의 변경 사항만 복구합니다. “책의 특정 페이지만 깨끗하게 복구하는 것”과 같아, 전체가 아닌 특정 부분만 되돌리고 싶을 때 매우 유용합니다.
git restore <파일>- 역할: Working Directory에서 수정한 파일을 가장 최근 커밋 상태로 복원합니다. 파일에 적용한 로컬 변경 사항이 모두 사라집니다.
- 비유: “작성 중이던 문서를 마지막으로 저장했던 버전으로 되돌리는 것.”
git restore --staged <파일>- 역할: Staging Area에 추가된 파일(
git add한 파일)을 스테이징 해제하여 Working Directory 상태로 되돌립니다. 파일의 실제 수정 내용은 그대로 유지됩니다. - 비유: “발표 대기 테이블에 올려둔 작업물을 다시 내 자리로 가져오는 것.”
- 사용 시점: 커밋에 포함하지 않을 파일을 스테이징에서 제외할 때 유용합니다.
- 역할: Staging Area에 추가된 파일(
3. git revert: 되돌린 기록을 남기는 방식
git revert는 특정 커밋의 변경 사항을 취소하는 새로운 커밋을 생성합니다. “틀린 내용을 정정하는 새 노트를 추가하는 것”과 같아, 변경 사항을 취소했음을 기록으로 남기면서 안전하게 되돌릴 수 있습니다.
👍 권장: 이력과 투명성이 중요한 협업 환경에서 가장 안전하며 권장되는 방법입니다.
git revert <커밋 해시>- 역할: 특정 커밋의 변경 내용을 그대로 되돌리는 새로운 커밋을 생성합니다. 기존의 문제 있던 커밋 기록은 그대로 유지됩니다.
- 결과: 새로운 커밋은 보통 “Revert ‘이전 커밋 메시지’“라는 제목으로 생성됩니다.
git revert -n <커밋 해시>- 역할: 특정 커밋의 변경 내용을 되돌리지만, 자동으로 커밋하지는 않습니다. 취소된 내용은 Working Directory에 반영되어 스테이징할 수 있는 상태가 됩니다.
- 사용 시점: 여러 개의 되돌리기 작업을 하나의 커밋으로 묶고 싶을 때 유용합니다.
커밋 히스토리 재구성 및 수정
git rebase
rebase는 커밋을 되돌리는 직접적인 명령어는 아니지만, 여러 커밋을 합치거나(squash), 순서를 바꾸는 등 커밋 히스토리를 깔끔하게 재작성하는 데 사용됩니다.
git rebase -i HEAD~<숫자>: 최근<숫자>개의 커밋을 대화형 모드(interactive)로 열어 수정합니다.- 주의 사항:
reset과 마찬가지로 히스토리를 변경하므로, 이미 원격 저장소에 공유된 커밋에는 절대 사용하지 마세요. 로컬에서 개인 작업을 정리할 때만 사용하는 것이 안전합니다.
git commit --amend
가장 최근 커밋을 수정하는 데 사용됩니다. 커밋 메시지를 변경하거나, 빠뜨린 파일을 뒤늦게 추가하여 이전 커밋에 덮어쓸 수 있습니다. 간단한 실수를 바로잡을 때 유용하지만, 이 역시 히스토리를 변경하는 작업이므로 공유된 커밋에는 신중하게 사용해야 합니다.