[Git] Git을 어떻게 합치지? : Git Merging

서쿠·2024년 2월 28일
8

Git-협업

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

깃(Git)은 소프트웨어 개발에서 버전 관리를 위해 널리 사용되는 도구입니다. 여러 개발자가 동시에 다양한 기능을 개발할 때, 이들의 작업을 효율적으로 통합하기 위해서는 깃의 머징(merging)과 패스트포워딩(fast-forwarding) 기능에 대한 이해가 필수적입니다.

이 블로그 포스트에서는 머징과 패스트포워딩의 개념을 설명하고, 보편적인 예시를 통해 이를 어떻게 활용할 수 있는지 알아보겠습니다.

깃 머징(Merging)

머징은 두 개 이상의 개발 브랜치를 통합하는 과정입니다. 가장 흔한 시나리오는 기능 개발을 위한 브랜치(feature branch)에서의 작업을 메인 브랜치(main branch)로 통합하는 것입니다. 머징 과정에서는 다음과 같은 단계를 거칩니다:

  1. 목표 브랜치로 체크아웃하기: 머징할 목표 브랜치로 체크아웃합니다.
    git checkout main
  2. 머징 실행하기: 개발한 기능이 있는 브랜치를 현재 브랜치에 머징합니다.
    git merge feature-branch

머징 과정에서 충돌(conflict)이 발생할 수 있습니다. 이는 두 브랜치에서 같은 파일의 같은 부분을 수정했을 때 주로 발생합니다. 충돌이 발생하면, 깃은 개발자에게 충돌을 해결하고 머징을 완료할 것을 요청합니다.

패스트포워딩(Fast-Forwarding)

패스트포워딩은 머징의 한 형태로, 브랜치를 통합할 때 기존의 히스토리를 유지하면서 브랜치의 포인터만 최신 커밋으로 이동시키는 방법입니다. 이는 기능 브랜치에서 메인 브랜치로의 변경 사항이 선형적인 경우(즉, 메인 브랜치에서 기능 브랜치가 분기된 이후 메인 브랜치에 다른 변경 사항이 없을 때)에 가능합니다.

패스트포워딩 예시는 다음과 같습니다:

  1. 기능 브랜치에서 작업하기: feature-branch에서 새로운 기능에 대한 작업을 완료합니다.

  2. 메인 브랜치로 체크아웃하기: 작업을 통합할 메인 브랜치로 전환합니다.

    git checkout main
  3. 패스트포워딩 머징 실행하기: 메인 브랜치에서 feature-branch의 변경 사항을 패스트포워드 방식으로 머징합니다.

    git merge feature-branch

패스트포워딩이 가능한 경우, 깃은 메인 브랜치의 헤드를 feature-branch의 최신 커밋으로 이동시키고, 별도의 머지 커밋을 생성하지 않습니다. 이 방식은 히스토리를 깔끔하게 유지할 수 있어 많은 개발자가 선호합니다.

git fetch란?

git fetch 명령어는 원격 저장소의 최신 변경 사항을 로컬 저장소에 가져오는 데 사용됩니다. 이 명령어는 원격 저장소의 데이터를 로컬에 다운로드하되, 현재 작업 중인 브랜치의 코드를 자동으로 업데이트하지는 않습니다. git fetch는 원격 저장소의 상태를 확인하고, 필요한 경우 로컬 저장소의 브랜치를 원격 브랜치의 최신 상태와 동기화하기 위한 첫 단계로 사용됩니다.

사용법

git fetch 명령어를 사용하는 가장 기본적인 형태는 다음과 같습니다:

git fetch origin

여기서 origin은 기본적으로 설정된 원격 저장소의 이름입니다. 이 명령은 origin에서 변경된 모든 브랜치 정보를 로컬 저장소에 가져옵니다. 가져온 정보는 로컬의 원격 추적 브랜치에 저장되며, 이는 origin/main, origin/feature-branch 등으로 표시됩니다.

git fetch 후의 작업

git fetch를 실행한 후, 변경 사항을 현재 브랜치에 적용하려면 추가적인 명령어를 사용해야 합니다. 예를 들어, 원격 저장소의 main 브랜치에서 변경된 사항을 현재 체크아웃된 main 브랜치에 적용하고자 할 때는 다음과 같이 할 수 있습니다:

  1. 로컬 main 브랜치로 전환하기:
    git checkout main
  2. 변경 사항 머지하기:
    git merge origin/main

이 과정은 origin/main의 최신 변경 사항을 로컬의 main 브랜치에 통합합니다.

git fetchgit pull의 차이

git fetch와 비슷한 명령어로 git pull이 있습니다. git pullgit fetch를 실행한 후, 바로 git merge를 실행하여 원격 브랜치의 변경 사항을 현재 브랜치에 자동으로 머지합니다. 즉, git pullgit fetchgit merge를 한 번에 수행하는 명령어입니다.

개발자가 원격 저장소의 최신 변경 사항을 확인하고 싶지만, 즉시 현재 브랜치에 통합하고 싶지 않은 경우 git fetch를 사용하는 것이 좋습니다. 이를 통해 변경 사항을 검토하고, 필요한 경우 수동으로 머지할 수 있습니다.

체크아웃한 브랜치가 없는데?!

git fetch origingit checkout -b project1 origin/project1 명령어는 두 단계에 원격 저장소의 내용을 업데이트로 이를 브렌치로 정의하면 됩니다. 각각의 단계에 대해서 살펴보시죠.

1. git fetch origin

  • 이 명령어는 원격 저장소 origin으로부터 최신 정보를 로컬 저장소로 가져옵니다(fetch). 여기서 origin은 로컬 저장소에 등록된 원격 저장소의 기본 이름입니다.
  • git fetch는 원격 저장소의 모든 브랜치 정보를 업데이트하지만, 현재 체크아웃된 브랜치의 작업 트리나 인덱스를 변경하지 않습니다. 즉, 로컬에서 작업 중인 코드에는 영향을 주지 않고, 원격 저장소의 최신 상태만을 로컬에 반영합니다.
  • 이 과정을 통해 원격 저장소의 새로운 브랜치나 업데이트된 브랜치 정보를 로컬 저장소에 가져올 수 있습니다.

2. git checkout -b project1 origin/project1

  • 이 명령어는 project1이라는 새로운 로컬 브랜치를 생성하고, 이를 origin/project1 원격 브랜치의 최신 커밋으로 설정한 후, 해당 브랜치로 전환(checkout)합니다.
  • 여기서 git checkout -b는 새로운 브랜치를 생성하고 해당 브랜치로 전환하는 명령어입니다. project1은 생성할 새로운 로컬 브랜치의 이름이며, origin/project1은 복제(clone)하거나 업데이트(fetch)할 원격 브랜치를 지정합니다.
  • 이 과정은 특히 원격 저장소에 새로 생성되거나 업데이트된 브랜치를 기반으로 로컬에서 작업을 시작하고자 할 때 유용합니다. 새로운 브랜치 project1은 원격 브랜치 origin/project1의 상태를 그대로 반영하여 생성됩니다.

요약하면, 이 두 명령어는 원격 저장소 origin에서 project1 브랜치의 최신 상태를 로컬 저장소로 가져와(git fetch origin), 그 상태를 기반으로 새로운 로컬 브랜치 project1을 생성하고 해당 브랜치로 전환(git checkout -b project1 origin/project1)하는 작업을 수행합니다. 이러한 과정을 통해 개발자는 원격 저장소의 특정 브랜치를 기준으로 로컬에서 새로운 작업을 시작할 수 있게 됩니다.

추가 설명

git checkout -b 사용 시나리오

git checkout -b 명령어는 새로운 브랜치를 생성하고 해당 브랜치로 바로 전환하는 작업을 한 번에 수행합니다. 이 명령어는 특히 새로운 기능 개발, 버그 수정, 실험적인 시도 등을 위한 새로운 작업 브랜치를 시작할 때 유용합니다. git checkout -b 명령어의 일반적인 사용법은 다음과 같습니다:

git checkout -b [새로운 브랜치 이름]

이 명령은 현재 브랜치의 상태를 기반으로 [새로운 브랜치 이름]으로 명명된 새로운 브랜치를 생성하고, 이 새로운 브랜치로 전환(checkout)합니다.

예시: 새로운 기능 개발을 위한 브랜치 생성

예를 들어, 새로운 로그인 기능을 개발하기 위해 feature-login이라는 브랜치를 생성하고자 할 때, 다음 명령어를 사용합니다:

git checkout -b feature-login

이 명령어는 현재 위치한 브랜치(예: main 또는 develop)의 최신 상태를 기반으로 feature-login 브랜치를 생성하고, 자동으로 해당 브랜치로 전환합니다. 이로써 개발자는 새 기능에 대한 작업을 즉시 시작할 수 있습니다.

git checkout -b와 원격 브랜치

git checkout -b 명령어는 원격 브랜치를 기반으로 새로운 로컬 브랜치를 생성하고 싶을 때도 사용됩니다. 이 경우 명령어 형식은 다음과 같습니다:

git checkout -b [새로운 로컬 브랜치 이름] origin/[원격 브랜치 이름]

예를 들어, 원격 저장소에 있는 feature-login 브랜치를 기반으로 로컬에서 동일한 이름의 브랜치를 생성하려면, 다음과 같이 실행합니다:

git checkout -b feature-login origin/feature-login

이는 원격의 feature-login 브랜치 상태를 복제하여 로컬에 feature-login 브랜치를 생성하고, 해당 브랜치로 전환합니다.

profile
Always be passionate ✨
post-custom-banner

2개의 댓글

comment-user-thumbnail
2024년 3월 5일

오.. 항상 아무 생각 없이 원격 저장소로 보낼 땐 git push를 하고 당겨올 땐 git pull로만 했었는데 push는 보내는 거니까 문제가 없지만 예상치 못한 상황에서 실수로 git pull을 했을 때 로컬 브랜치들에 악영향을 끼치는 실수들이 몇 번 있었는데.. 사실 fetch의 존재는 알았지만 자세히 알려고는 하지 않았고 그냥 pull만이 정답인 줄 알았는데.. 앞으로는 fetch 먼저 하고 확인하고 수동으로 머지 해주는 습관을 가져보겠습니다🤣🤣 잘 읽고 갑니다!!

1개의 답글