본문 바로가기

STUDY/GIT

5. Git 브랜치1 - 브랜치, 머지

브랜치란

 

개발을 하다보면 코드를 여러개로 분리하여 독립적으로 개발을 진행해야 하는 경우가 생긴다. 예를 들어 동일한 서비스라도 운영에서 배포되고 있는 코드가 있고 새로운 기능을 개발중인 코드가 있을 수 있다. Git의 브랜치는 이러한 코드의 분리와 독립적인 개발이 가능하게 해준다.

 

> git branch
*master

Git 저장소를 처음 생성하면 자동적으로 master라는 브랜치가 생성된다. 그리고 새로운 커밋이 추가될때마다 master 브랜치의 포인터는 최신 커밋을 가르키도록 이동한다.

 

> git branch testing
> git branch
*master
testing

git branch 명령어를 통해 새로운 브랜치를 생성할 수 있다. 하지만 새로운 브랜치를 추가할 뿐 여전히 작업중인 브랜치는 master 브랜치이다.  HEAD는 현재 작업중인 브랜치를 가르키는 포인터이다.

 

> git checkout testing

git checkout 명령어를 사용하면 작업중인 브랜치를 옮길 수 있다.

 

> echo "" > newfile1
> git add newfile1
> git commit -m "fix newfile1"

작업 중인 브랜치를 이동하고 새로운 commit을 추가하면 위와 같이 브랜치들이 바라보는 commit 위치가 서로 달라지게 된다.

 

> git log --graph --all
...
* commit 0230ffb37c48b7eaa28c8b091af2110b183328bd (HEAD -> master)
| Author: nankisu <nankisu0301@naver.com>
| Date:   Wed Jan 18 15:59:08 2023 +0900
| 
|     fix newfile
|   
| * commit 7b0dbe60b707ac3ceea1d6d68fe7f3bc7cee020e (testing)
|/  Author: nankisu <nankisu0301@naver.com>
|   Date:   Wed Jan 18 15:54:09 2023 +0900
|   
|       fix newfile1
|
...

git log 명렁어를 --graph --all 옵션과 함께 실행하면 위처럼 서로 브랜치가 갈라지는 모습을 시각적으로 보여준다.

 

 


 

머지(Merge)

 

동시에 독립적인 개발을 위해 브랜치를 나누었다 할지라도 결국은 하나의 브랜치로 개발 내용을 합쳐야 하는 순간이 온다. 이처럼 하나의 브랜치에 다른 브랜치의 내용을 합치는 것을 머지(Merge)라고 한다.

 

위처럼 하나의 저장소에 master 브랜치가 있다고 가정해보자.

 

> git branch iss53
> git checkout iss53
> echo "new function" > newFunction
> git add newFunction
> git commit -m "add newFunction"

그리고 새로운 기능 개발을 위해 iss53이라는 브랜치를 새로 만들고 해당 브랜치에서 작업을 하였다.

 

> git checkout master
> git checkout -b hotfix
> echo "bug fix" > newfile
> git add newfile
> git commit -m "fix newfile"

iss53 브랜치에서 새로운 기능을 개발하던 중 master브랜치에 버그가 발견되어 빠르게 수정을 해야 하는 상황이 발생했다. master 브랜치로 이동 후 버그 수정을 위한 hotfix브랜치를 새로 만들었다.(-b 옵션과 함께 git checkout을 하면 브랜치 생성과 동시에 이동한다.) 그리고 버그를 수정한 내용을 커밋하고 나면 master, iss53, hotfix 세개의 브랜치의 상황은 위 그림과 같다.

 

> git checkout master
> git merge hotfix
Updating 0230ffb..e9a0592
Fast-forward
 newfile | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 newfile

이제 버그 수정이 완료된 hotfix 브랜치의 작업 내용을 master 브랜치로 합쳐야 한다. 이를 위해서는 합쳐질 브랜치로 이동 후, 합칠 브랜치를 머지 하면 된다.

 

> git merge iss53
> git log --graph --all
*   commit 94dfe977619802fddafb923625ae8e174643335a (HEAD -> master)
|\  Merge: e9a0592 3533c05
| | Author: nankisu <nankisu0301@naver.com>
| | Date:   Wed Jan 18 16:24:09 2023 +0900
| | 
| |     Merge branch 'iss53'
| | 
| * commit 3533c05c326cc6ae23aa5e5d18b8f6267b7347aa (iss53)
| | Author: nankisu <nankisu0301@naver.com>
| | Date:   Wed Jan 18 16:13:55 2023 +0900
| | 
| |     add newFunction
| | 
* | commit e9a059281c0e4bb1affdc76d8c3e8685f3a64341 (hotfix)
|/  Author: nankisu <nankisu0301@naver.com>
|   Date:   Wed Jan 18 16:16:54 2023 +0900
|   
|       fix newfile
| 
...

새로운 기능 개발이 끝나서 iss53 브랜치까지 합치고 나면 비로소 master 브랜치에 모든 브랜치의 수정사항이 반영된다. 시각적으로 표현된 git log를 보면 분리되었던 브랜치들이 하나로 합쳐지는것을 볼 수 있다.

 

> git merge hotfix
Auto-merging newFunction
CONFLICT (add/add): Merge conflict in newFunction
Automatic merge failed; fix conflicts and then commit the result.
> vim newFunction
> git add newFunction
> git commit -m "resolve conflict"

만약 서로 다른 브랜치에 같은 파일을 동시에 수정하면 머지중에 충돌이 발생한다. 이때는 해당 파일을 수정하여 충돌을 해결해주고 다시 커밋해야한다.

728x90