본문 바로가기
Programming/Git

[Git] 커밋 취소

by Bam_t 2021. 6. 22.
728x90

커밋하는 법까지 배웠었습니다. 그렇다면 스테이징 때 처럼 커밋도 취소할 수 있지않을까요? 당연히 가능합니다. 이번에는 커밋을 취소하는 방법을 알아보도록 하겠습니다.

이 포스트들은 알려드린대로 처음부터 사용한 파일로 이어나가며 실습하겠습니다.

우선 지난 포스트인 '.gitignore'파일 소개에 따르면 현재 'test01.txt' 파일의 내용은 다음과 같을 것 입니다.

이 내용을 다음과 같이 수정하고 시작하겠습니다.


1. 최신 커밋만 취소하기 - git reset

우선 vim으로 다음과 같이 한 줄을 추가 하고 'git commit -am'명령으로 커밋까지 완료 해보겠습니다.

commit msg 로그가 있는 커밋이 최신 커밋

이렇게 커밋이 완료되고 방금한 커밋이 최신 커밋이 됩니다. 이때 다음과 같은 명령으로 최신 커밋만을 취소할 수 있습니다.

git reset HEAD^

이처럼 최신 커밋이 사라지고 이전 커밋이 최신 커밋이 되었음을 확인할 수 있습니다.

이 reset 명령에는 옵션이 있는데 간단히 알아보겠습니다.

1-1. --soft

git reset --soft HEAD^는 최신 커밋 이전의 상태로 작업 트리(현재 작업 중인 폴더)를 되돌립니다. 

1-2. --mixed

git reset --mixed HEAD^는 최신 커밋과 스테이징이전으로 작업 트리를 되돌립니다. git reset명령의 기본값입니다.

1-3. --hard

git reset --hard HEAD^는 최신 커밋과 스테이징 이전 그리고 파일 수정 이전의 상태로 작업 트리를 되돌립니다. 주의 할 점은 --hard 옵션을 통해 되돌린 내용은 복구가 불가능 합니다.

 

 

 

2. 특정 커밋으로 되돌아가기 - git reset

git reset 명령에는 최신 뿐만이 아니라 특정 커밋까지 되돌릴 수 있는 기능도 있습니다.

git reset 커밋ID

커밋 ID(혹은 커밋 해시)란, 커밋에 부여된 일종의 식별 번호 입니다. 다음 사진에서 빨간 박스에 포함된 부분이 커밋 ID입니다.

 

vim 작업을 통해 다음과 같이 2번의 커밋 작업을 했습니다. 그리고 git reset 명령을 통해 커밋 메세지가 commit msg01인 첫 번째 커밋으로 돌아가 보도록 하겠습니다.

git reset 명령 이후 git log 명령으로 확인해 본 결과 이전 커밋들은 사라지고 첫 번째 커밋들로 돌아왔음을 확인할 수 있습니다.

이렇게 해시ID를 이용하면 특정 커밋으로도 복귀할 수 있습니다.

 

 

3. 커밋을 남기고 되돌리기 - git revert

이전에 본 git reset 명령은 커밋을 되돌리면서 수정사항을 삭제했습니다. 그러나 커밋을 되돌리면서 수정사항도 남겨두어야할 상황도 있는데요. 그런 경우를 위해 git revert명령이 존재합니다. 

우선 3개의 커밋 사항을 추가했습니다.

이제 revert 명령으로 되돌려볼 것 인데요. 이때 주의점이 있습니다. reset명령과는 다르게 돌아갈 커밋 ID를 지정하는 것이 아니라 되돌릿 커밋의 ID를 지정해야합니다.

git revert 커밋ID

본 예제에서는 최신 커밋(commit msg03)을 되돌릴 것이므로 해당 ID를 복사 붙여넣기 합니다.

이때 git revert 해시ID를 입력하면 다음과 같은 창이 뜹니다. revert를 위해 추가 메세지를 남기는 창이기에 추가적으로 적을 사항이 있다면 이곳에서 적으면 됩니다.  (이 창이 bash상에서 vim을 이용해서 초반 포스트에서 vim을 소개했었습니다.)

다음과 같이 한 문장을 추가 하고 :wq로 나갔습니다. (메세지 남기는 것이 필수는 아님!)

그리고 git log 명령을 통해 커밋 상태를 확인하면 커밋 기록은 남겨져 있는채로 취소 되었다는 Revert 상태가 남게 됩니다.

 

cat명령이나 vim으로 파일을 열어보면 커밋 기록은 남지만 수정 사항은 되돌려 졌음을 확인할 수 있습니다.


 

728x90

'Programming > Git' 카테고리의 다른 글

[Git] tracked 파일  (0) 2021.06.25
[Git] 커밋 메세지의 수정  (0) 2021.06.24
[Git] .gitignore  (0) 2021.06.21
[Git] 변경 사항의 확인  (0) 2021.06.21
[Git] 커밋, Commit  (0) 2021.06.11

댓글