올바른 Merge 절차 ( 왜 그 명령어를 쓰는지 완벽히 이해하기 )

방충림·2023년 3월 28일
4

Git & GitHub

목록 보기
7/8
post-thumbnail
post-custom-banner

merge를 진행하다보면 평소에 잘 하던 것도 갑자기 헷갈릴 때가 있다.
아무래도 로컬과 원격의 브랜치 이름이 똑같다보니 오는 혼란인 것 같다.
나만 그런가? 그래서 정리해봤다. 차근차근 곱씹어보자.

상황 조건

나는 main 브랜치에서 "popup"이라는 새로운 브랜치를 만들었고, popup 브랜치에서 작업을 다 한 뒤 main브랜치에 Merge 하려고 한다. 이때 명령어 사용 절차는 어떻게 되는가.
현재 나의 위치는 popup브랜치이다.

전체 명령문

(현위치 : popup 브랜치)
git fetch origin  // 원격 저장소의 최신 변경사항을 가져온다.
git merge origin/main  // 원격 저장소의 main 브랜치를 현재 브랜치에 병합한다.
(참고로 git pull은 git fetch와 git merge을 합친 명령어로, 훨씬 편리하다.)
git switch main  // main 브랜치로 이동
git merge popup  // popup 브랜치를 main 브랜치에 병합
git push origin main  // 병합한 변경사항을 리모트 저장소에 업로드

한 줄 한줄 분석해보자.

git fetch origin 는 원격 저장소의 최신 변경상태 전체를 다운로드한다. (main뿐 아니라 전부 다.)
git merge origin/main 는 가져온 원격변경상태 중에서 원격main브랜치를 로컬popup브랜치에 병합해준다.

자, 딱 여기까지 왔을 때. 생각해보자.
현재 "로컬popup브랜치"와, "로컬main브랜치" 중 어떤게 더 최신 상태일까?
그렇다. "로컬popup브랜치"이다.
로컬popup브랜치는 지금 "로컬popup브랜치의 최신상태" + "원격main브랜치의 최신 상태"를 가지고 있는 상태이다. 완전 최신 상태인 것이다.

이것을 이걸 나의 "로컬main브랜치"에 또 합쳐줄 것이다.
나의 "로컬main브랜치"에게 최신상태를 전달해주기 위함이다.

git switch main 로 "로컬main브랜치"로 이동한다.
git merge popup으로 가장 최신인 "로컬popup브랜치"와 병합해준다.

이로써 "로컬popup브랜치"와 "로컬main프랜치"모두 최신의 상태가 되었다.
이것을 이제 git push origin main로 원격 저장소에 push해주면 끝이난다.

Q1.

(현위치 : popup 브랜치)
git fetch origin  // 원격 저장소의 최신 변경사항을 가져온다.
git merge origin/main  // 원격 저장소의 main 브랜치를 현재 브랜치에 병합한다.

여기까지 했을 때 그냥 git push origin main 하면 안되는건가요?

A1.

좋은 질문입니다!

git push 명령어는 로컬 저장소에서 원격 저장소로 코드를 업로드하는 명령어입니다. 그리고 push 명령어를 실행할 때는 다음과 같이 두 개의 인수가 필요합니다.

git push <원격 저장소 이름> <로컬 브랜치 이름>:<원격 브랜치 이름>

여기서 <원격 저장소 이름>은 push를 하려는 원격 저장소의 이름입니다. <로컬 브랜치 이름>은 push를 하려는 로컬 브랜치의 이름이며, <원격 브랜치 이름>은 로컬 브랜치를 업로드할 원격 브랜치의 이름입니다.

즉, git push origin main 명령어는 현재 로컬 브랜치에서 main 브랜치로 코드를 업로드하라는 뜻입니다. 따라서 git push origin main 명령어를 실행하면, 현재 popup 브랜치에서 main 브랜치로 코드를 업로드하는 것이 아니라, 로컬 main 브랜치에서 원격 main 브랜치로 코드를 업로드하게 됩니다.

그렇기 때문에 먼저 로컬 popup 브랜치에서 main 브랜치로 병합한 후, 로컬 main 브랜치로 이동한 다음에 git push origin main 명령어를 실행해야 합니다. 이렇게 하면 로컬 main 브랜치에서 원격 main 브랜치로 코드가 업로드됩니다.

Q2.

그러면

git push origin popup:main

이렇게 하면요? 이렇게 하면 로컬 main브랜치에 굳이 한번 더 merge하지 않아도 되지 않나요?

A2.

네, 맞습니다. git push origin popup:main 명령어를 실행하면, 현재 로컬 브랜치인 popup 브랜치의 변경 사항을 원격 저장소의 main 브랜치에 바로 업로드합니다. 이 때, 로컬 main 브랜치와는 별개로 원격 저장소의 main 브랜치가 업데이트됩니다. 따라서, 로컬 main 브랜치에 별도의 merge 작업이 필요하지 않습니다.

Q3.

하지만 결국 나중에 어차피 로컬main브랜치도 쓰일 것이기 때문에 로컬main브랜치로컬popup브랜치를 merge해서 최신상태를 만들어 준 뒤, 로컬main브랜치에서 원격 main브랜치로 push해주는 건가요?

A3.

맞습니다. 일반적으로는 협업 과정에서 로컬에서 개발한 기능이나 버그 수정 등이 main 브랜치에 반영되어야 하기 때문에 로컬 main 브랜치를 최신 상태로 유지하고, 원격 저장소의 main 브랜치와도 동기화를 유지하는 것이 좋습니다.

따라서, 로컬 popup 브랜치에서 로컬 main 브랜치 merge한 뒤, 로컬 main 브랜치에서 원격 main 브랜치로 push하는 것이 일반적인 워크플로우입니다.

profile
최선이 반복되면 최고가 된다.
post-custom-banner

0개의 댓글