branch와 merge 사용 방법

branch와 merge 사용 방법

개요

혼자서 Git을 사용할 때, branch와 merge는 생각보다 사용량이 많지 않다. 하지만 팀에 소속되고, 팀 프로젝트를 시작하게되면 가장 많이 사용하는 명령어가 branch와 merge라고 생각한다.

팀과 함께 멋진 프로젝트를 진행할 때 branch 명령어와 merge 명령어는 개발자에게 많은 도움을 줄 수 있다.

git branch를 통해 브런치 상황을 확인하고, merge를 통해 자신이 작업한 내용을 특정 branch에 병합할 수 있다.

merge하기 전 git log와 git diff를 통해 내가 작업한 히스토리 확인과 코드 차이점을 확인할 수 있다.

Branch 목록

아래 명령어는 로컬에 존재하는 branch 목록을 보여준다.

git branch

다양한 branch 목록이 표시되며, 처음에는 master 또는 main 하나만 보여진다. 그리고 *은 현재 선택된 branch를 의미한다.

img
branch 명

Branch 생성 및 선택

아래 명령어를 사용하면 새로운 branch가 로컬에 생성된다.

git branch BRANCH_NAME

이렇게 생성된 branch는 생성만 될 뿐 해당 branch로 바로 선택되진 않는다. branch 선택을 위해 checkout 명령어를 사용하자.

git checkout BRANCH_NAME

branch 생성 및 checkout를 동시에 하려면 아래 명령어를 사용하자.

git checkout -b BRANCH_NAME

Branch 로그 확인

git에 많은 commit를 하기 시작하면 git에 대한 히스토리가 궁금할 수 있다. 코드가 어떻게 변화되고 있는지 확인하고, merge를 하기 전 해당 branch를 diff하기 전에 로그를 확인한다.

현재 branch의 변화를 보려면 아래의 명령어를 사용한다.

git log

git log를 입력하면 아래와 같이 로그가 나온다.

img
Merge 과정

누가 코드를 수정했는지 나오며, commit 메시지도 함께 출력된다. commit 당시에 branch 상황도 출력된다.

이를 통해 누가 어떤 작업을 했고, 무슨 작업을 했는지 간략하게 알 수 있다. 또한, git log에서 출력되는 정보들 때문에 commit 메시지는 매우 중요하다.

Git diff를 통한 코드 비교

git log에서는 commit 이력만 확인할 수 있었다. 변화한 코드를 확인하기 위해서는 git diff 명령어를 사용해야 한다.

git diff

아래는 git diff를 입력했을 때 나오는 화면이다.

img

수정사항이 많을수록 많은 내용이 나온다. 하나씩 알아보자.

img

-와 빨간색은 삭제된 코드, +와 초록색은 추가된 코드다.

a/src/App.module.css는 이전버전 b/src/App.moudle.css는 현재 버전을 의미한다.

위 내용은 이전버전 a와 현재 버전 b를 비교한다는 의미다.

Diff 명령어의 옵션들

diff 명령어에는 추가적인 옵션들이 있다.

git diff --staged
git diff --cahched

위 옵션은 같은 기능을 한다. 현재 있는 코드와 Staging Area에 있는 코드를 비교한다.

Staging Area는 git add를 통해 등록된 코드 저장소를 의미한다.

Branch간 비교 방법은 아래와 같다.

git diff BRANCH_NAME OTHER_BRANCH_NAME
git diff BRANCH_NAME origin/BRANCH_NAME
git diff BRANCH_NAME

첫 번째 명령어는 로컬 branch간의 비교이다. 두 번째 명령어는 로컬 branch와 원격 branch간의 비교다.

세 번째 명령어는 현재 branch와 지정된 branch와 비교한다.

Commit된 내용과 비교하는 방법은 아래와 같다.

git diff COMMIT_HASH COMMIT_HASH
git diff COMMIT_HASH...COMMIT_HASH
git diff HEAD^

첫 번째 명령어는 Commit Hash 간의 파일을 비교한다.

두 번째 명령어는 Commit Hash 사이를 비교한다.

세 번째 명령어는 Commit 한 변경점을 확인한다.

git diff는 다양한 옵션이 있다.

git diff -- state // 어느정도 변경되었는지 확인하기
git diff --name--only // 파일명만 확인하기
git diff -w // 개행 코드 및 공백은 무시하기
git diff -U0 // 변경점의 전후에 표시되는 행 수 변경하기
git diff --color-words // 단어 단위로 비교하기

상황에 맞춰서 diff 옵션을 사용할 수 있다.

Merge(병합) 명령어

Merge 란?

Merge는 다른 Branch를 합치는 작업이다. 곂치는 부분과 곂치지 않는 부분을 잘 조합하여 기존의 코드를 문제 없이 추가하는 작업이다.

A Branch에서 B Branch를 생성한다. B Branch에서 작업 후 다시 A Branch로 병합한다.

이렇게 병합된 결과는 기존 A Branch에 반영된다. 기존의 Branch로 병합할 수 있지만 제 3의 Branch로도 병합이 가능하다.

Merge 명령어 사용법

Merge를 하기 위해 먼저 기존 Branch로 이동이 필요하다.

git checkout ORIGIN_BRANCH

그 다음 가져올 Branch를 호출하여 Merge한다.

git merge BRANCH_NAME

Branch가 무사히 병합되면 완료 메시지를 볼 수 있다.

사용된 Branch는 더 이상 사용하지 않으면 삭제한다.

git branch -d BRANCH_NAME

충돌(Conflict)

Merge를 진행하면 필연적으로 충돌을 만날 수 밖에 없다. 동일한 파일을 수정하고, 다른 사람과 함께 작업을 하면 아래와 같은 결과를 마주치게 된다.

img

이럴 땐 git status 명령어를 통해 현재 상태를 확인해야 한다.

어떤 파일이 충돌이 났는지 확인하고 해당 코드 파일을 열어보면 아래 코드를 만날 수 있다.

<<<<<<<<<< HEAD
...
...
======
...
...
>>>>>>>>>>develop

HEAD는 현재 브랜치, >>>>>>>>develop는 대상이 되는 브랜치 이름이다. ====== 사이를 두고 차이를 보여준다.

이 파일을 수정할 때는 위에 나온 기호들과 남기고 싶은 내용을 남기고 commit 해야 한다.

<<<<<<<<<< HEAD <- 제거
...
...
======          <- 제거
...             <- 제거
...             <- 제거
>>>>>>>>>>develop <- 제거

이렇게 하면 충돌을 해결했다고 할 수 있다.

충돌은 신중하게 처리해야 한다. 특히, 자주 일어나는 현상이고, 남이 한 코드를 전부 날려버릴 수 있기 때문에 충돌 났을 때 작업자를 꼭 확인해야 한다.

Commit 내용을 누가봐도 알 수 있도록 해야하는 것이 그런 이유다.

병합은 큰 위험이 따르는 만큼 좀 더 안전한 병합은 없을까?

다음에는 Pull Request(PR)를 알아보자.

마무리

git branch와 git merge는 자신이 작업 공간을 만들 때, 그리고 그 공간을 팀원들에게 다시 돌려줄 때 사용한다고 생각한다.

명령어를 잘 알고 사용해야 자신의 코드를 깔끔하게 추가할 수 있으며, 협업의 기본이 될 수 있다.

branch 명령어와 merge 명령어는 잘 숙지하고 다음에는 개발팀에서 필수적으로 사용되는 PR 알아볼 것이다.

함께 보면 좋은 글

회사에서 바로 사용하는 Pull Request(PR) – [Github 시리즈 1]

참고 – branch와 merge

Leave a Comment