Gitghub Desktop으로 app.py 수정 파일을 푸시하는 도중 아래와 같은 에러 메세지가 발생했다.
'There are unresolved conflicts in the working directory.'
레포지토리에서 나혼자 내 코드를 수정하는데 깃 병합 충돌이 발생했다.
구글링해보니 아래와 같이 터미널에서 입력해주면 충돌이 해결되진 않았지만 push 되었다.
git status
git add (파일) # git add app.py
git status 입력 시 뜨는 화면:
git add app.py 입력 시 뜨는 화면:
github desktop에서 commit 한 github 화면:
충돌이 그대로 push 된 상황
그렇다면 Git 병합 충돌이 뭘까?
1. Git 병합 충돌이란?
Git을 사용하여 여러 사람이 동시에 같은 코드를 수정할 때, 서로 다른 브랜치(branch)에서 동일한 파일의 동일한 부분을 변경하면 병합 충돌이 발생한다. Git은 대부분의 변경 사항을 자동으로 병합할 수 있지만, 이러한 충돌 상황에서는 어떤 변경 사항을 적용해야 할지 알 수 없기 때문에 개발자에게 충돌을 알리고 수동으로 해결하도록 한다.
* 1.1 나 혼자 코드를 수정하는데 충돌이 발생한 원인은 무엇일까?
충돌이 발생한 이유는 여러 가지가 있을 수 있지만, 혼자 코드를 수정하고 있을 때 발생하는 충돌의 일반적인 원인은 다음과 같다:
1. 브랜치 간 작업:
- 혼자 작업하더라도 여러 브랜치에서 작업하고, 그 브랜치들을 병합(merge)할 때 충돌이 발생할 수 있다. 예를 들어, main 브랜치에서 작업을 하다가 feature 브랜치로 전환해 다른 작업을 한 후, 다시 main 브랜치로 돌아와 병합할 때 충돌이 발생할 수 있다.
2. 이전 커밋과의 충돌:
- 한 브랜치에서 작업하다가 커밋하지 않은 상태로 다른 브랜치로 이동한 후 작업을 계속하고, 다시 원래 브랜치로 돌아와 병합하거나 작업을 이어나갈 때, 이전 변경 사항과 충돌이 발생할 수 있다.
3. 수정 내용의 누락:
- 파일을 편집한 후 커밋하지 않고, 다른 브랜치로 이동하여 같은 파일의 다른 부분을 수정한 경우, 나중에 병합 시 충돌이 발생할 수 있다.
4. 자동 병합 실패:
- Git은 일반적으로 변경 사항을 자동으로 병합할 수 있지만, 같은 파일의 동일한 부분을 수정했다면 자동으로 병합할 수 없어 충돌이 발생한다. 이 경우, Git은 충돌을 감지하고 수동으로 해결하도록 유도한다.
2. 충돌 표시자의 의미
충돌이 발생하면 Git은 해당 파일에 다음과 같은 형식으로 표시자를 추가한다:
<<<<<<< HEAD
// 현재 브랜치에서의 변경 사항
=======
// 병합하려는 브랜치에서의 변경 사항
>>>>>>> [other branch or commit identifier]
- <<<<<<< HEAD: 현재 체크아웃된 브랜치(보통 작업 중인 브랜치)의 변경 사항의 시작을 나타낸다.
- =======: 현재 브랜치의 변경 사항과 병합하려는 브랜치의 변경 사항 사이의 경계를 나타낸다.
- >>>>>>> [other branch or commit identifier]: 병합하려는 다른 브랜치 또는 커밋의 변경 사항의 끝을 나타낸다.
- [other branch or commit identifier]는 충돌이 발생한 다른 브랜치의 이름이나 커밋 해시(commit hash)를 나타낸다.
3. 예시를 통한 이해
<<<<<<< HEAD
# 텍스트 또는 이미지 생성을 위한 엔드포인트 정의
@app.post("/generate")
=======
@app.post("/chat")
>>>>>>> fa77001d*****
- <<<<<<< HEAD 아래에는 현재 브랜치에서의 변경 사항이 있다:
# 텍스트 또는 이미지 생성을 위한 엔드포인트 정의
@app.post("/generate")
- ======= 아래에는 병합하려는 다른 브랜치에서의 변경 사항이 있다:
@app.post("/chat")
- >>>>>>> fa77001d*****는 병합하려는 브랜치 또는 커밋의 식별자를 나타낸다.
이러한 충돌은 개발자가 수동으로 결정해야 한다:
- 어떤 엔드포인트를 사용할 것인지: "/generate" 또는 "/chat"
- 또는 두 변경 사항을 결합하거나 새로운 방식을 도입할 것인지
4. 충돌 해결 방법
- 파일 열기: 충돌이 발생한 파일을 텍스트 에디터 또는 IDE에서 연다.
- 충돌 부분 찾기: <<<<<<<, =======, >>>>>>> 표시를 찾는다.
- 수정 결정하기:
- 어떤 변경 사항을 유지할지 결정한다.
- 필요하다면 두 변경 사항을 결합하거나 새로운 코드를 작성한다.
- 표시자 제거하기: 선택한 코드를 남기고 충돌 표시자를 모두 제거한다.
- 저장 및 커밋하기:
- 수정된 파일을 저장한다.
- git add 명령으로 변경 사항을 스테이징하고, git commit으로 커밋한다.
결정은 현재 프로젝트의 요구 사항과 코드베이스에 따라 달라진다.
6. 충돌 방지를 위한 팁
- 자주 풀(Pull)하기: 작업을 시작하기 전에 최신 변경 사항을 가져와서 충돌 가능성을 줄인다.
- 작은 단위로 커밋하기: 변경 사항을 작은 단위로 자주 커밋하면 충돌 발생 시 해결이 용이하다.
- 의사소통 강화하기: 팀원들과 작업 내용을 공유하고 조율하여 동일한 부분을 동시에 수정하는 상황을 최소화한다.
- 코드 리뷰 활용하기: 병합 전에 코드 리뷰를 통해 잠재적인 충돌을 미리 발견하고 해결할 수 있다.
충돌 표시자들을 제거하고, 두 브랜치의 변경 사항을 통합하여 최종 코드를 아래와 같이 수정했다.
깔끔해졌다. 해결!
'🛠️ 형상관리 > Git' 카테고리의 다른 글
[Git] Fork와 Clone (3) | 2024.10.23 |
---|---|
.env 파일 / 환경 변수(environment variables) 설정 (0) | 2024.08.27 |
Git 버전 관리 실습 (0) | 2024.07.30 |
Git 기본 명령어 및 협업 워크플로우 (0) | 2024.07.30 |
[Git][MacOS] 설치 및 명령어 (0) | 2024.07.28 |