만약 우리가 프로그램을 만들다가 에러가 발생해서 이전 버전의 파일을 불러오려면, 우리가 커밋한 파일들을 다시금 볼 수 있어야 한다.
즉, 우리가 커밋을 한다고 끝이아니라, 그것들을 관리하고 활용하는 방법을 알아야 한다!!
오늘은 이에 대해서 알아보려고 한다.
커밋 히스토리
지금까지 한 커밋들을 커밋 히스토리 라고한다.
git log
git log란 명령어를 터미널에 입력하면
new commit
.
.
.
old commit
순으로 표현된다!
커밋 내용 구조는
commit commit-id
commit-user
commit-date
commit-message
이런 구조다.
그런데..! 이렇게 여러 줄로 커밋들이 표현된다면, 한 눈에 알아보기 조금 힘들 수도 있다.
따라서 깃은 히스토리를 깔끔하게 보는 옵션을 지원한다.
git log --pretty=oneline
--pretty 옵션을 주고, 그 옵션에 online을 할당해주면 커밋 하나당 한 줄에 표현된다.
git show commit-id
git log 명령어를 통해 커밋 아이디를 확인한 후 show 커맨드를 이용해 어떤 변화가 일어났는지 확인 할 수 있다.
commit-id는 hash형태로 표현되어있어서 간단히 앞에 4자리만 입력해도 알아서 찾아낸다.
-m 옵션 없이 커밋 메시지 남기기
-m 옵션을 이용해서 터미널에서 커밋 메시지를 남기려면, 복잡한 메시지를 남길 때 불편하다.
따라서 복잡하고 긴 커밋메시지를 남길때 이와 같은 방법을 사용한다.
- git commit
- 텍스트 에디터 창이 뜸
- i 입력
- commit message 입력
- esc 클릭
- :wq 로 탈출
(VIM editor 기준)
이렇게 해주면 커밋 메시지와 함께 커밋된다.
최신 커밋 수정하기
커밋을 다시 올리는것이 아닌, 최신 커밋만 수정할 수 있다.
- git log --pretty=online
- (파일 수정)
- git add .
- git commit --amend
- 텍스트 에디터로 이동
- 새로운 커밋 메시지 남기기
이렇게 하면 기존의 커밋이 새로운 커밋으로 바뀐다. 즉 커밋 아이디도 바뀌게 되어 새로운 커밋이 기존의 커밋을 대체하게 된다.
커밋이 가지고 있는 정보
커밋은 GIT에서 가장 핵심적인 개념이다.
커밋은 우리가 앞서 봤듯이~ staging area의 현 상태를 그대로 하나의 snapshot으로 남기는 작업 혹은 결과물인데,
이 커밋에 크게 3가지 개념이 존재한다.
- 커밋을 한 사용자 아이디
- 커밋한 날짜
- 커밋 메시지
이러한 내용들은 우리가 커밋을 관리할 때, 그리고 변경 사항을 확인할 때 매우 중요하다.
하지만!!! 우리가 반드시 수동으로 설정해줘야 하는 것이 있다.
바로 커밋 메시지!
커밋 유저 아이디와 날짜는 깃에서 자동으로 설정해주지만... 커밋메시지를 깃이 만들어줄 순 없지 않은가?
또, 코드스타일처럼 커밋 메시지도 다른사람들이 알아보기 쉽게 어느정도 틀을 맞춰줘야 하지 않을까?
그에 따른 기본적인 가이드라인이 있다해서 가져와 보았다.
커밋 메시지 작성 가이드라인
1. 커밋 메시지의 제목과 상세설명 사이에는 한 줄을 비워라
2. 커밋 메시지 제목 뒤에 . 을 붙이지 마라
3. 커밋 메시지의 제목의 첫 번째 알파벳은 대문자로 작성하라
4. 커밋 메시지의 제목은 명령문으로 작성하라
5. 커밋 메시지의 상세내용에 왜 했고 뭐가 문제였고 어떻게 해결했는지를 적어라
6. 최대한 커밋 메시지는 친절하게 작성하라
커밋 가이드 라인
1. 하나의 커밋에는 최대한 적은 양의 수정사항을 해결한 내용만 남겨라
2. 에러가 발생하지 않을 코드만 커밋해서 올려라
커맨드에 별명 붙이기
앞서서 --pretty 옵션을 써서 log 파일을 볼 때, 커맨드 라인이 너무 길다 느껴지지 않았는가?
이에 이 명령어의 길이를 최대한 짧게 줄일 수 있도록 깃에서 지원하는 기능이 있다.
이때 붙이는 명령을 alias라고 하고, 별명을 붙이는 행위를 aliasing이라고 한다.
예를들어,
git log --pretty=oneline을 git history라는 별명으로 바꾸고 싶다면
git config alias.history 'log --pretty=oneline'
config 커맨드를 이용하면, 정보값을 변경하는 것이 가능하다.
git history라는 명령어가 내장명령어가 아닌 내가 직접 선언한 명령어이란 점을 잊지 말 것!
두 커밋간 차이보기
우리가 git log를 이용해서 커밋 히스토리를 체크했다.
어..? 그런데! 3번째 커밋과 6번째 커밋이 비슷한데 따로 올라와있다. 뭐지?
이럴 때 우리는 두 커밋의 차이를 알기 위해서 git diff 명령어를 사용한다!
git diff commit-id(older one) commit-id(new one)
결과를 보면 show와 비슷한 출력결과를 보여준다.
git show는 하나의 커밋이 변화한 모습을,
git diff는 두개의 커밋의 차이를 보여준다는 다른 점이 있다.
커밋 포인터
우리가 commit history를 쓰면서 계속 Head -> master란 내용을 보았을거다.
이는 우리가 커밋한 커밋들이 포인터를 이용해 관리되기 때문이다..!
좀 더 활용적인 측면에서 말하자면,
working directory는 head가 가르키는 커밋에 따라 구성될 수 있다!
Staging Area
우리는 git add를 이용해 working directory의 내용을 staging area에 올리고, 커밋을 한다.
그러면, 커밋으로 repository에 커밋을 올리면... staging area의 내용은 삭제되는 건가?
노노! 그대로 살아있다!
git add를 할 때마다 staging area에서는 새로운 파일이 추가되거나 기존의 파일이 대체될 뿐 삭제되지 않는다.
git reset [옵션] [커밋 아이디]
git reset 명령어는 head가 이전의 커밋을 가르키게 하고 싶을때 사용한다.
그런데! 위에서 working directory는 head가 가르키는 커밋에 따라 구성될 수 있다고 했었다.
~할 수도 있다.. 란 것은 아니게 할 수도 있다는 뜻인데!
이를 조절하기 위한 옵션을 깃에서는 3가지 지원한다.
- --soft : head가 과거의 특정 커밋을 가르키도록 함
- --mixed : staging area를 과거의 특정 커밋의 내용과 같게 만든다.
- --hard : working directory를 과거의 특정 커밋의 내용과 같게 만든다.
근데 이렇게 reset을 하다보니 내 로컬 레포지토리가 이상해졌다.. 그러면 어떻게하냐!
리모트 레포지토리가 백업용 레포지토리이니 이걸 가져오면 된다!
커밋 아이디 aliasing
매번 커밋 아이디를 찾아서 쓰기 불편하다.
이전에 커밋들은 포인터 개념을 이용해서 커밋들을 관리한다고 했는데,
Head를 이용하면 커밋 아이디를 대체해서 선택할 수 있다.
git reset --hard HEAD^ : Head가 가르키고 있는 바로 이전 커밋을 나타냄
git reset --hard HEAD~x : Head가 가르키고 있는 x번 이전의 커밋을 나타냄
ex) head가 5번째 커밋을 가르키고 있었다면,,, HEAD~2 는 3번째 커밋을 가르키게 된다
커밋 아이디 Taging
보통 커밋을 할 때 커밋메시지를 남겨놓는다. 하지만 다른 커밋보다 매우 중요한 커밋이라면..?
예를들어 버전 업데이트를 한 커밋이라던가..
그럴 때 다른 커밋들과 구분해주기 위해 Tag란 기능을 이용한다.
git tag [태그이름] [커밋아이디]
그리고
git tag
로 조회가 가능하다.
그 후 태그와 연결된 커밋이 보고싶다면,
git show [태그 이름]
을 써주면된다.
**tag를 삭제하고 싶을 땐,
git tag -d [태그 이름]
를 해주면 된다.
커맨드 정리
git log : 커밋 히스토리를 출력
git log --pretty=oneline : --pretty 옵션을 사용하면 커밋 히스토리를 다양한 방식으로 출력할 수 있다.
--pretty 옵션에 oneline이라는 값을 주면 커밋 하나당 한 줄씩 출력해준다.
git show [커밋 아이디] : 특정 커밋에서 어떤 변경사항이 있었는지 확인
git commit --amend : 최신 커밋을 다시 수정해서 새로운 커밋으로 만듦
git config alias.[별명] [커맨드] : 커맨드에 별명을 붙여서 이후로 별명으로 해당 커맨드를 실행할 수 있도록 설정
git diff [커밋 A의 아이디] [커밋 B의 아이디] : 두 커밋 간의 차이 비교
git reset [옵션] [커밋 아이디] : 옵션에 따라 하는 작업이 달라짐(옵션을 생략하면 --mixed 옵션이 적용됨)
(1) HEAD가 특정 커밋을 가리키도록 이동시킴(--soft는 여기까지 수행)
(2) staging area도 특정 커밋처럼 리셋(--mixed는 여기까지 수행)
(3) working directory도 특정 커밋처럼 리셋(--hard는 여기까지 수행)
그리고 이때 커밋 아이디 대신 HEAD의 위치를 기준으로 한 표기법(예 : HEAD^, HEAD~3)을 사용해도 됨
git tag [태그 이름] [커밋 아이디] : 특정 커밋에 태그를 붙임
양이 되게 많아서 정리하기 힘들었다.. 그래도 시간 짬짬히 3일동안 열심히 모아서 정리했으니 끝나고 보니 너무나 뿌듯하다!
2021-09-25
'DevOps > Git' 카테고리의 다른 글
4. 커맨드 모음 (0) | 2021.10.01 |
---|---|
2. 브랜치 다루기 (0) | 2021.09.26 |
GIT 오픈소스 (0) | 2021.09.11 |
0. GIT & GIT_HUB 시작하기 (0) | 2021.09.11 |
마크다운 사용법 (4) | 2021.09.05 |