
이번 포스팅에서는 깃의 커밋 활용법에 대해 알아보자. 커밋에 대해 이해가 부족하다면 깃 기초 (init, add, commit) 포스팅을 보고 다시 오는 것을 권장한다.
여태까지 커밋한 기록과 목록들을 커밋 히스토리라고 하는다 커밋 히스토리를 통해 지금까지 발생한 디렉토리의 변화를 확인할 수 있다.
커밋 히스토리를 확인하기 위해서는 git log 커맨드를 입력하면 된다.

git log를 입력하면 난수로 구성된 커밋 아이디, 커밋 한 사람(Author), 날짜(Date),커밋 메시지 정보를 확인할 수 있다. 위에 있을수록 최신의 커밋이다.
(※ vim 창이기 때문에 q를 입력하면 현재 창에서 나갈 수 있다.)
하지만 만약 가독성이 너무 떨어진다 싶으면 커밋 히스토리가 각각 한 줄에 표시되게 하는 것이 가능하다.
git log --pretty=oneline # 커밋 ID 전체 표시
git log --oneline # 커밋 ID 앞 7자리 표시
위의 커맨드 중 git log --oneline를 입력하면

다음과 같이 커밋 아이디와 커밋 메시지에 대해 볼 수 있다.
만약 해당 커맨드가 너무 길어 기억하기 힘들고 입력하기 귀찮다고 한다면 깃에서의 alias 기능을 사용하면 된다. git config alias.[이름 지정] '[(git 제외)커맨드 지정]'커맨드를 입력하여 설정하면 git [이름 지정] 커맨드를 입력하면 [커맨드 지정] 해당 부분의 커맨드가 자동 실행된다.
예를 들어 git log --oneline 커맨드를 git history라는 커맨드로 실행하고 싶으면 다음과 같은 커맨드를 입력하면 된다.
git config alias.history 'log --oneline'
두 커밋 간의 차이를 확인하고 싶을 때 이를 확인하는 방법 또한 존재한다.
git show [커밋 ID] 커맨드를 입력하면

다음과 같은 화면이 나타난다. 빨간색으로 되어 있는 -부분은 이전 커밋의 모습을, 초록색으로 되어 있는 + 부분은 현재 커밋의 모습을 나타낸다.
즉 git show 커맨드는 해당 커밋과 그 바로 직전 커밋의 차이점을 나타내는 커맨드이다.
하지만 연이은 두 개의 커밋말고 자유롭게 두 커밋을 비교하고 싶다면 git diff [더 오래된 커밋 ID][더 최근의 커밋 ID] 형식으로 입력하면

다음과 같이 사용자가 지정한 두 커밋 사이의 변화를 비교할 수 있다. 마찬가지로 빨간색의 -가 이전 커밋의 모습이고 초록색의 +가 이후 커밋의 모습이다.
깃에서의 HEAD는 현재 브랜치를 가리키고 현재 브랜치는 (사용자가 바꾸지 않는 이상) 일반적으로 최신 커밋을 가리키기 때문에 HEAD는 결국 일반적으로 가장 최근에 한 커밋 을 간접적으로 가리킨다. 워킹 디렉토리 안의 내용물은 현재 헤드가 가리키고 있는 커밋의 모습에 따라 결정된다.
이 말은 즉 헤드가 다른 커밋으로 바뀐다면 워킹 디렉토리 안의 내용물, 나와 팀원들이 작업한 내용이 전부 바뀐 커밋(새로운 HEAD)으로 변환하게 될 수도 있다는 뜻이다.
HEAD^ # 현재 헤드의 바로 직전의 커밋
HEAD~n # 현재 헤드의 n단계 이전의 커밋
앞서 말했듯이 기본적으로 HEAD는 최신의 커밋을 가리키고 있다.
하지만 git reset 커맨드를 통해 HEAD가 과거의 커밋을 가리키게 하여 워킹 디렉토리, 스테이징 에어리어, 레포지토리를 과거 커밋의 모습으로 되돌아가게 할 수 있다.
하지만 이전의 포스팅에서 말했듯이 아무런 옵션도 주지 않고 단순히 git reset 커맨드를 입력하면 git add를 통해 스테이징 에어리어에 올린 파일들이 스테이징 에어리어에서 제거될 뿐이다. HEAD를 바꾸고 싶다면 git reset에 필수적으로 옵션을 주어야 한다. git reset의 옵션에는 다음과 같은 3가지가 존재한다.
git reset --hard [헤드로 하고 싶은 커밋 ID or 헤드 표기법]
git reset --mixed [헤드로 하고 싶은 커밋 ID or 헤드 표기법]
git reset --soft [헤드로 하고 싶은 커밋 ID or 헤드 표기법]

세 옵션의 차이는 깃에서 존재하는 3가지 내부 영역인 워킹 디렉토리, 스테이징 에어리어, 레포지토리에 대한 적용 범위의 차이이다.
우선 --hard 옵션은 3가지 내부 영역 전부 HEAD로 설정한 이전 커밋의 모습으로 바뀐다. 즉 내가 작업하고 있는 현재 파일들의 내용도 전부 해당 커밋 당시로 회귀해버린다.
그 다음 --mixed 옵션은 워킹 디렉토리(현재 내가 작업하고 있는 폴더)의 모습은 변화시키지 않지만 스테이징 에어리어와 레포지토리만 변화시킨다.
마지막으로 --soft 옵션은 레포지토리만 HEAD가 된 커밋 내용으로 변화시킨다.
만약 git reset -- 한 것을 취소하여 3가지 내부 영역을 전부 원상복귀시키고 싶다면
git reflog # reference log의 줄임말
커맨드를 입력하여

다음과 같이 HEAD 이동을 포함한 최근의 모든 로그를 확인하고
돌아가고 싶은 커밋 아이디를 찾은 후 git reset --hard [커밋 아이디]를 입력하면 된다.
또한 리모트 레포지토리에 이전의 최신 커밋에 대한 push가 되어있다면 git pull을 해두면 리셋 하기 전의 상태로 돌아가는 것도 하나의 방법이 있다.
만약 스테이징 에어리어만 git reset 영향을 취소하고 싶다면 스테이징 에어리어에 있던 것들은 커밋을 해도 스테이징 에어리어에 유지되기 때문에 git add하면 스테이징 에어리어는 git reset 이전의 상태로 돌아갈 수 있을 것이다.
커밋을 여러 번 반복하다 보면 다른 커밋들에 비해 의미가 있거나 더 중요한 커밋이 생길 수 있다. 이런 경우 이러한 중요 커밋들을 구별하고 손쉽게 접근하고 싶다면 커밋에 태크를 붙이는 것도 하나의 방법이다.
git tag [태크 이름][커밋 아이디]

이러한 커밋 태크는 나중에 프로젝트의 이력을 살펴볼 때 도움이 될 수 있을 것이다.
*해당 포스팅은 코드잇의 강의를 참고하였습니다.