본문 바로가기

형상관리 Git

Git 브랜치란 무엇인가

 

출처: https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80#ch03-git-branching

 

이전에 몇시간 고민한 질의를 시작으로 글을 시작하려한다.

 

선생님들 깃에 관해 하나만 물어볼께요.
1)remote에서 하나의 저장소에 A라는 하나의 브랜치만 있었습니다. 그리고 같은 저장소에 B 라는 브랜치를 하나더 추가하고 그 브랜치에는 폴더를 하나 추가해 주었습니다. 이것을 로컬에서 A브랜치도 pull하고 B브랜치도 pull하였습니다. 그랬더니 로컬저장소에는 그 B에만추가된 폴더가 그대로 남아있습니다.
즉, 로컬 저장소는 원격 저장소의 2개의 브랜치중에 폴더가 더 많은 쪽을 pull로 받아 오는 결과를 보인것입니다.

2)그런데 그후 제가 A브랜치에 있는 특정 파일을 삭제하고 그것을 로컬에서pull하고, 모든 파일이 그대로 남아있는 B브랜치도 pull을 하였습니다. 그런데 삭제된 파일은 그대로 삭제되었더라구요 그 파일이 남아있는 B브랜치도 pull을 하였음에도 불구하구요.

1)을 보았을때는 로컬에서 pull을 하면 더 많은 정보(폴더)를 가지고 있는 브랜치 B의 버전을 따랐다면 2)에서도 마찬가지로 파일이 지워졌더라도 파일이 지워지지 않은 B의 버전을 따라야 하는거 아닌가요?

=> 이 질문에 대한 답변: 브랜치는 새롭게 생성되는 commit이라는 객체를 가리키는 포인터이다. pull을 아무리 받아도 pull을 주는 쪽에서 새로운 commit내용이 생성되지 않으면 어떠한 변화도 없다. 

 

- 브랜치란? 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발하는 것이 브랜치다.

- 브랜치는 커밋 사이를 이동할 수 있는 포인터 같은 것이다.

 

- 스냅샷=커밋

 

내생각: 브랜치는 커밋을 가리키는 포인터이기 때문에 처음에 A, B두개의 브랜치가 a라는 커밋을 가리키고 있다 가정했을때 브랜치A를 가지고 b,c커밋을 하면 A는 c를 가리키는 상태가 되지만 브랜치B는 아직 a커밋을 가리키고 있게 된다. 이상태에서 브랜치B를 가지고 f,g커밋을 하게 되면 A,B는 모두 동일한 a폴더 시스템에서 시작했지만 결국은 A는 c의 폴더구조를 가리키고 B는 g의 폴더구조를 가리키게 되는 것이다. 즉 작업이 분기된 것이다!!!

 

아래 그림중요.


그림 16. HEAD가 Checkout 한 브랜치로 이동함

방금 실행한 명령이 한 일은 두 가지다. master 브랜치가 가리키는 커밋을 HEAD가 가리키게 하고 워킹 디렉토리의 파일도 그 시점으로 되돌려 놓았다. 앞으로 커밋을 하면 다른 브랜치의 작업들과 별개로 진행되기 때문에 testing 브랜치에서 임시로 작업하고 원래 master 브랜치로 돌아와서 하던 일을 계속할 수 있다.

노트
브랜치를 이동하면 워킹 디렉토리의 파일이 변경된다
브랜치를 이동하면 워킹 디렉토리의 파일이 변경된다는 점을 기억해두어야 한다. 이전에 작업했던 브랜치로 이동하면 워킹 디렉토리의 파일은 그 브랜치에서 가장 마지막으로 했던 작업 내용으로 변경된다. 파일 변경시 문제가 있어 브랜치를 이동시키는게 불가능한 경우 Git은 브랜치 이동 명령을 수행하지 않는다.

즉, 위의 그림에서 커밋(스냅샷,초록박스)을 가리키는 회색 박스가 곧 포인터인 브랜치다