Git

Git reset 커밋 기록 완벽하게 제거하는 방법

JohnnyDeveloper 2024. 9. 23. 13:49

Git reset 명령어로 커밋 기록을 안전하게 제거하는 방법을 알아보고, Hard, soft, mixed 모드의 차이점을 알아봅니다.

임시로 지정한 커밋

Git reset 커밋 기록 완벽하게 제거하는 방법

1. Git reset의 개요

Git은 버전 관리 도구로 개발 중 발생한 문제나 불필요한 커밋을 취소하고 싶을 때 reset 명령어를 사용하여 기록을 수정할 수 있습니다. 특히, 혼자 작업하는 경우 Git reset을 사용해 커밋 기록을 완전히 제거할 수 있으며, 협업 시에도 적절하게 활용할 수 있습니다. 이번 글에서는 Git reset 명령어의 세 가지 모드와 그 차이점을 통해 커밋 기록을 효과적으로 삭제하고 관리하는 방법을 알아보겠습니다.

2. Git reset 명령어란?

Git reset은 커밋 기록을 수정하거나 이전 상태로 되돌리기 위한 명령어입니다. 주로 다음과 같은 세 가지 모드로 구분됩니다:

  • Soft: 커밋을 제거하지만, 변경 사항을 staging area에 유지합니다.
  • Mixed: 커밋을 제거하고 변경 사항을 working directory로 되돌립니다.
  • Hard: 커밋과 변경 사항을 모두 삭제하여 프로젝트를 특정 커밋 시점으로 되돌립니다.

이 세 가지 모드는 각기 다른 상황에 따라 사용되며, 실수로 코드를 되돌리고자 할 때 매우 유용합니다.

3. Git reset의 모드별 사용법

3.1 Soft 모드

Git reset --soft 모드는 커밋을 취소하고, 커밋하기 전에 상태로 코드를 되돌립니다. 하지만 변경 사항은 staging에 남아 있으므로 이후 커밋을 다시 조정할 수 있습니다.

git reset --soft HEAD~1

이 명령어는 가장 최근 커밋을 취소하고, 해당 변경 사항을 유지합니다. 협업 중에는 추천되지 않지만, 개인 프로젝트에서는 커밋을 정리할 때 유용합니다.

3.2 Mixed 모드 (기본값)

Git reset --mixed는 Git의 기본 동작 방식으로, 커밋을 취소하고 변경 사항을 working directory로 되돌립니다. 이는 커밋을 되돌리지만 변경한 파일을 유지하고 다시 git add를 통해 커밋할 수 있게 해줍니다.

git reset --mixed HEAD~1

이 명령어는 가장 최근 커밋을 취소하며, 취소된 커밋의 파일은 staging area에서 해제되어 파일 작업을 계속할 수 있습니다.

3.3 Hard 모드

Git reset --hard는 가장 강력한 모드로, 커밋 기록뿐만 아니라 변경 사항까지 모두 삭제해 버립니다. 이 모드는 되돌릴 수 없기 때문에 매우 주의해서 사용해야 합니다.

git reset --hard HEAD~1

이 명령어는 최근 커밋을 포함한 변경 사항까지 모두 제거합니다. 로컬 파일까지 변경되므로, 중요한 파일을 백업하거나 신중하게 사용해야 합니다.

4. Git reset 사용 시 주의할 점

Git reset 명령어는 매우 강력한 도구이지만, 특히 hard 모드를 사용할 때는 신중해야 합니다. 다음과 같은 상황에서는 주의가 필요합니다:

4.1 협업 프로젝트에서의 문제

Git reset은 협업 환경에서 문제가 발생할 수 있습니다. 특히 git reset --hard 명령어를 사용하면 커밋뿐만 아니라 로컬 변경 사항까지 모두 삭제되기 때문에, 팀의 다른 개발자들이 참조하고 있던 기록을 무의식적으로 날려버릴 수 있습니다.

협업 프로젝트에서 reset을 사용할 때는 반드시 팀원들과의 커뮤니케이션이 중요합니다. 일반적으로는 git revert가 협업에 더 적합한 방법입니다. Git reset을 사용하기 전에, 팀원들에게 알리거나, 잘못된 기록을 되돌리기 위한 대체 방법을 생각해 보아야 합니다.

4.2 중요한 파일의 손실 위험

git reset --hard는 작업 디렉토리 내의 모든 변경 사항을 날려버리기 때문에, 중요한 파일이 있다면 이를 반드시 백업해야 합니다. 실수로 파일을 잃어버리는 경우 다시 복구할 방법이 없기 때문에, hard 모드는 신중하게 사용해야 합니다.

특히 다음과 같은 경우에는 hard 모드를 피하는 것이 좋습니다:

  • 중요한 작업 파일이 포함되어 있을 때
  • 협업 중인 브랜치에서 작업하고 있을 때

4.3 원격 저장소와의 불일치

Git reset은 기본적으로 로컬 작업에서 커밋을 되돌리는 명령어입니다. 하지만 이미 push된 커밋을 로컬에서 reset하고 이를 원격 저장소에 반영하려면, 강제 푸시를 해야 합니다. 강제 푸시는 다른 사람의 커밋을 덮어쓰는 위험이 있기 때문에 협업 프로젝트에서는 위험할 수 있습니다.

git push --force 명령어는 로컬에서의 reset된 기록을 원격에 강제로 반영하는 방식입니다. 하지만 이는 팀의 다른 개발자들이 이미 다운로드한 기록을 덮어쓸 수 있으므로, 신중하게 사용해야 합니다

git push --force-with-lease

. --force-with-lease 옵션은 현재 원격 저장소의 상태와 로컬 상태를 비교하여 안전하게 강제 푸시를 진행합니다.

4.4 Git reflog 활용하기

Git은 실수로 기록을 날렸을 때 복구할 수 있는 도구를 제공합니다. git reflog 명령어는 모든 커밋의 이동 내역을 기록하기 때문에, 실수로 git reset --hard를 사용해 커밋을 삭제했더라도 이를 복구할 수 있습니다.

git reflog
git reset --hard [HEAD@{n}]

이 명령어를 통해 실수로 삭제된 커밋을 복구할 수 있으며, 이전의 특정 시점으로 되돌릴 수 있습니다. 이 방법은 실수로 커밋을 삭제했을 때 매우 유용하게 사용될 수 있습니다.

5. 실제 사용

실제 혼자 작업하는 프로젝트에서 다른 pc에서 작업하기 위해서, 임시 커밋 후 원격 저장소에 푸쉬한 상황이 있었습니다. 협업하는 상황이 아니였기 때문에, 먼저 git reset을 진행했습니다.

git reset 후

하지만 원격 저장소에 이미 푸쉬를 해놓은 상태여서 따로 조치가 필요했습니다. 제가 수행한 방법은 다음과 같습니다.

  1. reset한 code 정리해서 다시 commit 하기

reset 후 로컬 저장소에 다시 commit한 상태

  1. git push --force-with-lease 명령어 실행

push 후 상태

 

위와 같이 작업한다면 깔끔하게 git history가 정리됩니다. 주의할점은 Git reset은 강력한 명령어로 커밋 기록을 정리하거나 되돌릴 수 있지만, 사용 시 주의가 필요합니다. 특히 협업 중인 프로젝트에서는 revert를 고려해 보는 것이 더 안전할 수 있습니다.