본문 바로가기
야놀자 테크스쿨/TIL 및 문제정의, 시도, 해결법, 알게된 것

[Git] revert conflict 문제

by 노잼인간이라불립니다 2023. 7. 12.

0. 개요

 git 명령어를 가지고 놀다가 revert에서 굉장히 신기한 현상을 발견하였다. 그래서 이 내용을 기록해두고자 이 글을 적는다.

 

1. 문제와 시도

 

1번 문제.

일단 각각의 버전은 아래와 같다. 

 

1 버전:  a.txt를 만들어 hi라는 텍스트를 쓰고 저장.

2 버전: a.txt를 열어 hello라는 텍스트를 추가하고 저장.

3 버전: a.txt를 열어 say ho라는 텍스트를 추가하고 저장.

 

한 상황이다.

 

이제 revert를 이용해 1버전을 revert하려고 한다.  과연 성공할 수 있을까?

 

정답은 X이다. 충돌이 발생한다.

 

2번 문제.

일단 각각의 버전은 아래와 같다.

 

1 버전: a.txt를 생성하고 저장.

2 버전: b.txt를 생성하고 저장.

3 버전: c.txt를 생성하고 저장.

 

한 상황이다.

 

현 상황에서 1 버전을 revert하려고한다 과연 성공할 수 있을까?

 

정답은 O이다. 성공한다.

 

결과적으로 a.txt는 디렉토리에서 제거되고 b.txt와 c.txt만 남게 된다.

 

2. 깨닫게 된 점.

 사실 2번 문제에 대한 현상이 없었다면 나는 revert에 대해서 잘못 이해하고 넘어 갔을 수도 있다. 사실 나는 revert가 최근 커밋된 변경사항들만 되돌릴 수 있게하는 명령어인 줄만 알고 있었다. 알고보니 이것도 틀린건 아니지만, 내가 얕게 이해하고 있었다는 것을 알 수 있었다.

 

 revert라는 명령어는 뒤에 있는 해시코드에 해당하는 커밋을 되돌려주는 (아예 없었던 듯이) 명령어 였다. 1번 문제에서 충돌이 발생했던 이유는 처음 hi를 작성했던 커밋과 뒤에 hello와 say ho를 넣었던 버전들이 같은 파일을 수정했기 때문이다. 즉, a.txt를 만들고 hi를 작성한 것을 없에버리면 hello와 say ho를 작성했던 것들은 붕 떠버리는 것이다. 그렇기 때문에 충돌이 발생하는 것! 

 

 그리고 2번째 문제에서는 a.txt , b.txt, c.txt 를 만들면서 각각 커밋되었는데, 현재 버전에서 a.txt를 생성했던 커밋을 지우더라도 그 이후로 a.txt를 수정하거나 변경한 커밋이 없기 때문에 충돌이 발생하지 않는 것이었다. (즉 이후에 커밋들과 a.txt를 만든 커밋들과의 관계는 독립적이다.)

 

 

3. 정리

 결국엔 revert를 하기 위해서는 내가 취소한 커밋과 관련된 커밋들을 하나하나 위에서 부터 충돌나지 않게 지워줘야한다. 관련된 것이 없다면 바로 지워진다.