Learn

되돌리기

Git

checkout, reset, revert, reflog. 실수했을 때 구조 명령어들.

잘못된 코드를 commit했거나, 잘못된 reset --hard로 파일 트리가 망가졌나요? 이 레슨에서는 덜 파괴적인 것부터 더 파괴적인 것 순서로 구조 명령어들을 보여줄게요.

commit되지 않은 변경사항 버리기

파일을 수정했지만 아직 stage하지 않았고, commit된 버전으로 돌아가고 싶다면 :

shell
git restore README.md

이미 stage한 변경사항을 unstage하고 싶다면 (내용은 유지하면서) :

shell
git restore --staged README.md

git revert로 commit 취소하기 (안전)

git revert는 대상 commit의 효과를 반전시키는 새 commit을 만들어요. 히스토리가 보존되고, 기존 commit은 삭제되지 않아요. 이미 push한 경우에도 안전한 방법이에요.

shell
git revert HEAD

HEAD는 마지막 commit을 가리켜요. 해시를 직접 쓸 수도 있어요 : git revert a3f5b6c.

git reset으로 히스토리 이동하기

git reset은 브랜치 포인터를 이전 commit으로 이동시켜요. 덜 파괴적인 것부터 더 파괴적인 순으로 세 가지 모드가 있어요 :

--soft 모드 : commit이 취소되고 파일은 stage 상태로 남아요. commit을 합칠 때 유용해요.

shell
git reset --soft HEAD~1

--mixed 모드 (기본값) : commit이 취소되고 파일이 unstage되지만 변경사항은 남아요.

shell
git reset HEAD~1

--hard 모드 : commit이 취소되고 변경사항이 삭제돼요. reflog 없이는 복구 불가능해요.

shell
git reset --hard HEAD~1

안전망 : git reflog

git reflog는 마지막 수단이에요. reset --hard 이후에도 HEAD가 지난 몇 주간 가리켰던 모든 것을 나열해요. Git의 비밀 기억이에요.

shell
git reflog

HEAD@{2} 형식의 식별자가 달린 항목 목록이 보여요. 특정 상태로 돌아가려면 :

shell
git reset --hard HEAD@

오래된 commit에서 파일 복구하기

나머지는 건드리지 않고 특정 commit의 파일 하나만 복구하고 싶다면 :

shell
git restore --source a3f5b6c README.md

파일이 commit a3f5b6c 상태로 돌아오고, stage하거나 버릴 수 있어요.

git-scm.com - git reset git-scm.com - git revert git-scm.com - git reflog

관련

참고 · git브랜치로 작업하기

다음 단계를 열려면 단계를 체크하세요

코스로 돌아가기