git checkout HEAD <filename>
or
git checout -- <filename>
HEAD는 브랜치를 가리키는 포인터라고 하였습니다.
detached HEAD 상태라면 다른 커밋을 가리키기도 합니다.
여기선 일단 브랜치를 가리킨다고 생각하고 진행합시다.
git checkout HEAD
현재 발생한 모든 변경사항을 취소합니다.
HEAD가 마지막 커밋을 가리키니까 마지막 커밋 이후의 모든 변경사항을 취소할 수 있습니다.
filename을 추가해서 HEAD를 기준으로 특정 파일에 생긴 변경사항을 취소할 수도 있습니다.
여러 개의 filename을 나열할 수도 있습니다.
git restore <filename>
마지막 커밋을 기준으로 발생한 변경사항들을 취소할 수 있습니다. 즉 HEAD 기준으로 취소하는 것입니다.
명령어를 실행하고 난 후 파일 내용은 HEAD 커밋의 내용이 됩니다.
git restore --source HEAD~1 <filename>
or
git restore --source <commit-hash> <filename>
뭔가 더 복잡해졌지만 간단합니다.
HEAD 이전 커밋을 기준으로 특정 파일에 발생한 변경사항을 모두 취소해달라는 명령어입니다.
--source
의 기본값은 HEAD입니다.
위 명령어들을 실행한다고 우리는 이전 커밋으로 HEAD의 위치를 옮기지는 않습니다.
또한 commit 되지 않은 모든 변경사항들은 source를 기준으로 모두 폐기됩니다.
git restore --staged <filename>
작업한 변경사항을 add
하여 staging area에 올려놓았다고 생각해봅시다.
이 변경사항을 다시 working tree로 내리려면 위 명령어를 실행하면 됩니다.
git checkout
명령어는 너무 많은 일을 합니다.
이전 커밋으로 HEAD의 위치를 이동시키거나, 브랜치를 생성하거나, 브랜치를 이동하거나, 변경사항을 취소하거나... 등등
따라서 git chekcout
이 하는 일이 너무 많아서 git에서 따로 명령어들을 나누었습니다
git restore
, git switch
등이 그런 것이죠.
따라서 checkout
명령어 보다 새로 만들어진 명령어를 사용하는 게 더 좋아보이기도 하고
적어도 저는 그걸 선호합니다.
🙏🙏🙏
git 시리즈에 작성한 포스팅은
https://www.udemy.com/course/best-git-github/
유데미 강좌
https://www.yes24.com/Product/Goods/110795446
모두의 깃 & 깃허브
위 내용을 참고하였으며, 제 실습화면을 캡쳐한 사진 외의
대부분의 사진들은 인터넷 강좌에서 제공하는 자료를 캡쳐하였습니다.
깃 시리즈 포스팅의 내용 및 사진을 절대로 상업적 목적으로 무단 복사하지 말아주세요.