head라는 파일에 master가 있다. 이 커밋은 방금 커밋한 것을 가리키고 있다.
이것을 통해서 master는 최신 커밋을 가리키고 있는 것을 알 수 있다.
git은 head라는 파일을 가지고 있고, 이 파일에 ref\heads\master가 있는데, 이 것이 가장 최근 커밋을 가리키고 있다. 이전 커밋은 parent를 통해서 탐색해나갈 수 있다.
깃에서 브랜치라는 것은 \ref 아래에 파일인 것이다.
체크아웃을 하면 HEAD 파일이 바뀌는데, 이 HEAD는 refs\heads\expo를 가리킨다.
head가 refs/heads/expo를 가리키고 ../expo는 방금 커밋을 가리킨다.
(HEAD -> MASTER)라는 것은 현재 체크아웃된 브랜치가 master인 것을 알려준다.
master는 6번, exp는 7번을 가리키는 상태다.
두개를 합쳐서 하나의 커밋을 새로 만들고 마스터가 가리키고 있는 것을 알 수 있다.
만약 이름이 같으면 문제가 발생한다.
master에 와보면 master에도 common.txt가 있다.
master에서 수정하고 다시 exp 브랜치가 보자.
서로 다른 부분을 수정하면 자동으로 merge할때 문제가 없지만 같은 부분을 수정하면 문제가 생긴다.
========== 이 선이 구분자이다.
구분자를 중심으로 해서 <<< head부분은 현재 브랜치가 수정한 부분이고
>>> exp는 exp가 수정한 부분이다
git reset --hard "커밋번호"
해당 커밋으로 돌아간다. 이전 커밋들은 삭제된다.
reset을 한다는 것은 체크아웃하고 있는 브랜치의 최신 커밋을 바꾸는 행위다.
그럼 4번은 지워진 것일까? 그렇지 않다
orig/HEAD에 남아 있고, logs/refs/heads/master에서도 남아있다.
git reset --hard ORIG_HEAD
리셋한 것을 취소할 수 있다.
git reflog
명령어를 이용하면
그전에 한일들 로그가 남아있다.
git checkout "커밋번호"
를 하면 해당 커밋을 head가 가리킨다.
어떠한 특정 커밋을 직접 가리키고 있는 것이다.
working directory는 실제 작업을 공간
index는 git add를 했을때 추가되는 곳
repository는 실제로 커밋들이 저장되는 곳
빨간색은 영향을 미치는 범위다. 즉 git reset --hard는 working directory, index, repository 모두에서 되돌린다.
충돌이 일어났을 때, 공통 파일과 충돌이 나는 두 파일 총 세 가지를 고려한다.
병합을 전문적으로 해주는 툴이 있다.
git config --global merge.tool kdiff3
공통의 파일에서 마스터와 exp의 수정사항이 충돌하는 것이다. 공통적인 부분을 base라고 부른다.
공통 부분을 base라고 부른다.
2 way merge는 base를 보지 않고 두개의 차이점만 봐서 병합하는 것이다.
2 way에서는 서로 다르다면, 뭐가 맞는지 모르니 차이점에서 다 conflict를 낸다.3 way merge는 base와 차이점을 고려한다.
3 way는 두 개가 다른데, 공통점과 다른 쪽을 채택한다 (수정했다고 보는 것이다). 셋다 다르면 conflict가 난다.