git 같은 VCS(Version Control System, 버전 관리 도구)를 사용하는 이유가 바로 과거 작업 내역을 기록하고, 필요하면 불러오기 위해서다. checkout 명령을 사용해 이동한다.

아래 명령은 현재 위치(HEAD)에서 한 단계 과거로 가는 명령어다.

git checkout HEAD~1

숫자를 바꾸면 해당하는 숫자만큼 과거로 간다. 아래처럼 명령을 내리면 10단계 과거로 간다.

git checkout HEAD~10

HEAD 대신 커밋 hash를 사용할 수도 있다. 예컨대 아래와 같다.

git checkout eb919a7~1

다시 돌아오는 방법은? checkout 명령의 원리를 생각하면 간단하다. master 브랜치로 돌아오고 싶다면 아래처럼 명령한다.

git checkout master

master 브랜치가 아닌 다른 브랜치명을 적어도 상관없다. 해당 브랜치로 복귀하게 된다.

특정 커밋을 콕 찝어서 돌아가기

특정 커밋으로 여행하는 방법은 무엇일까?

아래와 같은 로그가 있다고 치자.

commit bd32ba7c2c1bf1e793c6c951856e35ec7f397daa
Author: 안형우 <[email protected]>
Date:   Tue May 7 08:04:36 2013 +0900

커밋3

commit 8553f2530e01cbd66d135d43e11d1d2f9366b5f8
Author: 안형우 <[email protected]>
Date:   Tue May 7 08:04:02 2013 +0900

커밋2

commit 5fa1c73e90b5b14a4cab49031afa0c9bdea1c587
Author: 안형우 <[email protected]>
Date:   Tue May 7 08:03:45 2013 +0900

커밋1

세 개의 커밋이다. 각각 commit 해시값(단순히 말하자면 위에서 알파벳과 숫자 조합인 문자열)이 있다. 이게 해당 커밋의 고유번호다. 그리고 이 고유번호의 앞자리 일부만 적어 주면 알아서 식별을 한다. 그래서, 커밋2로 돌아가고 싶다면?

git checkout 8553f2

이렇게 적어 주면 된다. 그리고 master 브랜치로 돌아오고 싶다면 언제든

git checkout master

이렇게 적어 주면 된다.

코드를 이전 버전으로 되돌려 새로 커밋하고 싶다면

그렇다면 master를 이전 커밋으로 만들고 싶다면 어떻게 해야 할까? 시나리오가 다양해서 단순히 답하기 힘들다.

다만 가장 간단한 방법은 당시 버전으로 코드를 교체하고 새로 커밋하는 방법일 것이다. 저장소를 수정하는 방법이 아니고 동료들도 귀찮지 않아 편하다. 아래는 현재 위치가 master라고 가정하고 master 브랜치를 10단계 전으로 되돌리는 예제다. git로 관리되는 프로젝트의 최상위 폴더에서 명령을 내려야 한다.

git diff master master~10 | patch -p1

이러면 코드가 수정돼 있는 것을 볼 수 있을 것이다. git diff나 patch 명령어에 대한 상세한 설명은 여기서 다루기는 너무 기니까 생략한다.