Git 커밋을 되돌리고 싶을 때, revert와 reset 두 가지 명령어를 사용할 수 있다.
소개
reset은 커밋 히스토리까지 삭제하면서 해당 커밋지점으로 되돌린다. 장점은 말그대로 깔끔하게 되돌릴 수 있다는 것이다. 단점은 커밋 히스토리를 삭제하므로, 나중에 리셋한 행위를 돌이킬 수 없다.
revert는 커밋 히스토리는 보존하며, 해당 커밋지점과 현재 커밋과 병합하면서 새로운 커밋을 생성한다. 장점은 커밋 히스토리를 보존하기 때문에 나중에 리셋한 행위를 돌이킬 수 있다. 단점은 히스토리가 남고, 병합이기 때문에 과거와 현재의 충돌지점을 손수 고쳐야 한다. 하지만 이 수고스러움 덕분에 장점이 하나 추가된다. 내가 되돌리고 싶은 코드만 골라서 돌이킬 수 있다는 점이다.
- 아직 remote repository로 push하지 않은 상태라면 reset를 사용한다.
- remote repository에 배포된 상태라면 revert를 사용해야 한다. remote repository에 있는 (이미 다른 개발자에게 배포된) 커밋 메시지를 지우는 일은 위험하다.
실습
준비: 파일 생성 및 커밋
code1.txt
하나
둘
셋
code2.txt
one
two
three
이렇게 두 파일과 커밋들을 생성했다.
Revert 해보기
one 커밋 상태로 돌이키고 싶다면, two 커밋을 되돌린다.
git revert [되돌릴 커밋 HASH]
code1 파일만 돌이키고 싶으면 code1은 Incoming Change를 선택하고, code2 파일은 그대로 두고 싶으면 Head(current change)를 선택하고 커밋을 하면 된다.
git add .
git commit
Revert 결과
code1.txt
하나
code2.txt
one
two
three
성공적으로 돌이켜졌다. Revert "two" 커밋 메시지 뜻은 two 커밋의 부모커밋 내용으로 돌이켰다는 뜻이다. 이 부분을 헷갈릴 수도 있으니 참고.
Reset 해보기
git reset [돌아가고 싶은 커밋 Hash]
one 커밋으로 돌아가고 싶으면, one 의 커밋 hash를 명령어 파라미터로 전달하면 된다.
git reset 결과, 커밋메시지가 전부 삭제된 것을 확인할 수 있다.
'공부노트' 카테고리의 다른 글
dpkg 패키지 매니저에서 깨진 패키지 강제 삭제하기 (0) | 2021.02.28 |
---|---|
ruby server 실행 시, bundler 실행 버그 (0) | 2021.02.24 |
Spring Data Rest 사용 후기 (0) | 2021.01.02 |
Ruby 데이터 타입 (0) | 2020.10.03 |
Windows Subsystem for Linux(WSL) 은 어떻게 동작할까? (0) | 2020.09.20 |