Search
↩️

커밋 시간여행 + 되돌리기

checkout : 이전 커밋으로 되돌아가기

1. checkout 커밋해시 = HEAD 옮기기

HEAD 를 옮겨서 다른 커밋을 바라보게함
현재 워킹 디렉토리의 변경사항이 커밋되지 않은 상태에서는 불가.
git checkout 커밋해시
Bash
복사
git checkout HEAD~1 #이전 커밋을 가리킴
Bash
복사
git checkout HEAD~N #N번 전의 커밋을 가리킴
Bash
복사
HEAD 는 보통 커밋이 아니라 Branch 를 가리킨다
이렇게 되돌아가면 HEAD 가 detached 된다.
Detached Head 란?
Branch 를 가리키고 있지 않은 상황
cat .git/HEAD #HEAD 가 가리키고 있는 곳을 출력
Bash
복사
해보면 알 수 있다.

Detached Head 해결하는 법

Detached HEAD 란?
= HEAD 가 브랜치가 아닌 특정 커밋을 가리키고 있는 상황
→ 브랜치를 가리키도록 바꿔주면 된다.
1.
브랜치 복귀
2.
브랜치 생성

1-1. 원래있던 곳으로 되돌아가기

git switch - #지난 Branch 의 위치로 돌아가기
Bash
복사
git switch 내가원래있던브랜치이름
Bash
복사

1-2. 되돌아간 곳에서 Branch 새로 파기

되돌아간 커밋에서 브랜치를 새로 파면 해결할 수 있다.
git switch -c 브랜치이름
Bash
복사
GUI 에서는 앞선 커밋들을 다시 확인할 수 있다.

checkout : 특정 파일 변경사항 되돌리기

1. checkout 커밋해시 filename : 특정 파일을 이전 커밋의 상태로 되돌리기

git checkout HEAD filename
Bash
복사
git checkout -- filename
Bash
복사

2. restore filename : 특정 파일의 이전 커밋의 상태 불러오기 (HEAD 이동 X)

이때, HEAD 가 이동하는 게 아니다 (즉, 어떠한 시간여행도 하지 않음 = 커밋 포인트 그대로 )
Detached HEAD 발생 안함.
git restore filename
Bash
복사
주의 : 커밋되지 않은 변경사항은 되돌릴 수 없다
단, 커밋 포인트는 어디든지 불러올 수 있다.
git restore --source HEAD~2 filename #HEAD가 가리키는 커밋의 2번쨰 전 커밋의 상태를 불러옴
Bash
복사

Reset : 커밋 삭제 + 변경사항 유지

특정 커밋으로 되돌아가고, 해당 커밋 이후의 커밋은 삭제함.
하지만, 워킹 디렉토리에는 남아 있음!!!
즉, 커밋은 삭제 + 변경사항은 유지
git reset 커밋해시
Swift
복사
잘못된 브랜치에 커밋했을 경우 용이하다. 일단 해당 브랜치에 커밋된 내용을 reset 하고 워킹디렉토리에 존재하는 변경사항들을 다른 branch 에 커밋하자
git switch -c 브랜치이름
Bash
복사

커밋 삭제 : Reset —hard

변경사항도 함께 삭제하면서 커밋 삭제
git reset --hard 커밋해시
Bash
복사

Revert : 이전 커밋을 가져와서 새로 커밋

reset 과는 달리 커밋들을 삭제하지 않고,
이전의 커밋을 다시 불러와서 새로이 커밋.
즉 삭제될 사항들을 커밋하고 이전의 커밋으로 되돌리기
git revert 커밋해시
Bash
복사
협업 상황에서는 revert 를 사용할 것. (reset)