1. 브랜치(branch) 추가
브랜치는 독립적으로 커밋을 생성할 수 있도록 하는 기능입니다. 브랜치 기능으로 인하여 여러 사람이 공동으로 작업하여도 버전관리가 될 수 있습니다.
브랜치는 다음 명령으로 추가할 수 있습니다.
브랜치의 생성을 확인하려면 branch 명령어만 입력합니다.
브랜치를 이동하려면 checkout 명령어를 사용합니다. git 2.23 부터는 checkout의 기능이 분리되어 switch 명령어를 통해서도 브랜치의 이동이 가능합니다.
브랜치를 생성하고 바로 이동하려면 다음과 같이 -b 옵션 / -c 옵션을 붙이면 됩니다.
checkout:
switch:
브랜치의 삭제는 -d 옵션을 사용합니다.
2. 병합(merge)
분기하여 작업한 브랜치는 하나의 브랜치로 병합할 수 있습니다.
issue1 브랜치로 이동하여 test.txt 파일을 임의로 수정하고 스테이징 후 커밋을 합니다.
VSCode의 extension인 Git Graph를 통하여 커밋 로그를 그래프로 확인하면 브랜치가 하나로 이어져있는 것을 확인할 수 있습니다.
이것은 현재 issue1 브랜치를 기준으로 main 브랜치는 fast-forward 상태에 있기 때문입니다.
main 브랜치로 이동하고 merge 명령어를 입력하면 main 브랜치는 fast-forward merge가 됩니다.
fast-forward merge:
$ git switch main
$ git merge issue1 |
이번에는 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 상태가 됩니다.
우선 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 |
메인 브랜치의 참조 커밋이 변경되면서 non fast-forward 상태가 되었습니다. 이 상태에서는 자동으로 non fast-forward merge가 됩니다.
하지만 issue1과 issue2 양쪽에서 같은 파일을 수정했기 때문에 병합충돌이 발생합니다.
non fast-forward merge:
test.txt 파일을 열어봅니다. 메인 브랜치인 HEAD의 변경 부분과 issue2 브랜치 변경부분을 다음과 같이 구분하여 파일이 수정되어 있습니다.
HEAD(메인 브랜치)의 변경부분:
<<<<<<< HEAD
브랜치 병합 테스트 issue1 내용 추가 ======= |
issue2 브랜치의 변경부분:
=======
issue2 내용 추가 >>>>>>> issue2 |
코드를 수정하고 스테이징 후 다시 커밋을 보내면 커밋이 생성되면서 merge가 됩니다.
test.txt:
임의의 내용 작성 1
내용 추가 브랜치 병합 테스트 issue1 내용 추가 issue2 내용 추가 |
병합충돌 해결:
$ git commit -am "병합충돌 해결" |
--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과 같은 명령어를 사용합니다.
:wq를 입력하면 병합이 완료됩니다.
또다른 병합 옵션으로 --squash가 있는데 이는 rebase를 알아야 하므로 다음 글에서 알아보도록 하겠습니다.
|