2022. 8. 9. 16:14ㆍ개발공부 기강잡자/Git
Git 의 HEAD와 branch의 원리, 구조
1. HEAD
git init
을 하면 생기는 HEAD 파일에는 (일반 텍스트 파일)
ref : refs/heads/master
라고 기록되어있다.
이는, 현재 HEAD가 가리키는 branch를 의미한다. (현재 HEAD 파일은 master 파일을 가리킨다.)
그리고 refs/heads/master
파일에는 가장 최신 commit의 object id 가 기록되어있다.
= master branch의 가장 최신 commit을 나타내는 (HEAD -> master)
1. 이처럼 git log
를 했을 때, 가장 최신 커밋이라고 알려줄 수 있는 이유는 git의 HEAD 파일이 가리키는 master 파일에 가장 최근에 commit
한 object id
를 가지고 있기 때문이다.
2. 이전 커밋은 가장 최근 commit
의 object
가 가지고 있는 parent
값을 통해 탐색할 수 있다.
2. Branch
git branch exp
명령을 통해 branch를 생성한 경우, refs/heads/
디렉토리 아래에 exp라는 파일이 생성된다.
refs/heads/exp
-> exp branch의 가장 최근 commit
을 가리키는 object id가 기록되어있다.
⚡ git 에서 branch는 refs 아래의 파일을 의미한다.
git branch
명령어
= refs/heads/
디렉토리 안에 있는 파일명 출력
= refs/heads/
디렉토리아래의 파일들은 각 branch를 나타냄
▶각 파일은 해당 branch의 가장 마지막 commit의 object id를 기록하고 있다.
git checkout exp
했을 때, HEAD 파일의 변화
ref: refs/heads/exp
exp 브랜치로 checkout
하면서 현재 checkout
된 branch 파일을 가리키도록 변경되었다. (refs/heads/exp)
(해당 파일은 exp branch의 가장 최근 commit
의 object id 값을 가리키고 있다.)
= 이를 통해,
1. git은 HEAD 파일을 통해 현재 checkout 되어있는 branch의 가장 최신 commit을 확인할 수 있고,
2. branch 목록은 refs/heads/ 디렉토리의 파일 목록을 통해,
3. 각 branch의 commit 정보는 refs/heads/{branch name} 파일로 관리한다는 점을 추측할 수 있다.
branch 충돌 해결
exp branch에서 파일을 생성한뒤 master와 merge
하면 문제없이 master에도 exp에서 생성한 파일이 추가된다.
그러나 merge
했을 때, 각 branch가 같은 파일 이름을 가진 파일을 수정했을 경우에는 주의해야한다.
😮 각 branch가 다른 부분을 수정한 경우
exp branch의 common.txt 와 master branch의 common.txt 파일의 내용이 다를 때 merge 하면
master와 exp가 각각 수정한 부분을 자동으로 전부 합친다.
🤪 각 branch가 같은 부분을 수정한 경우
병합하려는 branch들이 한 파일의 같은 부분을 수정한 경우, 문제가 일어난다...!
both modified :
- 병합하려는 부분이 master 와 exp에서 모두 수정되었기 때문에 conflit 발생
▶ git이 자동으로 merge 하는 것을 실패했기 때문에, 사용자가 직접 충돌을 해결해야한다.
<<<< HEAD
: 현재 checkout 되어있는 branch의 수정사항
>>>> exp
: 현재 병합하려고 하는 branch의 수정사항
- git이 충돌부분에 대해 메모?해둔 것을 보고 파일을 수정한 다음에 commit 하여 merge를 수행하면 된다.
문제가 있을 시, 댓글로 알려주시길 바랍니다.
참고 : 지옥에서 온 git 강의 (이고잉 님)
'개발공부 기강잡자 > Git' 카테고리의 다른 글
[Git - 지옥에서 온 git] 4일차 - git의 원리 공부 (merge/conflit/3-way merge) (0) | 2022.08.09 |
---|---|
[Git - 지옥에서 온 git] 4일차 - git의 원리 공부 (reset/checkout) (0) | 2022.08.09 |
[Git - 지옥에서 온 git] 3일차 - branch 수련 (git-scm의 Documentation 보기) (0) | 2022.08.04 |
[Git-지옥에서 온 git] 3일차 - branch (0) | 2022.08.04 |
[Git-지옥에서 온 git] 2일차 - git의 원리 (0) | 2022.08.03 |