깃에서 브랜치에 대해 공부하고 있다.
2024.02.07 - [Git & GitHub] - 깃과 브랜치 - 브랜치 생성 및 활용
이전 글에서 브랜치를 생성하고 브랜치를 관리하는 방법을 알아보았는데, 본격적으로 브랜치를 병합하고 충돌을 관리하는 법을 예제를 통해 공부해 보았다.
브랜치 병합하기
브랜치마다 각자 커밋하더라도 어느 시점에는 브랜치 작업을 마무리하고 기존 브랜치와 합쳐 최종 파일을 만들어야 한다. 이를 브랜치 병합(merge)라고 말한다. 병합하는 방법과 충돌 발생 시 해결 방법은 다음과 같다.
서로 다른 파일 병합하기
실습은 새로운 저장소를 만들어서 필요한 브랜치와 커밋만 사용해서 진행(꼬이면 복잡하므로)
1) cd ~
2) git init manual-2
3) cd manual-2
4) ls -al - .git/ 디렉터리 생성 확인
5) vim work.txt - 1 입력 후 저장
6) git add work.txt
7) git commit -m "work 1"
8) git branch o2 - branch 생성
9) vim main.txt - main 2 입력 후 저장
10) git add main.txt
11) git commit -m "main work 2"
12) git switch o2
13) vim o2.txt - 2 입력 후 저장
14) git add o2.txt
15) git commit -m "o2 work 2"
16) git log --oneline --branches --graph
---------- o2 브랜치에서 작업이 모두 끝났다고 가정
1) git switch main
2) git merge o2 : 빔이 실행되면서 Merge branch o2 라는 커밋 메세지가 나타남. 메세지 수정 가능함. esc-:wq 종료
3) ls -al : o2 브랜치에 있던 o2.txt 파일이 main 브랜치에 합쳐져서 존재하고 있음을 확인
4) git log --oneline --brancehs --graph : 브랜치가 병합되어 하나로 표시되는 것을 확인 할 수 있음.
* Fast-forward 병합 : 브랜치 분기 후에 main 브랜치에 변화가 없으면(새로운 커밋이 생성되지 않았다면) git merge 명령어 사용 시 화면에 커밋 해시가 업데이트되었다는 내용만 뜨고 바로 병합이 진행.
서로 다른 브랜치에서 한 문서의 다른 부분을 수정하였을 때 병합하기
1) cd ~
2) git init manual-3
3) cd manual-3
4) vim work.txt - #title / conent / 공백2줄 / #title / content 로 내용 작성
5) git add work.txt
6) git commit -m "work 1"
7) git branch o2
8) vim work.txt - 빈 공백 첫줄에 main content 2 입력 후 저장
9) git commit -am "main work 2"
10) git switch o2
11) vim work.txt - 제일 마지막 줄에 o2 content 2 라고 입력 후 저장
12) git commit -am "o2 work 2"
13) git switch main
14) git merge o2
15) 편집기 화면 뜨면 원하는 메세지 작성 후 저장 후 종료 (:wq)
16) cat work.txt - main content2, o2 content2 가 모두 작성되어 있음을 확인
서로 다른 브랜치에서 한 문서의 같은 부분을 수정했을 때 병합하기
깃에서는 줄 단위로 변경 여부를 확인하므로 서로 다른 브랜치에서 같은 문서의 같은 줄을 수정할 경우 브랜치 병합 시 충돌(conflict)이 발생함. 충돌이 어떨때 발생하는지 알아보고 이를 해결하는 방법을 실습하기.
1) cd ~
2) git init manual-4
3) cd manual-4
4) vim work.txt - #title/content / 공백1줄 / #title / content 입력 후 저장
5) git add work.txt
6) git commit -m "work 1"
7) git branch o2
8) vim work.txt - 첫 번째 공백줄에 main content 2 라고 입력 후 저장
9) git commit -am "main work 2"
10) git switch o2
11) vim work.txt - 첫 번쨰 공백(아까 main content 2 입력한 줄)에 o2 content 2 입력 후 저장
12) git commit -am "o2 work 2"
13) git switch main
14) git merge o2 - conflit (content) : Merge conflict in work.txt 경고 메세지 발생
15) vim work.txt - 충돌 문서 열어서 확인. <<<<HEAD / main content 2 === o2 content 2 / >>>> o2 나옴
16) a(i) 눌러서 work.txt 문서 수정, 수정 후 <<< head, >>>o2, === 은 삭제 후 저장
17) git commit -am "merge o2 branch"
18) git log --oneline --branches --graph
* 브랜치 병합을 자동으로 처리해 주고 충돌을 해결해 주는 프로그램이 많음.
* 주로 3 way merge 병합 알고리즘으로 P4Merge, meld, Kdiff3, Araxis Merge(유료) 등이 있다.
병합이 끝난 브랜치 삭제하기
병합한 후 사용하지 않은 브랜치를 삭제할 수 있음. 단, 삭제하더라도 완전히 지워지는 것은 아니며 동일 이름의 브랜치를 만들면 예전 내용을 다시 볼 수 있음
1) (manual-4 폴더에서 이어서) git branch : 브랜치 확인
2) git switch main : 저장소의 기본 브랜치여야지 다른 브랜치 삭제 가능
3) git branch -d o2 : -d = delete, -D 사용 시 병합하지 않는 브랜치도 강제로 삭제함, Deleted branch o2 메세지 확인.
cherry-pick 으로 병합하기
브랜치 병합의 다른 방법으로, 브랜치 전체를 합치는 것이 아닌 특정 버전의 변경 내용만 합칠 때 사용하는 기능이다.
사진에서의 경우, main 브랜치에 t1 버전이 합쳐지게 되며 merge와 다르게 mt3 이 생기지 않는다.
1) cd ~
2) git init cherry-pick
3) cd cherry-pick
4) touch init.txt; git add init.txt; git commit -m "init" - init.txt 만들기, 스테이징, 메세지와 함께 커밋
5) git branch topic
6) git log --oneline --all --graph : init 가 main, topic 브런치 양쪽에 다 있음을 확인
7) touch m1; git add m1; git commit -m "m1"
8) touch m2; git add m2; git commit -m "m2"
9) git log --oneline --all --graph : main 은 m2, topic 은 init 버전 상태임을 호가인
10) git switch topic
11) touch t1; git add t1; git commit -m "t1"
12) touch t2; git add t2; git commit -m "t2"
13) touch t3; git add t3; git commit -m "t3"
14) git log --oneline --all --graph : main 브랜치는 init 버전부터 m1,m2 로 연결. topic 브랜치는 init 부터 t1, t2, t3 으로 연결.
* topic 브랜치의 t2 버전엥서의 내용을 main 브랜치로 적용하고 싶을 때 cherry-pick 사용
15) git switch main
16) git cherry-pick 734ff7b
17) ls : 파일 확인. init.txt, m1, m2, t2 가 있는 것을 확인할 수 있다. t2 가 cherry-pick 되었음.
18) git log --oneline --all --graph : topic 브랜치에도 t2가, main 브랜치에도 t2가 있다.
'Git & GitHub' 카테고리의 다른 글
깃허브 시작하기 - 깃허브 가입, 원격 저장소 연결 및 동기화 (1) | 2024.02.10 |
---|---|
깃 명령어 총정리 (0) | 2024.02.09 |
깃과 브랜치 - 브랜치 생성 및 활용 (1) | 2024.02.07 |
깃 버전 관리하기 - 버전 생성과 되돌리기 (2) | 2024.02.07 |
깃으로 버전 관리하기 - Git 저장소 및 버전 만들기 (2) | 2024.02.06 |
댓글