작업 중 git commit을 했는데 이를 취소하고 싶다면?
다양한 상황에 맞게 커밋을 취소하는 방법을 알아보자.
1. 아직 원격 저장소(깃허브)로 Push를 하지 않은 경우
(1) 최신 커밋 취소하기
이 명령어를 쓰면 최신 커밋을 취소하고 이전의 커밋으로 돌아갈 수 있다.
즉, 만약 그동안의 커밋 내역이 "1번째 커밋 > 2번째 커밋 > 3번째 커밋" 이었다면,
이 명령을 한 뒤에는 커밋 내역이 "1번째 커밋 > 2번째 커밋" 로 돌아가는 것이다.
아래 세 가지 방법 중 어느 것을 써도 상관 없다.
//방법1
$ git reset HEAD~
//방법2
$ git reset HEAD~1
//방법3
$ git reset HEAD^
<커밋 취소 시 어느 시점으로 돌아갈지 정하기>
하나의 커밋을 만들 때는 ①변경사항을 만들고 ②add를 하고 ③commit을 하는 단계를 거친다.
그렇다면 커밋을 취소하는 것은 이 중 어디까지 취소를 하는 것일까?
직접 정해줄 수 있다!
①번까지 모두 취소: 커밋을 취소하고, 모든 변경사항을 다 없애버린다. (완전한 초기화)
$ git reset --hard HEAD~
②번까지만 취소: 커밋을 취소하고, add한 것도 없던 일로 한다. (위에서 설명한 방법)
$ git reset HEAD~
③번만 취소: 커밋만 취소하고, add한 파일들은 그대로 둔다. (딱 커밋만 취소하기)
$ git reset --soft HEAD~
(2) 여러 개의 커밋 취소하기
만약 최신 1개의 커밋이 아니라, 여러 개의 커밋을 취소하려면
다음과 같이 개수를 명시해주면 된다.
//최신 2개의 커밋을 취소
$ git reset HEAD~2
※ Tip 1
커밋이 잘 취소되었나 궁금하다면, 커밋 목록을 확인해 볼 수도 있다.
취소 전후로 아래 명령어를 입력해보자.
//커밋 목록 확인
$ git log
그동안의 커밋 내역이 주르륵 뜰 것이다. 취소한 뒤에는 최신 것이 사라져 있을 것이다.
참고로 엔터 등 아무 키나 누르면 더 옛날 내역도 나온다.
창을 빠져나오려면 "q"키를 누르면 된다.
2. 이미 원격 저장소(깃허브)로 Push를 한 경우
로컬 저장소(내 컴퓨터)에서만 커밋을 삭제하는게 아니라
이미 깃허브 저장소에 푸시해버린 커밋을 취소하고 싶다면?
방법이 두 가지가 있다.
방법1. 커밋 기록을 아예 지우는 방식
첫 번째 방법은 위 1번의 명령어로 로컬 저장소(내 컴퓨터)에서 커밋을 취소한 뒤에,
이를 강제로 원격 저장소(깃허브)에 푸시하는 방법이다.
그럼 원격 저장소에도 새 커밋 히스토리가 반영된다.
커밋을 취소한 뒤에 아래 명령어를 입력하자.
//원격 저장소에 반영하기
$ git push -f origin main
참고로 깃허브에 이미 심어진 잔디에는 영향이 없는 것 같다.
잔디를 없애고 싶은 사람은 별로 없지만.. 없애고 싶을 때는 좀 답답하긴 하다.
방법2. 취소했다는 기록을 남기고 취소하는 방식
첫 번째 방법이 최신 커밋을 아예 없던 일로 만들어 버린다면,
두 번째 방법은 커밋 취소했음! 하는 기록을 남기고 취소하는 방식이다.
즉 최신 커밋에 해당하는 내용은 이전으로 되돌리되, 커밋 내역은 건드리지 않고
취소한 내용으로 새로운 커밋을 만든다.
만약 팀 프로젝트를 하고 있다면 이렇게 기록을 남겨야 팀원들이 혼란이 없을 것이다.
$ git revert HEAD
※ Tip 2
git revert를 했다가 취소하려면? 또 git revert를 하면 된다.
댓글