- 커밋하면 커밋 객체가 생성 됨
-> 부모 커밋에 대한 참조와 실제 커밋 구성하는 파일 객체가 들어 있음- 브랜치는 논리적으로는 어떤 커밋과 그 조상들을 묶어서 뜻하지만, 사실은 단순히 커밋 객체 하나를 가리킬 뿐.
HEAD 기억할 점
1. HEAD는 현재 작업 중인 브랜치를 가리킴
2. 브랜치는 커밋을 가리키므로 HEAD도 커밋을 가리킴
3. 결국 HEAD는 현재 작업 중인 브랜치의 최근 커밋을 가리킴
revert를 사용해서 커밋을 되돌려야 하는 경우
C1 <- F1 <- C2 <- F2 <- C3 (master)
에서 (F1,F2) 기능 취소하려면
git revert F2
git revert F1
이전의 히스토리를 변경하지 않고도 여러 커밋 내용을 작업 이전 상태로 되돌릴 수 있음 (최신 커밋부터 취소하는 것이 좋음)
C1 <- F1 <- C2 <- F2 <- C3 <- RF2 <-RF1 (master)
git checkout <커밋체크섬> 을 하면?
HEAD와 브랜치가 분리되는 Detached HEAD 발생.
여기에서 커밋 생성가능하지만 다른 브랜치로 체크아웃하면 Detached HEAD 커밋들 다 사라짐.
$ git reset --hard <이동할 커밋 체크섬>
: 현재 브랜치를 지정한 커밋으로 옮김.
작업 폴더의 내용도 함께 변경
$ HEAD~<숫자>
: HEAD~n은 n번째 위쪽 조상.
HEAD~는 헤드의 부모 커밋, HEAD~2는 헤드의 할아버지 커밋.
$ HEAD^<숫자>
: HEAD^n은 부모의 조상, HEAD^2는 두번째 부모.
병합 커밋처럼 부모가 둘 이상인 커밋에서만 의미가 있음.
# 2단계 이전 커밋으로 되돌리기
git reset --hard HEAD~2
git log --oneline --all # 로그 확인
reset과 checkout 차이
$ git checkout HEAD~2
-> [master] 브랜치는 그자리에 있고 HEAD만 옮겨짐
( 소스트리에서 더블클릭해서 체크아웃 한것과 같은 detached HEAD )
-> reset --hard 명령은 아래의 세 명령을 한번에 수행하는 명령$ git checkout HEAD~2 $ git branch -f master $ git checkout master
$ git log --oneline # 로그 확인
$ git tag -a -m "첫 번째 태그 생성" v0.1 # 주석있는 태그 작성
$ git log --oneline # 태그 생성 확인
$ git push origin v0.1 # 태그 푸시
switch / restore
- $ git switch <브랜치이름>
: $ git checkout <브랜치이름> 과 동일한 명령. 브랜치 변경- $ git switch -c <브랜치이름>
: $ git checkout -b <브랜치이름> 과 동일한 명령. 새로운 브랜치 생성 후 변경- $ git restore : 파일 내용 복구