1. Git Repository 생성 및 초기화
git init
해당 명령어를 사용한 경로에서 git을 사용할 수 있도록 지역 저장소를 생성 및 초기화한다.
2. 현재 상태 확인
git status
해당 명령어를 사용해서 현재 상태와 버전이 달라진게 없는지 확인한다.
하위 이미지를 보면 Untracked files에 hello1.txt 파일이 있는 것을 확인할 수 있는데 이것은 현재 git 해당 파일을 추적하고 있지 않다는 의미이다. add 명령어를 사용하여 stagingArea에 올려주면 그 이후로는 git 이 해당파일을 추적한다.
3. Staging Area 에 올리기
우선 Working tree, Staging Area, Repository 의 개념부터 알아야할 필요가 있다.
git init 으로 생성된 레파지토리 내에서 파일을 생성하거나 수정하게 되면 git status 명령어를 통해 커밋할수 있는 파일이나 커밋을 해야할 파일 , 추적중이지 않은 파일들을 확인할 수 있다. 지역 저장소로 버전관리를 하는 flow를 간략하게 나타내면 아래와 같다.
1. 파일을 수정 한다.
2. git add 명령어를 통해 Working tree 에서 변경사항들을 Staging Area에 올린다.
3. git commit 명령어를 통해 Staging Area 에 올라온 사항들을 Repository에 반영한다.
# 파일명1 파일명2 파일명3을 stage에 올림
git add 파일명1 파일명2 파일명3
# 현재 디렉토리의 모든 파일을 staging Area에 올림
git add .
4. Commit
# stagig area에 올라온 모든 것을 커밋
git commit -m "커밋 메세지"
# stagig area에 올라온 것중에 파일명1을 커밋
git commit 파일명1 -m "커밋 메세지"
# add를 생략하고 바로 커밋(untracked 파일은 무시됨)
git commit -am "커밋 메세지"
-m 명령어를 사용하지 않고 git commit 만 실행하게 되면 default 로 설정된 에디터가 켜지면서 여러 줄에 걸쳐 커밋 메세지를 작성할 수 있다. default 로 설정된 에디터를 변경하고 싶다면 아래의 명령어를 사용하여 에디터를 변경하자.
git config --global core.editor "vim" #원하는 에디터 ex) nano, vim
5. log 확인
# commit 로그를 최신 순으로 표출
git log
# commit 로그와 변경사항을 최신 순으로 표출
git log -p
6. 변경사항 확인
# working directory 와 staging area 사이의 차이 확인
git diff
# working directory, staging area의 변경사항 모두를 repository head commit과 비교
git diff HEAD
# 브랜치1 과 브랜치2 간 변경사항 확인
git diff branch1 branch2
git diff branch1..branch2
# commit1과 commit2 간 변경사항 확인
git diff commitId1..commitId2
7. Reset을 사용하여 commit 되돌리기
# HEAD를 이전 커밋으로 이동하면서 staging area와 working directory 변경내용은 그대로 유지
git reset --soft
# HEAD를 이전 커밋으로 이동하면서 staging area는 초기화되지만 working directory의 변경내용은 그대로 유지됨(기본값)
git reset --mixed
# HEAD를 이전 커밋으로 이동하면서 staging area와 working directory 변경내용을 모두 초기화
git reset --hard
# HEAD를 특정 커밋 ID로 이동하면서 staging area와 working directory 변경내용을 모두 초기화
git reset --hard 커밋ID
뒤에 붙이는 모드에 따라 staging area 와 working directory 의 변경내용 무시 여부를 설정하고 staging area에 올라간 커밋을 되돌릴 수 있다. 주의 할점은 HEAD가 가르키던 브랜치가 특정 커밋을 가르키도록 변경되기 때문에 특정 커밋 ID로 리셋시 그 이후 커밋으로 되돌아갈수 없으니 주의해서 사용해야 한다.
reset 실행후 Message 3 에 해당하는 커밋은 사라지고 HEAD가 가르키던 main branch의 최근 커밋이 Message 2로 변경된 것을 확인할 수 있다.
8. 특정 버전으로 돌아가기
# 특정 커밋 ID로 HEAD룰 이동
git checkout 커밋ID
# main branch 로 HEAD를 이동
git checkout main
위 명령어를 이용해서 특정 커밋 ID나 브랜치로 HEAD를 이동시킬 수 있다. 커밋 ID 는 git log 를 통해 확인가능하다. 특정 커밋 ID로 체크아웃을 받으면 브랜치는 별개로 HEAD의 위치만 바꿀 수 있으므로 브랜치의 최근 커밋으로 다시 이동할 수 있다.
9. Revert를 사용한 되돌리기
git revert 커밋ID
revert 를 사용하여 되돌리는 방법도 있지만 reset과는 원리가 다르다. 아래의 예시를 보자.
위 git log에서 R4 커밋메세지에 해당하는 커밋을 revert 하면 아래와 같다.
git reset 처럼 HEAD가 가르키던 브랜치의 최근 커밋이 R3가 된것이 아니라 R4 커밋은 그대로 있고 새로운 커밋이 생긴 것을 확인할 수 있다. 파일의 내용을 열어서 확인해보면 R3의 작업 내역이 들어있는 것을 확인할 수 있다.
10. 제일 최근 커밋 메시지 수정
# default 로 설정된 에디터가 열리면서 메시지 수정
git commit --amend
# 에디터를 열지 않고 간단하게 메시지 수정
git commit --amend -m "커밋 메시지 수정"