====== 되돌리기 ====== 작업의 취소는 소스를 관리하는 하나의 목적이라고 할 수 있다. 수정을 하다가 되돌기고 싶은때가 많이 있을 것이다. 여기에서 다양한 되돌리기를 알아보기로 한다. ===== Discard Local change (로컬 변화 취소하기) ===== 로컬에서 작업하고 있는 staging area나 working directory에서 작업하는 내용을 초기화 하는 방법에 대해서 알아보자. === unstaging a staged file === git restore --staged 파일명 git reset HEAD 파일명 # HEAD가 가리키는 시점의 버전으로 파일을 unstage하고 되돌린다. git restore 파일명 ===== reset으로 특정 commit으로 전환 ===== 로컬에만 커밋이 머물러 있거나, 원격 저장소에 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 ===== 원격 레포에 히스토리 기록을 남기면서 되돌리기 revert ===== 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를 사용하자!