<깃 공식 문서 읽어 보고 궁금했던 것 정리하기>
챕터는 3까지만 읽어보면 어느 정도 아주 기초 단계는 알 것 같다.
git branch ~
를 통해 만들어진 브랜치로 바로 이동하는 것이 아니라 master에 일단 있다. 이걸 확인하는 방법은 HEAD가 현재 어디를 가르키는가다.git log --oneline --decorate
를 통해 현재 브랜치가 어떤 커밋을 가르키는지도 확인할 수 있다.
브랜치를 이동하는 방법은 git checkout
이다. ; 이 때 HEAD 위치가 바뀐다.
브랜치 생성 - 새 브랜치로 이동 - 커밋 - master브랜치로 이동 - 커밋 하면 양갈래로 갈라진다.(갈라지는 브랜치)
확인하는 방법 : git log --oneline --decorate --graph --all
git branch -d
merge하지 않은 브랜치 강제 삭제는 대문자 사용.
주목할 점 : 모든 브랜치 작업은 현재까지는 로컬에서만 이뤄졌다는 것.
origin 으로부터 저장소 데이터를 모두 내려받고 master 브랜치를 가리키는 포인터를 만든다. 이 포인터는 origin/master 라고 부르고 멋대로 조종할 수 없다. 그리고 Git은 로컬의 master 브랜치가 origin/master 를 가리키게 한다. 이제 이 master 브랜치에서 작업을 시작할 수 있다.
이 때문에
* e5d40e3 (HEAD -> master, origin/master, origin/HEAD) Revert "work6.5"
* be72a96 Merge branch 'master' into HEAD
|\
| * 24c2719 work6.5
| * 34a7914 work5.5
* | 498f06a work5.5
|/
* 43eeae5 work4
* c7a4c30 Revert "work3"
* 3e9aa63 work3
* e5977c5 work2
* e683b03 work1
git pull = git fetch + git merge
merge와 차이가 있는 rebase : 브랜치를 합치는 또 다른 방식
Rebase 의 경우는 브랜치의 변경사항을 순서대로 다른 브랜치에 적용하면서 합치고 Merge 의 경우는 두 브랜치의 최종결과만을 가지고 합친다.
rebase만 하면 줄기는 합쳐지지만 내용이 병합이 되지 않는다.
# 과정 : iss 브랜치 만들고 커밋 - master에서 work7커밋 - iss에서 master로 리베이스한 상태.
* de50f5b (HEAD -> iss) rebase
* f8d2ded (master) work7
* e5d40e3 (origin/master, origin/HEAD) Revert "work6.5"
* be72a96 Merge branch 'master' into HEAD
|\
| * 24c2719 work6.5
| * 34a7914 work5.5
* | 498f06a work5.5
|/
* 43eeae5 work4
* c7a4c30 Revert "work3"
* 3e9aa63 work3
* e5977c5 work2
* e683b03 work1
여기서 master로 이동 후 iss와 merge하면 이렇게 바뀐다.(완전 병합)
* de50f5b (HEAD -> master, iss) rebase
* f8d2ded work7
* e5d40e3 (origin/master, origin/HEAD) Revert "work6.5"
* be72a96 Merge branch 'master' into HEAD
|\
| * 24c2719 work6.5
| * 34a7914 work5.5
* | 498f06a work5.5
|/
* 43eeae5 work4
* c7a4c30 Revert "work3"
* 3e9aa63 work3
* e5977c5 work2
* e683b03 work1
모양은 merge 상태와 비슷하다고 한다.
주의사항 : 로컬 브랜치에서 작업할 때는 히스토리를 정리하기 위해서 Rebase 할 수도 있지만, 리모트 등 어딘가에 Push로 내보낸 커밋에 대해서는 절대 Rebase 하지 말아야 한다.