Git

GIT - branch & conflict

마닐라 2021. 9. 21. 23:00

git branch - 브랜치의 목록을 보여주는 명령어

git branch [name] - name이라는 브랜치를 만드는 명령어

 

git branch 명령어

 

git branch 명령어의 목록에 master라는 것에 '*' 표시가 있는 것은 현재 master의 브랜치라는 의미이고

git log에서도 현재 HEAD -> master 인데, 이것도 현재 master 브랜치라는 의미이다.

 

파일을 수정한 뒤 commit을 다시 해보면 로그가 아래와 같이 변한다.

 

 

work3에서 새로 생성한 브랜치들은 그대로 있고 새롭게 커밋된 로그를 보면 master로만 되어있다.

 

git checkout 명령어

 

git checkout [name] 명령어를 입력하면 해당 버전의 브랜치로 이동한다. 

HEAD -> apple 로 변해있는 것을 확인할 수 있다. 

그리고 파일의 내용도 work3 부분으로 돌아간다..

 

apple branch로 commit 후 로그

apple work4, master work4의 부모는 work 3이고 현재 apple의 브랜치 이므로 로그를 찍어보면 위와 같이 출력이 된다.

 

 

google branch로 commit 후 로그
ms branch로 commit 후 로그

 

merge는 병합한다는 의미인데, 위에서 작업한 각각의 다른 브랜치를 병합하는 것이다.

각 브랜치 버전들의 공통의 조상은 work 3인데, git 용어로 base라 한다.

base를 바탕으로 해서 합쳐져서 새롭게 만들어진 버전을 merge commit라 한다.

 

base, merge commit 용어 설명 그림

 

파일들을 병합하려면 master 브랜치의 상태가 되어야한다.

master 브랜치에서 o2 브랜치 버전의 내용을 병합해서 새로운 버전을 만들 것이다.

 

git merge 명령어

git merge [name] 명령어를 사용하면 name에 해당하는 브랜치의 내용을 master로 병합한다.

git log로 내용을 확인해보면 새로운 커밋이 만들어진다.

그래프를 확인해보면 공통의 조상이 o2, master 임을 확인할 수 있다.

 

그리고 'git log --all --graph --oneline' 명령어를 단축어 설정하고 싶을 때는 설정을 변경해주면된다.

 

git config alias 설정

 

같은 파일의 다른 부분을 병합할 때는 git이 알아서 병합해주므로 문제가 없다.

같은 파일의 같은 부분을 병합할 때는 conflict가 발생한다.

 

merge 시 conflict 상태

 

충돌 파일의 내용

=======는 구분자이고 위쪽은 현재 브랜치(master)와 변경한 내용 아래쪽은 o2 브랜치와 변경한 내용이 적혀있다.

수동으로 충돌을 해결해주고 나서 다시 커밋해주면 된다.

 

 

 

3 way merge를 이용하면 2 way merge 보다 자동화해서 병합해주는 부분이 많아진다.

git이 기본으로 3 way merge 를 제공한다.

 

외부도구를 이용해서 병합을 할 수도 있는데, p4Merge 라는 것이 있다.

 

그리고 설정파일에 관련된 정보는 ~/.gitconfig에 정의되어있다.

 

gitconfig 파일 내용

 

 

checkout vs reset

checkout - 언제나 HEAD를 제어한다.(change)

reset - HEAD가 브랜치를 가리키고 있는 동안은 브랜치를 제어한다.(delete)

 

checkout 시 HEAD 변경

 

git reset master를 하게되면 google은 master가 가리키는 2번 버전을 가리키게 된다.

보통은 reset 뒤에 버전 이름이 오게된다. reset 1 이라고하면 google 이라고 하는 브랜치는

1번 버전을 가리키게 된다.

 

reset 시 버전 변경

'Git' 카테고리의 다른 글

GIT - reset & revert  (0) 2021.09.23
GIT - cherry-pick & rebase  (0) 2021.09.22
GIT - backup  (0) 2021.09.20
GIT - Version Control  (0) 2021.09.19