이 영역을 누르면 첫 페이지로 이동
개발다이어리 블로그의 첫 페이지로 이동

개발다이어리

페이지 맨 위로 올라가기

개발다이어리

저만의 개발일지를 만들어가는 공간입니다.

git 반복되는 컨플릭트 해결하기

  • 2022.10.27 14:55
  • 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

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • 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
다른 글 더 둘러보기

정보

개발다이어리 블로그의 첫 페이지로 이동

개발다이어리

  • 개발다이어리의 첫 페이지로 이동

검색

메뉴

  • 홈
  • Github
  • 방명록

나의 외부 링크

카테고리

  • 분류 전체보기 (66)
    • Spring (19)
      • MVC (7)
      • Boot (3)
      • Core (8)
      • Security (1)
    • Java (1)
    • 네트워크 (7)
    • JPA (6)
    • IntelliJ (2)
    • Database (1)
      • h2 (1)
      • postgreSQL (0)
    • 토이 프로젝트 (5)
      • 여행일지작성 (5)
    • 에러모음 (7)
    • 테스트코드 (2)
    • Git (8)
    • Nginx (2)
    • AWS (1)
    • 책 리뷰 (1)
    • Kotlin (2)
    • 회고 (1)
      • 24년도 회고 (1)
    • API문서 (0)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • HTTP상태코드
  • 연관관계 매핑
  • 테스트코드 실행안됨
  • 네트워크 #TCP #IP #인터넷 통신
  • HTTP
  • 단방향 매핑
  • http 헤더
  • JPA

정보

ssung의 개발다이어리

개발다이어리

ssung

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © ssung. Designed by Fraccino.

티스토리툴바