이번 글에서는 전에 이어 깃 관련 공부, 그 중에서도 실수 대응 방법을 복습해보겠습니다.
먼저 실수로 git add 명령어를 입력해 working directory에서 staging area 보낸 파일의 경우, $ git reset으로 다시 working directory로 보낼 수 있습니다.
실습을 위해 'gitfirst'에 또 다른 'git_mistake' 파일을 새로 만들어주었습니다.
이제 다시 git_mistake 파일을 오른쪽 클릭해서 추가 옵션 표시, Open Git Bash here을 눌러 Git 시스템을 키고 $ git init 입력 후, 'mistake1.txt' 파일을 만들어봅시다.
이제 git_practice 폴더로 가서 만들어진 mistake1.txt 파일을 열고, 아무 말이나 입력해봅시다.
그럼 $ git status를 입력했을 때 mistake1.txt가 수정을 기록해야 할 파일로 뜰겁니다.
이때 실수로 git add를 입력해서 해당 파일의 수정사항을 staging area로 보냈다고 가정해봅시다. 다음과 같이 말이죠.
$ git add mistake1.txt
이때 $ git reset 명령어를 입력하면 staging area로 간 대기 중인 파일 수정사항을 다시 working directory로 보낼 수 있습니다.
git reset
status로 확인해보니 다시 빨간색 글씨로 돌아왔네요. 다음으로 실수로 git commit 명령어를 입력해 파일을 repository로 잘못 보냈을 때입니다.
이때는 git reset에서 커밋해시(식별자)와 옵션을 지정해서 repository로 이동한 파일들을 working directory로 보냅니다.
구체적으로 staging area와 working directory를 함께 돌아갈 시점으로 초기화할지 말지 선택할 수 있습니다. 옵션은 다음과 같이 '--soft', '--mixed', '--hard'로 구성됩니다.
-- soft : staging area와 working directory는 현 상태 유지하고, respository만 변경
-- mixed : working directory만 현 상태 유지하고, staging area와 respository 변경
-- hard : working directory, staging area, repository 모두 돌아갈 시점의 상태로 변경
$ git reset (돌아갈 커밋 해시) --soft
$ git reset (돌아갈 커밋 해시) --mixed
$ git reset (돌아갈 커밋 해시) --hard
자세한 설명은 아래 블로그 글을 참고하시길 추천드립니다.
그럼 직접 해봅시다. 우선, 아까 mistake1. txt 수정사항이 working directory에 있는 상황에서 이 수정사항을 "mistake commit"이라는 이름으로 먼저 repository로 보내겠습니다.
다음으로 다시 mistake1.txt를 열고 한 줄을 더 추가해줍시다. 이 추가된 줄이 "실수의 줄"입니다.
그럼 다시 status로 보면 untracked files로 mistake1.txt가 뜰 것이고, 요걸 실수로 staging area를 넘어 repository까지 "true mistake commit"으로 보내버렸다고 해봅시다. 다음과 같이 말이죠.
이제 git reset 명령어를 사용해 respository로 간 파일을 다시 working directory로 가져오고자 하는데요, reset 뒤에 초기화할 커밋의 커밋해시(식별 번호)를 확인하기 위해 $ git log --online 명령어를 사용합니다.
mistake commit에 f8bbfcf라는 커밋해시가 할당되었는데, 요기로 돌아갈겁니다. true mistake commit으로 간게 진짜 실수니까요.
저는 reset 그 중에서도 repository, staging area, working directory 모두 mistake commit으로 돌아가는 --hard 옵션을 사용해보겠습니다. 만약 soft였다면 staging area와 working directory는 현 상태 유지였을 겁니다.
$ git reset f8bbfcf --hard
수정사항이 잘 되돌려졌는지, $ git log와 $ git status로 확인해봅시다.
true mistake commit가 사라지고, 프로젝트 상태도 깔끔합니다. 잘 reset이 되었네요.
다음으로 특정 커밋의 수정 사항을 되돌리면서 수정을 되돌린 사실을 이력으로 남기는 $ git revert 명령어를 사용해봅시다.
이를 위해 강의에서 처럼 새롭게 add-mistake1.txt를 만들어주고 수정사항을 "second commit"이라는 이름으로 repository에 저장해봅시다.
이 second commit이 바로 실수였습니다. 그럼 실수를 바로잡기 위해, 그러면서도 바로잡은 기록을 남기기 위해 $ revert를 사용해보려고 합니다. 이때 revert 뒤에는 돌아가고자 하는 commit이 아니라 실수한 커밋 즉, 되돌릴 커밋의 커밋해시를 입력해줍니다. 이 경우엔 1f51032가 되겠죠.
git revert (되돌릴 커밋해시 ex. 1f51032)
입력하면 이렇게 또 에디터 창이 등장하는데요. 전에 .gitignore에서 했던 것처럼 커밋의 이름을 지정하고 Exit해줍니다. 저는 이렇게 이름을 지정해주었습니다.
그렇게 하고 ESC -> : wq 를 입력해 저장하고 나와서 $ ls로 확인해보면 "second commit"이 사라졌음을 확인할 수 있습니다.
그러면서도 $ git log --oneline을 입력하면 second commit이 기록으로 남아있다는 것을 알 수 있습니다.
강의 마지막에 실수 대응방법을 한번에 쉽게 정리주었는데요, 스테이징 실수를 되돌릴 땐 git reset 파일명, 커밋 실수를 되돌릴 땐 git reset '되돌아갈 커밋해시' --옵션, 커밋 실수를 되돌리면서 이를 기록할 땐 git revert '되돌릴 커밋해시'를 입력하면 된다고 합니다.
지금까지 유노코딩 YOUTUBE "깃과 깃허브가 처음인 당신에게" 강의 6강을 보고 공부한 내용 복습이었습니다. 정말 이해하기 쉽고 유익한 강의이니 보시길 추천드립니다.
다음에는 브랜치 관리 강의 복습으로 돌아오겠습니다. 감사합니다!