작업을 하다보면 최종 수정본이라고 생각해서 push를 한 뒤, 오류를 발견해 다시 동일한 commit을 보내기 민망할 때가 있습니다. (예: "000 오류 수정"으로 push 했는데 000 오류 수정 사항이 더 있을 때)
물론 "진짜 ## 오류 수정"이런 식으로 작업해도 되지만 굳이 기록하지 않아도 되는 history는 지우고 싶은 사람의 심리...
그럴 때에는 git reset
명령어를 활용하면 됩니다.
git reset
명령어는 로컬 리포지토리의 현재 HEAD
를 지정한 커밋으로 이동시키는 데 사용됩니다. reset
명령어는 --hard
, --mixed
, --soft
세 가지 주요 옵션을 제공하며, 각각의 옵션은 커밋, 인덱스(스테이징 영역), 워킹 디렉토리에 미치는 영향이 달라집니다.
git reset 주요 옵션 설명
1. -hard
- 명령어:
git reset --hard <commit>
- 영향 범위: 커밋, 인덱스, 워킹 디렉토리(모두 변경)
- 설명:
-hard
옵션은 지정한 커밋으로HEAD
를 이동시키고, 인덱스와 워킹 디렉토리의 파일도 해당 커밋의 상태로 완전히 되돌림. 즉, 변경 사항과 스테이징된 파일 모두 삭제. - 주의사항: 변경 사항이 모두 삭제되므로 복구가 어려움. 변경사항이 있다면 실행 전 commit하여 로컬에 저장 후 실행.
2. -mixed (기본 옵션)
- 명령어:
git reset --mixed <commit>
- 영향 범위: 커밋, 인덱스(스테이징 영역 변경, 워킹 디렉토리는 변경 없음)
- 설명:
-mixed
옵션은HEAD
를 지정한 커밋으로 이동시키고, 인덱스는 지정한 커밋의 상태로 되돌림. 하지만 워킹 디렉토리의 변경 사항은 그대로 남음. 즉, 스테이징된 파일은 모두 언스테이지되고, 파일 변경 사항은 그대로 유지. - 기본값: 옵션을 명시하지 않으면
-mixed
가 기본적으로 적용.
3. -soft
- 명령어:
git reset --soft <commit>
- 영향 범위: 커밋(변경, 인덱스와 워킹 디렉토리는 변경 없음)
- 설명:
-soft
옵션은HEAD
를 지정한 커밋으로 이동시키지만, 인덱스와 워킹 디렉토리의 상태는 변경하지 않음. 즉, 삭제된 커밋의 변경 사항은 스테이징된 상태로 남아 있음. 이 옵션은 이전 커밋을 변경하려는 경우에 유용.
요약
-hard
: 커밋, 인덱스, 워킹 디렉토리를 지정된 커밋 상태로 완전히 되돌림 (변경 사항 삭제).-mixed
: 커밋과 인덱스만 되돌리고, 워킹 디렉토리는 그대로 유지 (변경 사항 유지, 스테이징 해제).-soft
: 커밋만 되돌리고, 인덱스와 워킹 디렉토리는 그대로 유지 (변경 사항 스테이징 상태로 유지).
활용 예시
먼저, 어느 시점으로 돌릴 지를 알기 위해서 log를 확인합니다. log 내용은 실제 데이터가 아닌 설명을 위해 만들었습니다.
$ git log --oneline 999de04 (HEAD -> master, origin/master, origin/HEAD) modified: 000 table 오류 수정 999de03 modified: 000 수정 999de02 update: 000 999de01 update: 000 (생략)
hard 옵션으로 바로 이전 push한 작업을 취소합니다. (취소 전 commit 안 하면 local 수정 내용 다 날라가니 주의!) hard 옵션이 아닌 기본 옵션으로 작업해도 됩니다.
$ git reset --hard HEAD~1 HEAD is now at 999de03 modified: 000 수정
강제 push option : -f 을 주어 변경 사항을 push합니다. 협업 시에는 꼭 동료에게 수정사항 commit 내용이 있었는 지 확인해야 합니다. 해당 명령어 실행 시, 돌아간 시점부터 내가 수정한 사항 이외의 것은 모두 날라가게 됩니다.
$ git push -f origin master Total 0 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0) To ssh://(생략) + 999de03...999de99 master -> master (forced update)
'IT > Git' 카테고리의 다른 글
[Git] 기본 명령어 정리 (0) | 2024.09.02 |
---|