[TOOL-005][기초] 브랜치로 나눠 작업하고 충돌 해결하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[TOOL-005][기초] 브랜치로 나눠 작업하고 충돌 해결하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 228회 작성일 26-08-31 21:39

본문

[이번 수업]
브랜치(branch)는 같은 저장소에서 작업 흐름을 나누는 이름표입니다. 기능 브랜치를 main에 병합하고, 같은 줄을 다르게 바꿨을 때의 충돌을 새 로컬 저장소에서 해결합니다.

[선수지식]
TOOL-004의 저장소, 작업 트리, 스테이징, 커밋 개념과 터미널의 현재 폴더 이동을 알고 있어야 합니다. Git 설치 여부는 `git --version`으로 확인하세요.

[학습목표]
1. 브랜치와 HEAD의 역할을 설명한다.
2. 새 브랜치를 만들고 안전하게 전환한다.
3. 현재 브랜치에 다른 브랜치의 변경을 병합한다.
4. 충돌 표식을 읽고 해결하거나 병합을 중단한다.

[핵심개념]
브랜치는 특정 커밋을 가리키는 이동 가능한 이름이고, HEAD는 현재 작업 중인 브랜치를 가리킵니다. `git switch -c feature/greeting`은 현재 커밋에서 새 브랜치를 만들며 곧바로 전환합니다. 이후 커밋은 그 브랜치 끝에 쌓여 main과 기능 작업을 분리합니다.

받을 브랜치로 전환한 뒤 `git merge 가져올-브랜치`를 실행합니다. 따라서 main에서 `git merge feature/greeting`을 실행합니다. main이 기능 브랜치의 조상이라면 Git은 포인터만 앞으로 옮기는 fast-forward를 할 수 있습니다. 이력이 갈라졌다면 공통 조상과 두 끝점을 비교하는 3-way 병합 커밋을 만듭니다.

같은 부분을 다르게 수정하면 Git은 충돌에서 멈춥니다. 파일의 `<<<<<<< HEAD`부터 `=======` 앞까지는 현재 브랜치 쪽, 그 아래부터 `>>>>>>>`까지는 가져오는 브랜치 쪽입니다. 내용을 편집하고 표식을 지운 뒤 `git add`하고 커밋합니다. 되돌리려면 해결 전에 `git merge --abort`를 사용합니다.

[따라하기]
빈 폴더에서 아래 공통 명령을 실행합니다. 이름과 메일 설정은 이 실습 저장소에만 적용됩니다.

```shell
mkdir git-merge-lab
cd git-merge-lab
git init -b main
git config user.name "학습자"
git config user.email "learner@example.invalid"
```

message.txt를 만듭니다. Windows PowerShell은 첫 명령, macOS·Linux는 둘째 명령을 사용하세요.

```powershell
Set-Content -Encoding utf8 message.txt "안녕하세요"
```

```shell
printf '안녕하세요\n' > message.txt
```

이제 공통 명령으로 기본 커밋과 기능 브랜치를 만듭니다.

```shell
git add message.txt
git commit -m "기본 인사 추가"
git switch -c feature/greeting
```

message.txt를 `안녕하세요, 개발자님`으로 바꿔 추가·커밋합니다. `git switch main`으로 돌아와 `반갑습니다`로 바꾸고 다시 추가·커밋합니다. 앞의 파일 작성 명령에서 문자열만 바꾸면 됩니다.

```shell
git merge feature/greeting
git status
```

예상 결과에는 `CONFLICT (content): Merge conflict in message.txt`와 `both modified: message.txt`가 나타납니다. 파일을 열어 표식까지 모두 지우고 최종 내용을 `안녕하세요, 개발자님. 반갑습니다.`로 정한 뒤 마무리합니다.

```shell
git diff
git add message.txt
git status
git commit -m "인사 충돌 해결"
git log --oneline --graph --all
```

`git diff`와 `git status`를 확인한 뒤 커밋합니다. 마지막 로그에는 갈라진 이력이 합쳐진 그래프가 보입니다.

[흔한 실수]
현재 브랜치를 확인하지 않고 반대 방향으로 병합하면 변경이 엉뚱한 브랜치에 들어갑니다. 시작 전 `git status`와 `git branch --show-current`를 확인하세요. 충돌 표식만 삭제하고 의미가 틀린 문장을 남기거나, 일부 파일을 `git add`하지 않은 채 끝났다고 생각하기도 합니다. 큰 미커밋 변경을 둔 채 병합하면 되돌리기 어려우므로 먼저 커밋하거나 안전하게 보관합니다.

[보안 주의]
충돌 해결 때 한쪽 내용을 무조건 채택하면 입력 검증·권한 확인 같은 보안 수정이 사라질 수 있습니다. 양쪽 차이와 테스트 결과를 함께 검토하세요. 비밀번호·토큰·개인정보가 포함된 파일은 커밋하지 말고, 이미 커밋했다면 단순 삭제만 믿지 말고 해당 비밀을 즉시 폐기·교체해야 합니다. 공유 저장소에서는 검토와 보호 규칙을 거치며 강제 푸시는 피하세요.

[직접 해볼 과제]
1. 서로 다른 줄을 수정한 두 브랜치를 병합해 자동 병합되는 경우와 이번 충돌 사례를 비교하세요.
2. 충돌 상태에서 `git merge --abort`로 되돌아간 뒤 다시 병합하고 다른 최종 문장으로 해결하세요.

[확인문제]
1. `git merge feature/greeting`은 어느 브랜치에서 실행해야 feature 변경이 main에 들어오나요?
2. 충돌 표식에서 HEAD 쪽은 무엇을 뜻하나요?
3. 충돌 해결 후 `git add`가 필요한 이유는 무엇인가요?

[다음 학습]
TOOL-006에서는 원격 저장소와 Pull Request를 이용해 변경을 공유하고 검토받는 흐름을 배웁니다.

[공식 참고 자료]
Git switch 공식 문서: https://git-scm.com/docs/git-switch
Git merge 공식 문서: https://git-scm.com/docs/git-merge
Pro Git 브랜치·병합 공식 장: https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
2,267
어제
5,103
최대
16,772
전체
773,321
Copyright © 소유하신 도메인. All rights reserved.