깃은 마지막 커밋 정보를 기반으로 새로운 커밋을 생성한다.
마지막 커밋은 새로운 커밋의 부모 커밋이다.
HEAD는 작업중인 브랜치의 마지막 커밋 ID를 가리키는 참조포인터이다.
브랜치를 이동 시 HEAD포인트도 이동한다
브랜치가 여러개면 HEAD포인트도 여러개이다.
(각각의 브랜치마다 마지막 커밋이 다르기 때문)
~와 ^를 이용해서 현재 HEAD가 가리키고 있는 커밋으로부터 이전으로 이동할 수 있음
$ git checkout HEAD~2
// 2칸 전 커밋으로 이동
$ git checkout -
// 직전으로 HEAD 이동
$ git checkout HEAD~3
// 코드 수정..
$ git switch -c footer2 // 수정한 코드로 footer2라는 브랜치를 만들고 커밋함.
리모트를 연결했다면 로컬저장소의 HEAD와 원격저장소의 HEAD가 따로 존재한다.
AHEAD : 서버로 전송되지 않은 로컬커밋이 존재하는것
BHEAD : 로컬 저장소로 내려 받지 않은 커밋이 존재하는것
브랜치 생성과 이동은 별개의 동작이다
(동시에 실행하려면 별도의 명령어를 입력해야한다.)
-b
옵션을 checkout시 입력하면 생성과 이동이 동시에 이루어짐
$ git checkout -b 새_브랜치이름
$ git checkout -b hotfix
브랜치는 특정 커밋에 별명을 부여한것과 동일하다
(브랜치 이름은 커밋 해시키와 동일)
즉, 브랜치 이동시 브랜치 이름뿐만 아니라 커밋 해시키를 사용할 수 있다.
$ git branch -v
footer fb37081 footer 수정
footer2 0e92f8e HEAD~2 후 코드 수정 및 커밋
hotfix 5c05b9d 6.7.3 추가
* master aa93db8 6.8.2
$ git checkout 커밋해시키
$ git checkout HEAD~1 // 한 단계 전 커밋
$ git checkout HEAD~5 // 5단계 전 커밋
$ git checkout - //직전에 HEAD가 가리키던 커밋으로 돌아옴
// 한단계씩 여러번 돌아오는것도 가능하지만 브랜치이름을 직접 입력하는게 더 편함
리모트 브랜치 : 별칭/브랜치이름
브랜치는 특정 커밋 해시 값을 가리키는 포인터
-> 리모트 브랜치는 원격 저장소의 브랜치를 가리키는 포인터이며 원격 저장소의 브랜치를 가리키는것을 브랜치 추적이라고 한다.
다른 용어로 추적브랜치를 트래킹 브랜치라고 함
트래킹브랜치는 원격브랜치를 가리키는 북마크와 같음
추적브랜치는 원격브랜치의 마지막 커밋 해시값을 가리킴
정보는 .git/refs에 존재
git remote show origin
: remote 중 origin에 대한 정보 보기
$ git push origin master // remote 중 origin에 master브랜치 push하기
로컬저장소에는 4개의 브랜치가 있지만 깃허브에는 master브랜치 하나뿐이다.
원격저장소에 리모트 브랜치를 생성하려면 로컬 저장소에서 전송명령을 실행해야한다.
$ git branch -v
footer fb37081 footer 수정
footer2 0e92f8e HEAD~2 후 코드 수정 및 커밋
hotfix 5c05b9d 6.7.3 추가
* master 89a9f47 add 6.9.4
$ git push origin hotfix // hotfix브랜치 올리기
로컬 저장소와 원격 저장소의 브랜치이름을 서로 다르게 지정할 수 있다.
$ git push origin hotfix:새로운_브랜치_이름 // 원격저장소의 브랜치 이름 바꿔서 올리기
// 예 : footer브랜치를 깃허브에는 function이라는 이름의 브랜치로 올리고 싶을때
// 브랜치명:사용할브랜치명 사용
$ git push -u origin footer:function
// -u : --set-upstream
브랜치의 추적을 다르게 표현것.
트래킹브랜치(업스트림)은 리모트 브랜치와 로컬 브랜치를 연결하는 다리 역할을 함
로컬저장소와 연결된 원격저장소의 브랜치 목록 확인
// remote에 연결된것만 보기
git branch -r
// remote와 local 둘 다 보기
git branch -a
// 복제한 저장소의 트래킹 브랜치 보기
git branch -vv
git push -u origin footer2:function
git checkout --track origin/function
git push
(git push만 입력)git checkout footer2; git pull
원격에는 있고 로컬에는 없는 브랜치를 로컬에 저장
git checkout -b 새이름 origion/브랜치이름
기존에 있는 브랜치를 업스트림으로 연결 가능.
로컬 저장소의 브랜치를 원격저장소로 전송하는 다른 방법
리모트 브랜치 페치되면 깃은 단순히 원격저장소별칭/브랜치 포인터만 생성합니다.
$ git merge 원격저장소/브랜치이름
//병합없이 테스트만 하고싶을때
$ gti checkout -b 임시브랜치이름 origin/브랜치이름
`
브랜치삭제는 해당 브랜치 내용과 커밋을 모두삭제하는것.
현재 자신이 있는 브랜치는 삭제할 수 없음
현재위치 : bug
$ git branch -d bug // (현재 자신이 있는 브랜치는 삭제할 수 없음)
$ git branch -d 브랜치이름
$ git branch -d footer
워킹디렉토리 또는 스테이지에 추가 커밋 작업이 남아있다면 일반적인 방법으로는 프랜치를 삭제할 수 없음
이럴때는 강제로 삭제하여야하는데
소문자 -d가 아닌
대문자 -D를 입력하면 강제로 브랜치 삭제가능
$ git push origin --delete