본문 바로가기
Programming/GitHub

Git Branch 생성과 병합 등 관리방법 (Stash, Merge)

by 조현성 2025. 6. 28.

썸네일

 

Git 관련된 모든 포스팅을 하는 동안 main 브랜치만 다루어 왔다. Git은 결국 협업을 하거나 혼자 개발한다고 해도 기능별로 구분이 필요하기 때문에 브랜치 전략을 세우는 것은 중요 하다고 생각 한다. 운영/개발/기능용 코드 역할에 따라 브랜치를 나누기도 하고, 협업중 충돌이 예상되면 브랜치를 나누기도 하겠지만 나는 혼자 개발을 진행한다는 관점으로 '기능별'로 분리 하려고 한다.

Xcode 소스컨트롤네비게이터

Xcode에서 현재 상태를 확인해 보면 'main' 브랜치만 존재 한다. main 브랜치의 우측 점3개 버튼을 눌러서 New Branch form "main"으로 새로운 브런치를 만들 수도 있고,

New Branch from "main" #1

Repositories 탭에서 main 브랜치를 우클릭 해서 새로운 브랜치를 만들 수도 있다.

New Branch from "main" #2

지금 부터는 로그인 및 로그아웃 등 사용자 인증 기능을 담당하는 'auth' 브랜치를 만들고 병합하는 과정을 작성 한다. 먼저 auth 브랜치를 생성 한다.

auth 브랜치 생성

브랜치 이름 옆에 (current)가 표시 되면 현재 이 브랜치를 사용하고 있다는 의미이다. 즉, auth 브랜치를 생성하자 마자 main 브랜치에서 auth 브랜치로 전환되며 auth 브랜치를 사용하게 되었다.

current 표시

만약 새로운 브랜치를 생성 했음에도 Xcode가 새로운 브랜치로 이동시켜주지 않으면, Switch 버튼을 눌러 전환(Checkout) 시켜주면 된다.

checkout 완료

아무튼 지금은 auth 브랜치를 신규 생성 했고, 현재 auth 브랜치를 사용하고 있는 상태이다. GitKraken으로 현재 상태를 확인해 보면 auth 브랜치와 main 브랜치는 모두 보이는데, auth 브랜치에는 GitHub 표시가 없다.

GitKraken

Xcode에서도 원격저장소를 지칭하는 origin을 확인해 보면 main 브랜치만 존재하는 상태이다. 즉, 새로 생성한 auth 브런치는 아직까지 '로컬전용' 브랜치 라는 것이다.

origin에 main만 존재

때문에 원격저장소(Github)가 새로 생성한 브랜치를 인지 할 수 있도록 auth 브랜치를 사용하고 있는 상태에서 Push를 한번 해준다.

Push 할때 Create 표시

Push를 누르기전, 확인 할 수 있듯이 origin/auth (Create) 라고 표기 되어 있다. 이제 로컬저장소와 원격저장소 모두에 auth 라는 브랜치가 생겼음을 알 수 있다.

GitKraken auth 브랜치 확인
Xcode의 Remotes > origin > auth 브랜치 확인
GitHub에서 auth 브랜치 확인

이제 auth 브랜치에 있는 상태에서 작업을 시작 했다고 가정한다. 로그인 기능을 개발 완료 했다고 가정 했다. (실제로는 주석만 달았다)

첫번째 주석으로 파일 변경

이제 이것을 스테이징 하고, 적당한 메시지를 작성해서 커밋 해본다.

첫번째 커밋

커밋을 하나 더 진행 한다. 로그인이 완료 되면 콘텐츠뷰로 자동 화면 전환 되었다는 것을 가정 한다.

두번째 주석으로 파일 변경
두번째 커밋

이제 auth 브랜치에 2개의 커밋이 있음을 확인 할 수 있고, 원격버전의 origin/auth 보다 2커밋 앞선(Ahead)것을 확인 할 수 있다.

Xcode에서 Ahead확인

GitKraken으로 확인해 보면, 아래와 같다.

GitKraken에서 Ahead확인

원격저장소의 main브랜치와 auth브랜치는 로컬저장소의 auth 보다 2커밋이 밑에 있다. 아직 로컬저장소의 auth 브랜치에서 GitHub로 Push 하지 않았기 때문이다. 이제 Push를 진행해 본다.

Push

main 브랜치와는 일치하지 않지만, 로컬저장소의 auth브랜치와 원격저장소의 origin/auth 브랜치가 일치함은 확인 할 수 있다.

로컬auth브랜치와 원격auth브랜치

이것을 GitHub에서 확인해 보면, main브랜치보다 auth브랜치가 2커밋 앞서있다고 명확히 표시해 준다.

Ahead

이제 Xcode로 돌아와서 main브랜치로 전환(Switch = Checkout) 해본다.

main 브랜치로 checkout

다시 auth브랜치로 전환(Switch = Checkout) 해본다.

auth 브랜치로 checkout

현재처럼 커밋이 완료된 상태에서는 main 브랜치와 auth 브랜치간의 전환이 자유롭다. (아직 auth 브랜치가 2커밋 앞서고 있다) 이제 auth 브랜치를 사용하는 상태에서 로그아웃 기능을 개발중 이라고 가정한다.

세번째 주석으로 파일변경

2번의 커밋을 완료해 둔 상태이고, 로그아웃 기능은 커밋 없이 작업중인 상태이다. auth브랜치에서는 작업중이기 때문에 현재 상태에서는 앱을 빌드하면 앱이 크래시 나고, 다른 사람에게 보내주려면 정상 작동하는 main 브랜치로 돌린 후 빌드해야 하는 것을 가정한다.

 

갑자기 다른 사람에게 앱을 보여주게 되었다. main 브랜치로 전환(Switch)을 시도 하면 Stash 화면을 만나게 된다.

checkout 시도 #1
checkout 시도#2
Stash 화면

Stash는 "작업 도중의 변경 사항을 임시로 저장해두는 기능"이다. 여기서 중요한것은 미처리된 변경사항이 있는 경우 (커밋이 안된 경우) 다른 브랜치로 전환할 수 없다는것을 인지해야 한다.

Stash and Switch

기능을 어느정도 구현했지만 아직 완성되지 않아서 커밋하기 애매할 때가 있다. 그런데 이렇게 갑자기 main 브랜치로 전환 해야 한다면 작업 중인 내용을 임시저장소에 넣고, main 브랜치에서 할 일을 마친 후 본래 브랜치로 돌아와서 임시 저장했던 stash 항목을 불러와(apply) 작업을 이어 나가면 된다.

 

위에서와 같이 Stash Changes 에 메세지를 입력하고 Stash and Switch 버튼을 누르면 main 브랜치로 전환 됨을 확인 할 수 있다.

main checkout 완료

(current) 표시로 main 브랜치를 사용중 이라는 것이 확실하고, Stashed Changes 항목에 임시 저장한 변경사항도 존재 하는 것을 확인 할 수 있다. ContentView.swift 파일을 확인해 봐도 auth브랜치에서 작업한 내용들이 반영되어 있지 않고, main에서 커밋했던 마지막 소스코드로 복원 되었다.

main 브랜치 소스코드 복원

이제 main 브랜치에서 할 일이 끝나고 다시 auth 브랜치로 전환해서 작업을 이어나간다고 가정해 보자.

auth checkout 시도#1
auth checkout 시도#2

auth 브랜치로 전환 되었지만, 최종 작업하던 "로그아웃 기능 개발중" 내역이 없다.

auth 브랜치 최종 커밋 상태로 소스코드 복원

이때, Stashed Changes 항목에서 Apply Stashed Changes 를 눌러 임시 저장한 내용을 불러온다.

Apply Stashed Changes

보통 임시저장한 내용을 불러오는 용도기 때문에 Keep stash after applying 항목은 체크해제 하여 불러온 후 삭제 되도록 한다.

Keep stash after applying 체크해제

불러오기가 완료 되면 아래 처럼 임시저장되었던 코드들이 돌아오며, 본래 작업중이던 화면으로 원복된 것을 확인 할 수 있다.

작업중이던 소스코드 최종 복원 완료

auth브랜치에 존재하는 상태에서, 로그아웃 기능을 개발 완료 하고 커밋과 푸시를 완료 한다.

auth 브랜치 소스코드 및 커밋 작업 완료

이제 auth브랜치는 main 브랜치보다 3커밋 앞서(Ahead)있다. auth브랜치에서 작업 목적 이었던 로그인, 로그아웃을 모두 개발 완료 하였고 main 브랜치와 병합(Merge)만 남았다.

 

이것은 main 브랜치가 다른 브랜치를 가져와서 병합하는 개념이므로 브랜치를 우선 main 브랜치로 전환 시켜야 한다. (current) 표시를 반드시 확인 하자.

main 브랜치 current 표시 확인

main 브랜치로 병합 하려는 auth 브랜치를 우클릭 하여, Merge "auth" into "main"...를 선택 한다.

Merge "auth" into "main"
Merge

 

"auth"의 변경 사항은 현재 브랜치("main")에 병합됩니다.

안내 문구를 확인 하고 Merge 버튼을 누르면, 로컬저장소에서는 병합이 완료 된다. 로컬에서 병합이 깔끔하게 마무리 되었지만, 아직 원격저장소의 origin/main 브랜치 보다 로컬저장소의 main 브랜치가 앞서고 있는 것을 확인 할 수 있다.

main 브랜치 Ahead

이제 원격저장소(GitHub)로 Push를 하므로서 원격저장소까지 병합을 완료 시킨다.

Push 시도#1
Push 시도#2

이제 병합이 모두 완료되어 로컬저장소와 원격저장소가 동일함을 확인 할 수 있다.

Xcode에서 병합완료 확인
GitKraken에서 병합완료 확인

이제 사용용도를 다한 로컬저장소의 auth 브랜치는 삭제 하면 된다.

로컬저장소에서 auth 브랜치 삭제

GitHub를 접속해 원격저장소 입장에서도 auth 브랜치를 삭제 진행 한다.

원격저장소에서 auth 브랜치 삭제