작업의 취소는 소스를 관리하는 하나의 목적이라고 할 수 있다. 수정을 하다가 되돌기고 싶은때가 많이 있을 것이다. 여기에서 다양한 되돌리기를 알아보기로 한다.
로컬에서 작업하고 있는 staging area나 working directory에서 작업하는 내용을 초기화 하는 방법에 대해서 알아보자.
git restore --staged 파일명 git reset HEAD 파일명 # HEAD가 가리키는 시점의 버전으로 파일을 unstage하고 되돌린다.
git restore 파일명
로컬에만 커밋이 머물러 있거나, 원격 저장소에 push를 했어도 나만 사용하는 게 확실한 브랜치라면 reset을 써도 상관없다. 하지만 다른 사람들과 공유하고 있는 브랜치라면 서로의 커밋 history가 달라지기 때문에 서로를 위해서도 하지 않는 게 좋다.
HEAD로 되돌리기 강제
git reset --hard HEAD ## --hard 되돌린 커밋 이후의 모든 커밋 history를 삭제한다. git reset --soft HEAD~1 ## --soft 커밋 history는 삭제되지만 변경 사항은 stage에 올라간 상태로 남는다.
HEAD~1의 상태로 강제로 repo에 push하면 자료가 꼬인다. ( 사용하지 말것 )
git push -f origin
git revert 명령어를 사용하면 revert 시킨 히스토리마저 원격 레포에 기록이 되기 때문에 함께 쓰는 레포라면 revert 명령어를 쓰는 것이 더 좋다. 똑같이 git log로 commit의 hash를 먼저 확인한 후 (git log를 입력했을 때 commit 옆에 뜨는 긴 문자열이 hash이다),
revert는 커밋을 삭제하는 게 아니라 이전의 변경 사항을 불러와서 새로운 커밋을 추가한다. reset이 타임 머신을 타고 과거로 돌아가는 거라면, revert는 내 시간은 그대로고 과거의 사람을 현재로 불러오는 느낌? reset처럼 history가 꼬일 일이 잘 없기 때문에 더 안전한 방법이라고 할 수 있다.
git revert HEAD # 바로 이전 커밋으로 되돌린다. git revert 커밋아이디 # 특정 커밋아이디로 되돌린다. git revert -m 1 HEAD # 마지막 커밋이 merge라면, 마지막 커밋으로 되돌린다. git revert --no-commit 커밋아이디 # 특정 커밋아이디를 stage에는 올라가지만 commit하지는 않은 상태로 되돌린다.
Revert는 커밋 history가 삭제되지 않고 어떤 커밋이 Revert 됐는지도 기록에 남기 때문에 history 관리에도 유용하다. 결론은 깃 커밋을 롤백해야 된다면, revert를 사용하자!