Git & GitHub

깃 브랜치 - 브랜치 병합하기 + 삭제하기

Player-Hyeok 2024. 2. 8.

깃에서 브랜치에 대해 공부하고 있다.
2024.02.07 - [Git & GitHub] - 깃과 브랜치 - 브랜치 생성 및 활용

깃과 브랜치 - 브랜치 생성 및 활용

기존 파일에 새로운 기능을 추가해야 할 경우가 자주 있을 것이다. 이 때 제대로 동작하는 소스는 그대로 둔 채 기능을 추가한 새로운 버전을 따로 만들어 관리하고, 이 새로운 버전을 기존 버전

godsgift.tistory.com

이전 글에서 브랜치를 생성하고 브랜치를 관리하는 방법을 알아보았는데, 본격적으로 브랜치를 병합하고 충돌을 관리하는 법을 예제를 통해 공부해 보았다.

깃 브랜치 병합하기
깃 브랜치 병합하기

 

브랜치 병합하기

브랜치마다 각자 커밋하더라도 어느 시점에는 브랜치 작업을 마무리하고 기존 브랜치와 합쳐 최종 파일을 만들어야 한다. 이를 브랜치 병합(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 사용

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가 있다.
 
 
 

댓글

💲 추천