git 반복되는 컨플릭트 해결하기
들어가기에 앞서
혼자서 깃을 사용하는거라면 크게 문제될 것이 없겠지만 다른 사람과 협엽을 하는거라면 컨플릭트에 대한 문제를 생각하지 않을 수가 없다. 물론 컨플릭트가 발생해도 커뮤니케이션을 통해서 어렵지 않게 해결할 수 있겠지만 이상하리만큼 너무 자주 발생하면 여러 부분에서 마이너스가 될 수 밖에 없다. 깃을 사용하면서 컨플릭트가 나는 이유와 주의해야할 부분들을 살펴보자.
컨플릭트 이유
깃에서 컨플릭트가 나는 이유는 간단하게 말하면 서로 다른 커밋이 같은 내용을 바라보고 있기 때문이다. 깃은 모든 기준을 커밋ID로 판단한다. 내가 작성한 2개의 커밋이라도 이 커밋이 서로 다른 브랜치에서 온 커밋이고 같은 내용을 바라보고 있다면 컨플릭트는 발생할 것이다.
이렇게만 설명하면 음.. 그렇지 라고 생각하고 끝날 수도 있을 것이다. 다른 경우들을 살펴보자.
깃에는 커밋관련해서 여러 기능들이 있다.
- 커밋 내용 수정
- 커밋 메세지 수정
- 커밋 합치기
- 커밋 분리하기
- 커밋 삭제
적은 내용외에도 정말 많은 기능들이 있다. 이런 기능들은 작업을 하면서 깃을 더 마법처럼 사용할 수 있게 도와주는 기능들이다. 사소한 실수같은 것들도 깃의 기능들을 사용하면 커밋 내용을 더럽히지 않고 깔끔하게 수정하고 정리할 수 있다.
이 처럼 깃은 지나간 커밋들도 편하게 다룰 수 있는 기능들을 많이 제공하고 있지만 여기에는 약간의 함정이 있다.
사용자 입장에서는 그저 내용이 변하고 커밋이 합쳐진 것이지만 깃의 입장에서는 이것은 단순한 변경이 아니라 삭제와 생성의 과정이다. 커밋 메세지, 내용등을 수정하면 깃은 원래 커밋에서 내용을 바꾸는 것이 아니라 해당 커밋을 삭제한 뒤 새로운 내용으로 다시 커밋을 만드는 것이다. 이 과정은 커밋이 완전히 새롭게 만들어지기 때문에 당연히 커밋 ID도 새롭게 생성된다.
이제 이 상황이 발생시키는 문제를 알아보자.
(1) 푸쉬할때의 문제
로컬에서 원격으로 푸쉬를 한 상태에서 이미 푸쉬된 커밋을 수정하면 어떻게 될까? 당연하게도 로컬과 원격이 바라보는 커밋이 다르게된다.
로컬에서 커밋을 수정하는 순간 해당 커밋은 새로운 커밋ID를 가지기 때문에 로컬은 변경된 커밋을 바라보고 원격은 기존의 커밋을 바라보게 되는 것이다. 이 상태에서 로컬에서 커밋을 추가하고 push를 할려고하면 현재 브랜치가 원격 브랜치보다 뒤에 있다고 pull을 받으라고 한다.
그렇다면 pull을 받고 진행하면 괜찮을까? 라고 했을 때 pull도 제대로 동작하지 않는다. 그냥 일반적으로는 안되고 --force를 사용해야 한다.
git push origin main --force
--force는 강제로 명령어를 실행시키는 옵션이다. 원격 브랜치를 현재 로컬 브랜치랑 강제로 일치시키는 것이다.
혼자 작업 하다가 이런일이 생기면 그냥 강제로 푸쉬를 해버리면 된다. 하지만 협업을 하고있고 여러개의 브랜치가 존재하고 여러명이 같은 브랜치를 바라보는 등의 상황이라면 강제 푸쉬는 상당히 위험할 수 있다. 그렇기 때문에 이미 푸쉬된 내용에 대한 커밋 수정은 고려를 해봐야 할 문제이다. 확실하게 문제가 없다는 확신속에서 실행해야 한다.
(2) 다른 브랜치로 머지할 때의 문제
보통 현업에서 깃을 이용해서 작업을 하게되면 내가 작업한 브랜치를 특정 브랜치로 합치는 작업들을 하게된다. 바로 실서버로 올라가는 코드들은 자주 변경될 일이 없겠지만 테스트 서버로 올라가는 코드는 코드 자체도 테스트용 코드이기 때문에 쉽게 변경이 될 수 있다. 이걸 가정하고 상황을 만들어보자.
- 내 브랜치에서 테스트용 브랜치로 머지를 시킴
- 커밋중에 오타가 포함된 커밋이 있어서 해당 커밋을 수정함
- 다시 테스트용 브랜치로 머지를 시킴
- 컨플릭트 발생..!
위와 같은 상황은 기존에 존재하는 내 코드때문에 컨플릭트가 생성되는 것이다. 당연히 위의 상황에서 내 로컬 브랜치를 push할려고 하면 위에서와 같은 이유로 push는 실패할 것이다. 그러면 push도 --force로 해야하고 다른 브랜치의 머지도 컨플릭트가 생겨서 이 문제도 해결해야 한다. 물론 위의 예제는 간단한 문제겠지만 현업에서는 그리 간단하지 않을수도 있다.
이런 상황도 잘 고려해서 커밋을 수정해야 할 것이다.
'Git' 카테고리의 다른 글
git 현재커밋과 이전커밋 합치기 (0) | 2022.10.26 |
---|---|
git 공부하기(4)_깃허브 연결하기 (0) | 2022.09.05 |
git 공부하기(3)_브랜치 사용하기 (0) | 2022.09.02 |
git 공부하기(2)_기본 사용방법 (0) | 2022.09.02 |
git 공부하기(1)_설치 및 설정 (0) | 2022.09.02 |
댓글
이 글 공유하기
다른 글
-
git 현재커밋과 이전커밋 합치기
git 현재커밋과 이전커밋 합치기
2022.10.26 -
git 공부하기(4)_깃허브 연결하기
git 공부하기(4)_깃허브 연결하기
2022.09.05 -
git 공부하기(3)_브랜치 사용하기
git 공부하기(3)_브랜치 사용하기
2022.09.02 -
git 공부하기(2)_기본 사용방법
git 공부하기(2)_기본 사용방법
2022.09.02