본문 바로가기

STUDY/GIT

3. Git 기초2 - 커밋 히스토리, 되돌리기

커밋 히스토리 조회

 

> git clone https://github.com/schacon/simplegit-progit
> cd simplegit-prohit
> git log
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
Author: Scott Chacon <schacon@gmail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    changed the verison number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gmail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    first commit

 

새로운 레포지토리를 가져오고 해당 폴더에서 git log 명령어를 입력해보면 그동안의 commit 이력을 볼 수 있다. 이력에서 각 커밋의 SHA-1 체크섬, 저자 이름, 저자 이메일, 커밋한 날짜, 커밋 메시지를 볼 수 있다.

 

> git log --patch
...
각 커밋의 diff(변경내용) 정보
...
> git log --stat
...
각 커밋의 통계 정보
...

git log 명령어에 --patch, --stat 옵션을 추가하면 상세한 변경 내용이나 통계 정보를 볼 수 있다. git log에서 사용할 수 있는 주요 옵션은 아래와 같다.

 

-p 각 커밋에 적용된 패치를 보여준다.
--stat 각 커밋에서 수정된 파일의 통계정보를 보여준다.
--shortstat --stat 명령의 결과 중에서 수정한 파일, 추가된 라인, 삭제된 라인만 보여준다.
--name-only 커밋 정보중에서 수정된 파일의 목록만 보여준다.
--name-status 수정된 파일의 목록을 보여줄 뿐만 아니라 파일을 추가한 것인지, 수정한 것인지, 삭제한 것인지도 보여준다.
--abbrev-commit 40자 짜리 SHA-1 체크섬을 전부 보여주는 것이 아니라 처음 몇 자만 보여준다.
--relative-date 정확한 시간을 보여주는 것이 아니라 “2 weeks ago” 처럼 상대적인 형식으로 보여준다.
--graph 브랜치와 머지 히스토리 정보까지 아스키 그래프로 보여준다.
--pretty 지정한 형식으로 보여준다. 이 옵션에는 oneline, short, full, fuller, format이 있다. format은 원하는 형식으로 출력하고자 할 때 사용한다.
--oneline --pretty=oneline --abbrev-commit 두 옵션을 함께 사용한 것과 같다.

 

> git log -1
...
최근 1건의 커밋 내용
...

일반적으로 하나의 레포지토리에는 수많은 커밋이력이 있기때문에 적절한 조건을 걸고 조회해야 한다. git log에서 사용할 수 있는 조회 조건은 아래와 같다.

 

-(n) 최근 n 개의 커밋만 조회한다.
--since, --after 명시한 날짜 이후의 커밋만 검색한다.
--until, --before 명시한 날짜 이전의 커밋만 조회한다.
--author 입력한 저자의 커밋만 보여준다.
--committer 입력한 커미터의 커밋만 보여준다.
--grep 커밋 메시지 안의 텍스트를 검색한다.
-S 커밋 변경(추가/삭제) 내용 안의 텍스트를 검색한다

 


되돌리기

 

git를 사용하다보면 수정한 파일을 이전 버전으로 되돌리고 싶거나, 이미 커밋한 내용을 수정하고 싶은 경우가 생긴다. 이럴때 사용할수 있는 방법들을 알아보자.

 

> echo "newfile1" > newfile1
> echo "newfile2" > newfile2
> git add newfile1
> git commit -m "add newfiles"

newfile1, newfile2 두개의 파일을 만들고 커밋을 하려고 했다고 생각해보자. 하지만 newfile1만을 staged 상태로 올리고 커밋해버려서 newfile2가 커밋에 반영되지 않았다. 이때 사용할 수 있는게 --amend 옵션이다.

 

> git add newfile2
> git commit --amend
> git log

newfile2까지 staged 상태로 만들고 --amend 옵션을 사용하여 커밋하면, 이전 "add newfiles"에 해당 내용이 추가된다. 즉 기존 커밋을 수정한 것이다. --amend 옵션은 "앗차, 빠진 파일 넣었음”, “이전 커밋에서 오타 살짝 고침” 등의 커밋을 새로 만드는 대신 사용한다.

 

> echo "" > newfile1
> git add newfile1
> git status
현재 브랜치 master
커밋할 변경 사항:
  (스테이지에서 제외하려면 "git restore --staged <file>..."을 사용하시오)
	수정함:        newfile1

파일을 수정하고 staged 상태로 올렸지만 이를 다시 커밋에 반영되지 않도록 하고 싶을 수 있다. 이를 위해서는 해당 파일을 다시 modified 상태로 바꾸어야 한다.

 

> git restore --staged newfile1
> git status
현재 브랜치 master
커밋하도록 정하지 않은 변경 사항:
  (무엇을 커밋할지 바꾸려면 "git add <파일>..."을 사용하십시오)
  (작업 디렉토리의 변경을 무시하려면 "git restore <file>..."을 사용하시오)
	수정함:        newfile1

 

git restore --staged 명령어를 사용하면 staged 상태인 파일을 modified로 되돌릴 수 있다.

 

> git restore newfile1
> git status
> vim newfile1

git restore 명령어를 사용하면 이전 커밋으로부터 newfile1을 수정한 내용을 모두 되돌려서 unmodified 상태로 만들 수 있다. 실제 newfile1 파일을 확인해보면 수정한 내용이 되돌아간 것을 확인할 수 있다.

 

 

728x90