Git 충돌을 해결하는 데에는 기본적으로 두 가지 방법이 있습니다.
Merge를 사용한 충돌 해결
두 가지 브랜치의 변경 사항을 병합하여 새로운 커밋을 만듭니다.
이때 Git은 변경 사항이 충돌할 경우 해당 부분을 마크업으로 표시합니다.
사용자는 충돌을 해결하고 다시 커밋하여 병합을 완료할 수 있습니다.
- Merge의 장점
- 커밋 히스토리가 보존되며, 원본 브랜치의 커밋 히스토리가 변경되지 않습니다.
- 상대적으로 안전하고 이해하기 쉽습니다. - Merge의 단점
- 병합 커밋이 많아질 수 있습니다.
- 병합 커밋을 추적하기 어려울 수 있습니다.
merge로 충돌 해결 하는 예시
상황
- 브랜치 feature/a에서 파일 test을 수정했습니다.
- 동시에 브랜치 feature/b에서도 파일 test을 수정했습니다.
- 이제 브랜치 feature/b를 브랜치 feature/a에 병합(merge)합니다.
1. feature/a 브랜치로 이동합니다.
git checkout feature/a
2. feature/b 브랜치를 feature/a 브랜치로 병합합니다.
git merge feature/b
3. 파일 test의 같은 줄에 대해 서로 다른 변경 내용이 있어서 충돌이 발생합니다.
Git은 다음과 같은 마크업을 사용하여 충돌 부분을 표시합니다.
<<<<<<< HEAD
코드 (feature/a에서의 변경 내용)
=======
변경된 코드 (feature/b에서의 변경 내용)
>>>>>>> feature/b
위 마크업에서 <<<<<<< HEAD부터 =======까지의 부분은 현재 브랜치(여기서는 feature/a)의 변경 내용을 나타내며,
=======부터 >>>>>>> feature/b까지의 부분은 병합하려는 브랜치(feature/b)의 변경 내용을 나타냅니다.
4. 만약 충돌을 해결하기 어렵다면 아래의 명령어로 merge를 중단합니다.
git merge --abort
5. 이제 충돌을 해결할 때 위의 마크업을 수정하고 수정 완료한 코드를 남깁니다.
6. 충돌을 해결한 후, 다음 명령을 사용하여 변경 사항을 스테이징 합니다.
git add .
7. 스테이징 한 변경 사항을 커밋합니다.
git commit -m "Merge feature/b into feature/a"
이제 충돌이 해결되었고 병합이 완료되었습니다.
Rebase를 사용한 충돌 해결
현재 브랜치의 변경 사항을 다른 브랜치에 적용하여 커밋 히스토리를 재정렬합니다.
이때 충돌이 발생하면 Git이 해당 부분을 마크업을 표시합니다.
사용자는 충돌을 해결하고 rebase를 계속 진행할 수 있습니다.
- Rebased의 장점
- 깔끔한 커밋 히스토리를 유지할 수 있습니다.
- 특정 브랜치를 기반으로 작업한 것처럼 보이게 할 수 있습니다. - Rebase의 단점
- 과거 커밋을 수정하기 때문에 주의 필요합니다.
- 충돌 해결이 복잡할 수 있습니다.
Rebase로 충돌 해결하는 예시
상황
- 브랜치 feature/a에서 파일 test을 수정했습니다.
- 동시에 브랜치 feature/b에서도 파일 test을 수정했습니다.
- 이제 브랜치 feature/b를 브랜치 feature/a에 Rebase 합니다
1. feature/b 브랜치로 이동합니다.
git checkout feature/b
2. feature/b 브랜치를 feature/a 브랜치의 기준으로 Rebase 합니다.
git rebase feature/a
3. 파일 test의 같은 줄에 대해 서로 다른 변경 내용이 있어 충돌이 발생합니다.
Git은 다음과 같은 마크업을 사용하여 충돌 부분을 표시합니다.
<<<<<<< HEAD
코드 (feature/b에서의 변경 내용)
=======
변경된 코드 (feature/a에서의 변경 내용)
>>>>>>> feature/a
여기서 <<<<<<< HEAD에서 =======까지는 feature/b 브랜치에서의 변경 내용을,
그리고 =======에서 >>>>>>> feature/a까지는 feature/a 브랜치에서의 변경 내용을 나타냅니다.
4. 충돌을 해결하기 어렵다면 아래의 명령어를 사용하여 rebase를 중단합니다.
git rebase --abort
5. 이제 충돌을 해결할 때 위의 마크업을 수정하고 수정 완료한 코드를 남깁니다.
6. 충돌을 해결한 후 다음 명령을 사용하여 변경 사항을 스테이징 합니다.
git add .
7. 다음 명령어를 사용하여 변경 사항을 커밋합니다.
git rebase --continue
이렇게 각각의 방법은 변경 사항을 가져오는 방식과 충돌을 해결하는 방식에서 약간의 차이가 있습니다.
Merge는 두 브랜치의 변경 사항을 합치는 것이고, Rebase는 현재 브랜치의 변경 사항을 다른 브랜치의 최신 상태에 기반하여 재적용하는 것입니다.
'Git' 카테고리의 다른 글
[Git] GitHub Repository에 연결하기 (0) | 2024.06.28 |
---|---|
[Git] Git의 3가지 공간 (0) | 2023.10.21 |
[Git] branch를 합치는 방법 (2) | 2023.10.15 |
[Git] 여러 branch 만들어보기 (0) | 2023.10.13 |
[Git] git reset, revert 으로 되돌아가기 (0) | 2023.10.11 |