commit 또는 push 했던 내용이 잘못되어서 이전 상태로 되돌려야 하는 경우는 종종 발생한다.
로컬에 commit만 하는 경우에는 쉽게 reset 기능으로 처리할 수 있지만, 원격 저장소까지 push가 된 경우엔 revert를 사용한다.
특정 지점의 과거 커밋으로 이동, 이동된 이후의 커밋은 삭제된다.
사용 상 주의 요망 : 과거 커밋으로 이동하면서 그 이후 커밋은 삭제되어 되돌릴 수 없으므로 주의가 필요하다.
특히, push 후에는 다른 사람의 코드에 문제를 일으킬 소지가 있으므로 금지한다.
즉, 애초에 commit 하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 것이다.
주로 사용하는 옵션 3가지 : --mixed, --hard, --soft / 기본값은 --mixed
git reset [--옵션] 커밋ID
hard 옵션을 적용하면 해당 커밋ID의 상태로 워킹디렉토리와 Staging 영역 모두 초기화 된다.
변경 이력 및 내용 전부 삭제한다.
mixed 옵션을 적용하거나 옵션을 적용하지 않으면 해당 커밋ID의 상태로 Staging 영역은 초기화되고 워킹디렉토리는 변경되지 않는다.
soft 옵션을 적용하면 해당 커밋ID의 상태로 Staging 영역과 워킹디렉토리 모두 변경되지 않는다.
--hard:
branch 이동, 과거로 완전 복구
--mixed(default):
staging area에서 빼기.
--soft:
commit 되돌리기.
로컬 저장소의 커밋 히스토리가 원격 저장소의 커밋 히스토리보다 뒤에 있어 (non-fast-forward) 인 경우, push를 진행시 오류가 발생한다.
이럴 때는 강제로 덮어써야 하므로 push에 -f 또는 -force 옵션을 주어 강제로 덮어쓴다.
혼자 사용하는 브랜치가 아니므로 reset 후, 삭제될 커밋 중 다른 사람이 작성한 커밋이 있을 수 있다.
또, 커밋들을 되돌리기 전 다른 사람이 커밋들을 땡겨갔다면 다른 사람들의 로컬 저장소에는 내가 되돌린 커밋이 남아있다.
그래서 reset은 혼자만 사용하는 브랜치일 때 / 다른 사람들이 해당 브랜치를 받은 적이 없다고 확인된 경우 사용한다.
reset 주의사항을 고려한 변경하고 해당 되돌린 내용을 다른 사람들과 공유할 수 있는 기능이다.
특정 지점의 과거 커밋으로 이동, 변경 내역은 유지한다.
즉, 이력이 남기 때문에 많은 사람들과 작업할때 유용하다.
git revert <되돌릴 커밋>
git revert 2664ce8
되돌릴 커밋이 여러개라면 범위를 주어서 여러개를 선택할 수도 있다.
git revert 2664ce8..15413dc
revert과정에서 오류가 발생할 시
직접 conflict를 수정해야 한다.
그 후,
git revert --continue # 진행하거나
git revert --abort # 취소할 수 있다.
작업을 하다가 rebase 실수 또는 잘못된 명령어나 조작 실수 등 다양한 이유로 인해 작업이 날라 가는 경우가 있다.
git의 명령어 중에 reference logs 라는 의미를 가진 reflogs 라는 옵션을 사용하여 해결한다.
위 명령어가 실행되면 나오는 화면에서 저장소 tree에 일반적으로 보이지 않는 모든 commit들을 살펴볼 수 있다.
여기서 유실된 commit을 찾은 후 해당 commit의 commitID를 찾아서 상황에 맞게 다음 명령어들을 사용하면 된다.
해당 유실된 커밋을 HEAD로 하는 tree로 돌려놓으려면 아래처럼 리셋 명령어를 실행하면된다.
해당 유실된 커밋만 현재 브랜치로 가져오려면 아래처럼 체리픽을 이용한다.