Git 변경 취소 | git checkout
git checkout 명령어
git checkout 파일의 체크 아웃, 커밋의 체크 아웃, 브렌치 체크 아웃 3가지 기능을 가진 명령이다. 이 장에서는 처음 두 기능에 대해 설명한다.
커밋을 체크 아웃하면 작업 디렉토리가 그 커밋과 완전히 일치한 상태가 된다. 이 명령은 프로젝트의 현재 상태를 전혀 변경하지 않고 과거의 상태를 확인하는 경우에 사용한다. 파일의 체크 아웃을 하면 작업 디렉토리의 다른 부분에 전혀 영향을 주지 않고 파일의 이전 버전을 확인 할 수 있다.
사용법
git checkout master
master 브랜치로 돌아 가기 명령입니다. 브랜치에 대해서는 다음 장에서 자세히 설명하고 있다. 여기에서는 우선 master 브랜치는 프로젝트의 “현재"상태로 돌아가기 위한 수단이라고만 생각한다.
git checkout <commit> <file>
파일의 이전 버전으로 체크 아웃하는 명령이다. 이 명령을 실행하면 작업 디렉토리에 존재하는 <file>이 입력한 <commit>의 파일 복사본을 스테이지(stage) 영역에 추가한다.
git checkout <commit>
작업 디렉토리의 모든 파일을 지정한 커밋과 동일한 상태로 업데이트하는 명령이다. 인수 <commit> 는 커밋 해시 또는 태그를 사용할 수 있다. 이 명령을 실행하면 “detached HEAD"상태가 된다.
보충 설명
모든 버전 관리 시스템의 배경이되고있는 개념은 프로젝트의 상태를 ‘안전하게’저장하고 코드베이스에 회복 불가능한 손상을 일으킬 가능성을 없애는 것이다. 일단 저장소가 작성되면 git checkout 명령은 저장된 스냅 샷을 로컬 머신에 “로드"하는 간편한 방법이다.
과거의 커밋 체크 아웃은 읽기 전용 작업이다. 과거 버전보기하여 저장소가 영향을 받지는 없다. 프로젝트의 “현재"상태는 일체 변경이 수행하고, master 브랜치에 남아 있다 (자세한 내용은 Git 브랜치 참조). 일반적인 개발 프로젝트가 진행되는 동안 HEAD 보통 master 브랜치 또는 기타 로컬 브랜치를 의미하지만, 과거의 커밋을 체크 아웃하면 HEAD 는 브랜치가 아니라 직접 커밋을 가리 킨다. 이 상태를 “detached HEAD “상태라고 그림으로 설명하면 다음과 같다 :
Git 튜토리얼 : 과거의 커밋 체크 아웃
한편, 과거 파일(커밋을 하지 않은 파일)의 체크 아웃은 저장소의 현재 상태에 영향을 미친다. 지난 버전의 파일(이미 커밋을 하지 않은 파일)은 다른 모든 파일과 함께 새로운 스냅 샷에 재 커밋 할 수 있습니다. 그래서 git checkout 명령은 실질적으로 각각 파일의 변경을 취소하고 되돌리는 기능을 한다.
Git 튜토리얼 : 파일의 이전 버전 체크 아웃
사용 예
이전 버전의 열람
이 예에서는 상식 벗어난 개발을 실험적으로 시작했지만, 그것을 저장할 것인가 여부에 대한 판단을 할 수없는 것으로 가정한다. 그리고 이 판단의 참고로 하기 위해 실험적인 개발을 시작하기 전에 프로젝트의 상태를 확인한다. 먼저 확인하는 버전의 ID를 알아야 한다.
git log --oneline
다음과 같은 프로젝트 내역이 표시된다 :
b7119f2 Continue doing crazy things
872fa7e Try something crazy
a1e8fb5 Make some important changes to hello.py
435b61d Create hello.py
9773e52 Initial import
여기에서 git checkout 명령을 사용하여 커밋 메시지가 “Make some important changes to hello.py” 인 것을 커밋의 내용을 확인한다 :
git checkout a1e8fb5
이 명령을 실행하면 작업 디렉토리는 커밋 a1e8fb5 와 똑같은 상태이다. 이 상태에서 프로젝트의 현재 상태에 영향을 주지 않고 파일의 열람, 프로젝트의 컴파일, 테스트 실행, 심지어 파일의 편집도 가능하다. 이 상태에서 행해진 작업은 저장소에 일체 저장되지 않는다 . 개발을 계속하려면 프로젝트의 “현재"상태로 반환해야한다 :
git checkout master
여기에서는 디폴트 인 master 브랜치에서 개발 작업을 하고있는 것으로 추정하고 있다 (master 브랜치 내용은 Git 브랜치 참조).
master 브랜치로 돌아온 후 git revert 명령 또는 git reset 명령을 사용하여 필요하다고 판단한 변경을 취소 할 수 있다.
파일 체크 아웃
확인 대상이 특정 파일 인 경우에도 git checkout 명령을 사용하여 파일의 이전 버전을 가져올 수 있다. 예를 들어, 과거의 커밋에 포함되어있는 파일 hello.py
의 내용을 확인하려면 다음 명령을 사용한다 :
git checkout a1e8fb5 hello.py
또한 앞에서 설명한 바와 같이, 커밋 체크 아웃과는 달리,이 명령은 프로젝트의 현재 상태에 영향을 준다 . 과거의 수정 파일은 “Change to be committed"로 표시되고이 파일의 변경 사항을 취소하고 이전 버전으로 되돌릴 수 있다. 과거 버전을 저장할 필요가 없는 경우 다음 명령을 사용하여 최신 버전을 확인한다 :
git checkout HEAD hello.py