Git 커밋(commit) 이력 되돌리기
이미 커밋(commit)된 작업 이력을 이전으로 되돌려야 하는 상황은 항상 발생합니다. 작업중에 실수로 올라간 커밋일 수 도 있고 버그나 오류가 포함된 커밋 일수도 있습니다. Git 에서는 이러한 상황에서 reset 이나 revert 명령을 사용하여 과거로 되돌아 갈 수 있습니다.
Git reset
Git reset 명령어는 현재 작업중인 브랜치의 HEAD 포인터를 과거의 특정 시점을 가르키도록 되돌립니다. 이 때 변경된 파일들을 스테이지 영역에 보존 시킬 수 도 있고 아예 깨끗하게 지워버릴 수 도 있습니다.
git reset <되돌릴 커밋>
reset --soft
소프트 리셋은 과거의 커밋으로 인해 발생한 변경 사항을 제거하지 않고 과거의 커밋으로 HEAD 포인터를 이동시킵니다. 커밋 이력은 삭제하더라도 작업했던 변경내역은 유지하고자 할 때 유용합니다.
예를 들어 아래 c657d 커밋과 3a52b 커밋은 각각 index.js 파일과 styles.css 파일을 신규로 추가한 작업 입니다. 이 두가지 수정사항을 커밋 이전으로 되돌리고자 합니다. 이력은 되돌리더라도 추가된 두 개의 파일은 삭제되지 않기를 원한다면 git reset --soft 명령을 사용할 수 있습니다.
git status 명령으로 확인해 보면 이전 커밋으로 발생한 변경사항에 여전히 접근 가능함을 확인할 수 있습니다. 이 파일들에 추가 수정사항을 반영하고 새로운 커밋으로 Git 리파지토리에 등록이 가능한 상태입니다.
reset --hard
하드 리셋은 과거 이력으로 발생한 모든 수정사항을 깨끗하게 날려버립니다. 이전 커밋의 변경사항을 유지할 필요가 없다면 하드 리셋을 사용하여 온전하게 이전의 커밋 상태로 돌아갈 수 있습니다.
현재 워킹 디렉토리와 스테이지 영역을 완벽하게 과거의 커밋 상태로 돌아가고자 한다면 reset --hard 를 사용합니다.
Git revert
커밋 이력을 과거로 되돌리는 또 다른 명령어는 git revert 입니다. git revert 는 이전 커밋 이력을 삭제하는 대신에 과거의 커밋으로 발생한 변경사항을 되돌리는 새로운 커밋을 생성합니다.
git revert <원복할 커밋>
ec5be 커밋으로 index.js 파일을 추가했습니다. 이 파일의 추가가 불필요한 작업이었다는 것을 깨달았고 이전 상태로 되돌리고자 한다면 git revert 명령을 사용하여 이전상태로 되돌릴 수 있습니다.
git revert 명령으로 ec5be 커밋의 변경사항을 되돌리는 새로운 커밋이 생성되었습니다. git revert 명령은 브랜치의 커밋 히스토리를 수정하지 않으면서 특정 커밋의 변경사항을 되돌리는 작업에 유용합니다.
Reset vs Revert
reset 명령은 커밋 히스토리를 수정하므로 작업 이력을 단순하게 만들어 주는 장점이 있습니다. 그러나 이미 원격 저장소에 Push 된 커밋 이력은 reset 으로 되돌리면 안됩니다. 원격 저장소와 싱크가 맞지 않아 수정된 커밋을 push 할 수 없기 때문입니다.
반면에 revert 명령은 커밋 히스토리를 수정하지 않고 새로운 커밋을 생성하기 때문에 원격 리파지토리에 push 된 커밋도 수정이 가능합니다. 과거의 이력도 온전히 보관된다는 점에서 공동작업 시 유용하다고 볼 수 있을 것 같습니다.
🌳🚀 CS Visualized: Useful Git Commands by Lydia Hallie
이 글은 dev.to 사이트에 올라온 Lydia Hallie 의 CS Visualized : Useful Git Commands 포스트를 참고하여 작성했습니다. 아래 배너 이미지 클릭 시 해당 포스트로 이동합니다.
본문에서 사용한 Git 명령어 에니메이션은 위 포스트에 감명을 받아서 Vue.js 를 이용하여 작업한 결과물입니다. github 리파지토리에 모든 소스는 공개되어 있습니다.
깃헙 리파지토리 : https://github.com/craftyworks/git-your-mind