라즈베리파이반

라즈베리파이 등 컴퓨터계열 게시판입니다.

제목Git 튜토리얼 (2) - 브랜치 추가 / 병합2022-09-17 00:09
작성자user icon Level 4

88x31.png


1. 브랜치(branch) 추가


브랜치는 독립적으로 커밋을 생성할 수 있도록 하는 기능입니다. 브랜치 기능으로 인하여 여러 사람이 공동으로 작업하여도 버전관리가 될 수 있습니다.


브랜치는 다음 명령으로 추가할 수 있습니다.

$ git branch issue1


브랜치의 생성을 확인하려면 branch 명령어만 입력합니다.

$ git branch


img21


브랜치를 이동하려면 checkout 명령어를 사용합니다. git 2.23 부터는 checkout의 기능이 분리되어 switch 명령어를 통해서도 브랜치의 이동이 가능합니다.

$ git switch issue1


브랜치를 생성하고 바로 이동하려면 다음과 같이 -b 옵션 / -c 옵션을 붙이면 됩니다.


checkout:

$ git checkout -b issue1


switch:

$ git switch -c issue1 


브랜치의 삭제는 -d 옵션을 사용합니다.

$ git branch -d issue1 



2. 병합(merge)


분기하여 작업한 브랜치는 하나의 브랜치로 병합할 수 있습니다.


issue1 브랜치로 이동하여 test.txt 파일을 임의로 수정하고 스테이징 후 커밋을 합니다.

img22


VSCode의 extension인 Git Graph를 통하여 커밋 로그를 그래프로 확인하면 브랜치가 하나로 이어져있는 것을 확인할 수 있습니다.


img23 


이것은 현재 issue1 브랜치를 기준으로 main 브랜치는 fast-forward 상태에 있기 때문입니다.


img24 


main 브랜치로 이동하고 merge 명령어를 입력하면 main 브랜치는 fast-forward merge가 됩니다.


fast-forward merge: 

$ git switch main

$ git merge issue1


img25 


이번에는 non fast-forward merge를 해보겠습니다.


issue1 브랜치로 이동하여 test.txt 파일을 수정한 후 커밋합니다.


issue1 커밋: 

$ git switch main

$ git switch -c issue2

$ echo "issue2 내용 추가" >> test.txt

$ git commit -am "test.txt issue2 내용 추가"


메인 브랜치로 이동 후 issue2 브랜치를 생성하여 이동 후, test.txt 파일을 수정한 후 커밋합니다.


issue1 커밋: 

$ git switch main

$ git switch -c issue2

$ echo "issue2 내용 추가" >> test.txt

$ git commit -am "test.txt issue2 내용 추가"


메인 브랜치로 이동하면 다음과 같이 fast-forward 상태가 됩니다.


img26 


우선 issue1 브랜치를 fast-forward merge 합니다.


메인 브랜치가 fast-forward 상태이기때문에 그냥 merge 명령어만 사용하도 fast-forward merge가 되지만, --ff 옵션을 주어 명시적으로 fast-forward merge를 하겠습니다.


–ff 옵션을 통한 fast-forward merge: 

$ git switch main

$ git merge --ff issue1


img27 


메인 브랜치의 참조 커밋이 변경되면서 non fast-forward 상태가 되었습니다. 이 상태에서는 자동으로 non fast-forward merge가 됩니다.


하지만 issue1과 issue2 양쪽에서 같은 파일을 수정했기 때문에 병합충돌이 발생합니다.


non fast-forward merge: 

$ git merge issue2 


img28


test.txt 파일을 열어봅니다. 메인 브랜치인 HEAD의 변경 부분과 issue2 브랜치 변경부분을 다음과 같이 구분하여 파일이 수정되어 있습니다.


img29


HEAD(메인 브랜치)의 변경부분: 

<<<<<<< HEAD

브랜치 병합 테스트

issue1 내용 추가

=======


issue2 브랜치의 변경부분: 

=======

issue2 내용 추가

>>>>>>> issue2


코드를 수정하고 스테이징 후 다시 커밋을 보내면 커밋이 생성되면서 merge가 됩니다.


test.txt: 

임의의 내용 작성 1

내용 추가

브랜치 병합 테스트

issue1 내용 추가

issue2 내용 추가


병합충돌 해결:

$ git commit -am "병합충돌 해결" 


img30


--no-ff 옵션을 사용하면 fast-forward 상태일지라도 non fast-forward merge를 할 수 있습니다.


issue1 브랜치로 변경하여 메인 브랜치와 fast-forward merge를 하고, test.txt를 수정한 후 스테이징 및 커밋합니다.


issue1 새로운 커밋: 

$ git switch issue1

$ git merge main

$ echo "issue1 새로운 커밋" >> test.txt

$ git commit -am "issue1 새로운 커밋"


메인 브랜치로 이동하여 –no-ff 옵션을 통해 issue1을 non fast-forward merge 해봅시다.


–no-ff 옵션: 

$ git switch main

$ git merge --no-ff issue1


다음과 같이 커밋 메시지를 적기위한 에디터가 뜹니다. vim과 같은 명령어를 사용합니다.


img31


:wq를 입력하면 병합이 완료됩니다.


img32


또다른 병합 옵션으로 --squash가 있는데 이는 rebase를 알아야 하므로 다음 글에서 알아보도록 하겠습니다.

#git# branch# merge# fast-forward# non fast-forward
댓글
자동등록방지
(자동등록방지 숫자를 입력해 주세요)