데브옵스/CI,CD

[Github] Github 사용방법 - 커밋 충돌

SparkIT 2025. 1. 23. 01:21

여러명의 개발자가 git에서 같은 브랜치에서 같은 소스코드에 대한 작업을 진행하다보면 병합이 필수적입니다. 이때 같은 소스코드를 수정하다보니 에러가 흔하게 발생하는데요. 이때 어떻게 대응해야하는지에 대해 알아보겠습니다.

 

 

commit 충돌 에러

먼저 같은 브랜치에서 작업 중인 사용자 A와 사용자 B가 존재한다고 가정합시다. 이때 A는 'README.md' 파일의 제목을 'A.md'로 수정합니다. 그리고 B도 'README.md' 파일의 제목을 'B.md'로 수정합니다. 그리고 A가 먼저 해당 내용을 commit 후 원격 레포지토리로 push합니다. 이후에 B가 해당 내용을 commit 후 원격 레포지토리로 push하면 다음과 같은 에러가 납니다.

You have divergent branches and need to specify how to reconcile them.

즉, 소스코드를 어떻게 병합할지 정하라는 뜻입니다.

 

 

해결 방식

1. Merge

로컬과 원격의 변경 사항을 합치고, 새 병합 커밋을 생성합니다.

git pull --no-rebase

// 또는

git config pull.rebase false
git pull

 

2. Rebase

로컬 변경 사항을 원격 브랜치 위로 재배치합니다.

git pull --rebase

// 또는

git config pull.rebase true
git pull

 

3. Fast-Forward Only

로컬 브랜치가 원격 브랜치에 대해 빠른 병합만 가능할 때 병합을 수행합니다.

git pull --ff-only

// 또는

git config pull.ff only
git pull

 

 

예제

1️⃣ 현재 같은 브랜치에 1번 사용자와 2번 사용자가 존재합니다. 먼저 1번 사용자가 다음과 같은 코드를 push 합니다.

# how_to_use_github

이건 1번 사용자가 작성한 글이에요

 

2️⃣ 그리고 2번 사용자가 해당 레포지토리를 그대로 pull 받은 후 아래와 같이 글을 수정합니다. 그리고 다시 push.

# how_to_use_github

이건 1번 사용자가 작성한 글이에요
이건 2번 사용자가 작성한 글이에요

 

3️⃣ 만약 이때 동시에 1번 사용자가 해당 내용을 이렇게 수정했다고 가정하겠습니다. ( 이때 1번 사용자는 2번 사용자가 코드에 '이건 2번 사용자가 작성한 글이에요'라는 글을 추가한 사실을 모릅니다 )

# how_to_use_github

이건 1번 사용자가 작성한 글이에요
이건 1번 사용자가 추가로 작성한 글이에요

이때 만약 해당 내용을 커밋 후 push하면 어떻게 될까요?

 

에러가 발생합니다.. 그 이유는 바로 원격 레포지토리에 있는 커밋과 현재 로컬 커밋이 다르기 때문에 먼저 이를 맞춰야하기 때문입니다.

 

4️⃣ 이때 사용할 수 있는 방법이 위에서 설명한 Merge, Rebase, Fast-Forward Only 중 하나를 선택하면 됩니다. 간단하게 merge 옵션을 사용하는 과정을 보여드리겠습니다.

git pull --no-rebase

위 명령어가 바로 예전 코드현재 코드를 보여주면서 새로운 코드를 새로이 커밋하게 만드는 방식입니다.

위 사진을 보면 현재 사용자인 1번 사용자가 작성한 부분은 <<<<<<< HEAD======= 사이에 존재하고

이전 사용자인 2번 사용자가 작성한 부분은 ======= 와 >>>>>>> 커밋ID 사이에 존재합니다.

여기서 우리는 아래 파란색 버튼인 병합 편집기에서 확인을 눌러서 새로운 커밋을 생성할 수 있습니다.

 

 

5️⃣ 여기서 아래에 존재하는 결과 부분이 새로이 생성되는 커밋입니다.

 

이때 아래 코드를 이렇게 새롭게 수정해서 다시 commit후 push 해보겠습니다.

# how_to_use_github

이건 1번 사용자가 작성한 글이에요
이건 2번 사용자가 작성한 글을 1번 사용자가 수정한 글이에요

 

6️⃣ 그럼 2번 사용자가 다시 원격 레포지토리 내용을 pull 받았을 때 다음과 같은 글을 확인할 수 있습니다.

# how_to_use_github

이건 1번 사용자가 작성한 글이에요
이건 2번 사용자가 작성한 글을 1번 사용자가 수정한 글이에요