CodeGym /행동 /C# SELF /안전한 실험: 브랜치로 작업하기

안전한 실험: 브랜치로 작업하기

C# SELF
레벨 26 , 레슨 2
사용 가능

1. 브랜치가 무엇이고 왜 필요한가?

Git에서 branches로 작업하기는 버전 관리를 할 때 핵심적인 부분 중 하나로, 하나의 리포지토리에서 여러 개발 흐름을 병렬로 진행할 수 있게 해줍니다. 브랜치는 협업, 실험, 프로젝트의 여러 버전 관리를 훨씬 편리하게 해주는 Git의 강력한 기능입니다.

            gitGraph
            commit id: "Initial setup"
            commit id: "Add base features"
            branch feature/new-idea
            checkout feature/new-idea
            commit id: "Implement new logic"
            commit id: "Refactor the logic"
            checkout main
            commit id: "Urgent bugfix on main"
            merge feature/new-idea
            commit id: "Prepare for release"
        
기본 브랜치인 main에서 새로운 브랜치 feature/new-idea가 나와 안전하게 개발을 진행합니다. 작업이 끝나면 다시 main으로 병합합니다.

프로젝트에서 뭔가 크게 바꾸거나 위험한 실험을 하고 싶다고 해봅시다. Git이 없다면 어떻게 할까요? 아마 프로젝트 전체를 복사해서 새 폴더에서 작업했을 거예요. 결과가 마음에 들면 메인 폴더로 옮기고, 아니면 복사본을 삭제했을 겁니다.

Git의 브랜치는 같은 원리로 동작하지만 훨씬 깔끔합니다. 책을 쓰는 예로 생각해볼게요:

  1. 이미 쓴 원고가 있습니다(이게 당신의 메인 브랜치 main입니다).
  2. 대체 엔딩을 쓰고 싶습니다(새 브랜치 예: feature/new-idea 생성).
  3. 메인 텍스트를 건드리지 않고 새 엔딩을 씁니다(새 브랜치에서 작업).
  4. 새 엔딩이 더 좋다면 기존 엔딩을 대체합니다(브랜치 병합 — merge).
  5. 필요 없어진 초안은 삭제할 수 있습니다(브랜치 삭제).

2. 새 브랜치 만들기와 그 안에서 작업하기

단계 1. 브랜치 관리 메뉴를 엽니다.

IDE 상단 바에는 현재 브랜치 이름을 보여주는 위젯이 있습니다(기본값은 main). 그걸 클릭하고 + New Branch를 선택하세요.

단계 2. 새 브랜치 이름 정하기.

좋은 관행은 브랜치 이름을 해결할 작업에 맞게 짓는 것입니다. 예: feature/add-usage-examples.

브랜치를 만들면 IDE가 자동으로 그 브랜치로 전환합니다. 같은 위젯에서 새 이름을 보게 될 거예요.

단계 3. 변경사항을 적용하고 커밋하세요.

지금 당신은 자신의 "샌드박스"에 있습니다. 예를 들어 README.md 파일에 사용 예시 섹션을 추가해보세요. 변경을 하고 지난 강의에서 배운 것처럼 commit을 수행합니다.

3. 브랜치 사이 전환

사용 예시를 추가한 변경사항은 이제 안전하게 feature/add-usage-examples 브랜치에 저장되어 있습니다. 이제 기본 브랜치 main으로 돌아가서 상태를 확인해볼게요.

단계 1. 다시 현재 브랜치 이름 위젯을 클릭하세요.

단계 2. Local 또는 Recent 목록에서 main을 선택하고, 뜨는 하위 메뉴에서 Checkout을 클릭하세요.

단계 3. 결과 확인.

전환 후 README.md를 열어보면 사용 예시 섹션이 없을 거예요! 그 섹션은 다른 브랜치에 남아 있습니다. 이렇게 안정적인 main을 건드리지 않고 새 기능을 개발할 수 있습니다.

4. 브랜치 병합 (Merge)

명령 mergefeature/add-examples 브랜치의 모든 커밋(이 경우 커밋 C3)을 가져와 현재 브랜치인 main과 합쳐 새 병합 커밋을 만듭니다.

            gitGraph
            commit id: "C1"
            commit id: "C2"
            branch feature/add-examples
            checkout feature/add-examples
            commit id: "C3: Add new section"
            checkout main
            merge feature/add-examples
        

자, 당신은 feature/add-usage-examples에서 작업을 끝냈고 그 변경을 메인 프로젝트에 추가하고 싶습니다.

단계 1. 대상 브랜치로 전환하세요.

변경을 추가하고 싶은 브랜치에 있는지 확인하세요. 여기서는 main입니다.

단계 2. 병합 수행.

다시 브랜치 관리 위젯을 클릭하세요. 목록에서 변경을 가져올 브랜치(feature/add-usage-examples)를 선택하고 하위 메뉴에서 Merge feature/add-usage-examples into main을 선택하세요.

단계 3. 결과 확인.

이제 main 브랜치의 README.md에 새 사용 예시 섹션이 생겼을 거예요. 작업물을 성공적으로 메인 코드에 합쳤습니다!

5. 병합 충돌: 겁내지 마세요, 정상입니다!

가끔 브랜치를 병합할 때 충돌이 발생합니다. 이는 같은 파일의 같은 줄을 두 브랜치에서 각각 수정했을 때 생깁니다. Git은 어떤 버전이 옳은지 스스로 판단할 수 없어서 여러분의 도움이 필요합니다.

            gitGraph
            commit id: "C1: Общая база"
            branch feature/new-title
            checkout main
            commit id: "C2: Изменение в main"
            checkout feature/new-title
            commit id: "C3: Изменение в feature"
        
mainfeature/new-title 둘 다 공통 조상(C1)을 기반으로 새로운 커밋(C2, C3)을 가지고 있습니다. 이 경우 병합 시 충돌이 확실히 발생합니다.

충돌을 시뮬레이션해봅시다:

  1. 현재 브랜치가 main이고 저장되지 않은 변경사항이 없는지 확인하세요.
  2. 바로 새 브랜치 feature/new-title를 생성하되, 아직 그 브랜치로 체크아웃하지는 말라. "Checkout branch" 옵션의 체크박스가 꺼져 있는지 확인하세요.
  3. 이제 main에 있으면서 README.md의 첫 줄을 "My Awesome Project"로 바꾸고 commit하세요.
  4. feature/new-title로 전환하면 README.md의 첫 줄은 브랜치 생성 시점의 상태로 남아 있습니다. 동일한 줄을 "My Super Project"로 바꾸고 commit하세요.
  5. main으로 돌아가서 feature/new-title를 병합하세요.

이제 Git은 두 브랜치가 공통 조상으로부터 서로 다른 변경을 가지고 있음을 보고합니다. 같은 줄이 두 곳에서 다르게 바뀌었으므로 Git은 어떤 것이 정답인지 모릅니다. 충돌 해결용 창을 보여줄 거예요.

Merge Revision

여기서 보이는 것:

  • 왼쪽 (Your changes): 현재 브랜치(main)에서의 파일 버전.
  • 오른쪽 (Changes from branch...): 병합하려는 브랜치의 파일 버전.
  • 가운데 (Result): 당신이 만들어야 할 최종 파일 버전.

화살표 >><< 버튼을 눌러 한쪽 버전을 통째로 받아올 수 있습니다.

가운데 패널의 결과가 만족스럽다면 Apply를 클릭하세요. IDE가 자동으로 병합 커밋을 생성하고 충돌을 해결해줍니다.

왜 충돌이 안 났을까?

모든 단계를 따라 했는데도 충돌이 발생하지 않는 경우가 있습니다. 보통은 Git이 fast-forward merge를 수행해서 그렇습니다. 즉, 한 브랜치의 히스토리가 다른 브랜치의 이어지는 부분이라서 그냥 포인터를 앞으로 옮기는 것만으로 병합이 완료되는 상황입니다. 충돌을 확실히 만들려면 두 브랜치의 히스토리가 공통 조상에서 서로 갈라져야 합니다.

예시:

  1. main에 어떤 커밋이 있습니다(예: C1).
  2. main에서 "My Awesome Project"라는 내용으로 새로운 커밋을 만듭니다. 이제 main은 커밋 C2를 가리킵니다 (main -> C1 -> C2).
  3. 그 상태에서 feature/new-title 브랜치를 만듭니다. 새 브랜치는 C2에서 시작합니다.
  4. feature/new-title에서 "My Super Project"로 커밋을 만듭니다. 이 브랜치는 앞으로 나가 커밋 C3를 가리킵니다 (feature/new-title -> C1 -> C2 -> C3).
  5. 다시 main으로 돌아와 feature/new-title를 병합합니다.

Git은 main이 feature/new-title의 직계 조상임을 보고, main에 새 커밋이 없는 동안 feature 브랜치가 진행되었으므로 그냥 main을 C3로 "빨리감기"하면 된다고 판단합니다. 충돌이 없으니 포인터만 옮깁니다.

            gitGraph
            commit id: "C1"
            commit id: "C2"
            branch feature/new-title
            checkout feature/new-title
            commit id: "C3"
            checkout main
            merge feature/new-title
        

6. 변경 이력 보기

프로젝트에서 무슨 일이 일어나는지 이해하려면 이력을 보는 것이 유용합니다.

IDE 하단의 Git 탭을 열고 Log를 선택하세요. 모든 브랜치와 커밋을 그래픽으로 볼 수 있습니다. 어떤 브랜치가 어디서 갈라졌고 어디서 병합되었는지 한눈에 확인할 수 있습니다.

여기에서 원하는 커밋을 클릭하면 어떤 변경이 들어갔는지, 누가 언제 했는지 볼 수 있습니다. 코드의 타임머신 같은 기능이죠!

코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION