본문 바로가기
개발일지

Git - Divergent branches

by Peter.JH 2023. 12. 9.
728x90

문제점:

'jinjung02' 브랜치에서 git merge main 진행시'Already up to date.'라는 메시지를 출력되지만 main의 변경사항이 반영 안된다. 

 

pintos 프로젝트를 진행하며 작업량이 많아지다 보니 분업을 해서 진행하고 있었습니다. 

 

local에는 현재 'main' 브랜치 , 'jinjung02' 브랜치 두 개의 브랜치가 존재합니다. 

 

'jinjung02' 브랜치에서 작업 후에는 git에 있는 'jinjung02' 브랜치로 commit 합니다. 

 

그 후 팀원들의 동의를 받아 main 에 PR 했습니다.

 

이후 local 'main' 브랜치, 'jinjung02' 브랜치 모두 업데이트하기 위해 'jinjung02' 브랜치에서 git pull origin main 을 진행했습니다.

 

하지만 다른 팀원이 수정 후 

git checkout main
git pull origin main
git checkout jinjung02
git merge main

 

이후에도 반영이 되지 않았지만  git merge main Already up to date. 메세지가 나오는 문제가 있었습니다. 

 

이런 현상이 발생하는 이유?

 

Git에서 브랜치는 커밋들의 연속입니다. 새로운 커밋이 추가될 때마다 해당 브랜치는 새로운 커밋을 가리키게 됩니다. 이 과정에서 브랜치는 자신의 부모 커밋을 추적하게 됩니다. 두 브랜치가 분기된 이후에 각각의 브랜치에서 변경사항이 생기면, 그 변경사항은 해당 브랜치에만 존재하게 됩니다. 이 경우 브랜치를 병합하면 Git은 두 브랜치의 변경사항을 모두 포함한 새로운 커밋을 생성합니다. 하지만 `main` 브랜치의 변경사항이 `jinjung02` 브랜치에 이미 반영된 상태라면, `jinjung02`는 `main`의 모든 커밋을 이미 가지고 있는 것입니다. 이 상태에서 `jinjung02` 브랜치에서 추가로 변경사항이 생기면, 그 변경사항은 `jinjung02` 브랜치에만 존재하게 됩니다. 이런 경우, `main` 브랜치를 `jinjung02` 브랜치에 병합해도 Git은 `main` 브랜치의 변경사항이 이미 `jinjung02`에 반영되어 있으므로 병합할 내용이 없다고 판단합니다. 따라서 `git merge` 명령은 'Already up to date.'라는 메시지를 출력하게 됩니다.

 

이런 현상을 Git에서는 "분기점 이후에 발생한 변경사항이 두 브랜치에서 서로 다르게 발생한 경우(Divergent branches)"라고 합니다. `jinjung02` 브랜치에서 변경사항이 발생하면서, `main` 브랜치와 `jinjung02` 브랜치는 동일한 출발점에서 분기하게 되었지만, 각각 다른 방향으로 발전하게 된 것입니다. 이러한 현상은 브랜치가 원래의 목적에 따라 독립적으로 발전하면서 자연스럽게 발생합니다. 이 문제를 해결하기 위한 방법은 여러 가지가 있지만, 크게 두 가지 방향이 있습니다:

 

1. `main` 브랜치의 변경사항을 `jinjung02` 브랜치에 병합(merge)하거나,

2. `jinjung02` 브랜치의 변경사항을 `main` 브랜치에 병합하는 것입니다.

 

어떤 방향으로 진행할지는 원하는 결과에 따라 달라집니다. `jinjung02` 브랜치의 변경사항이 중요하다면 첫 번째 방법을, `main` 브랜치의 상태를 유지하고 싶다면 두 번째 방법을 선택하면 됩니다.

 

해결방법:

 

1. 커밋 히스토리 확인.

git log main..jinjung02
git log jinjung02..main

 

만약 두 명령어 모두 아무런 출력이 없다면, 실제로 두 브랜치는 동일한 상태라는 것을 의미합니다. 그러나 두 브랜치가 다르다면, 이 명령어들은 그 차이점을 보여줄 것입니다.

추가로, main 브랜치와 jinjung02 브랜치의 차이점이 특정 파일에서 발생하고 있다면, 해당 파일에 대해

git diff main..jinjung02 파일경로 명령어를 사용하여 두 브랜치 간의 차이점을 확인할 수도 있습니다.

 

2. `jinjung02` 브랜치를 `main` 브랜치와 동일하게 만들기

git checkout jinjung02
git reset --hard main

git push origin jinjung02 --force

 

**주의:** `git reset --hard` 명령어는 `jinjung02` 브랜치에서 `main` 브랜치로부터 분기한 이후의 모든 변경사항을 제거하므로, `jinjung02` 브랜치의 변경사항이 중요하다면 이를 백업하거나 다른 브랜치에 저장해둬야합니다. 그런 다음, 변경사항을 원격 저장소에 반영하기 위해 `push` 명령어를 사용하세요. 이 때 `--force` 옵션을 사용해야 합니다(`git push` 명령어는 기본적으로 로컬 저장소의 히스토리가 원격 저장소의 히스토리보다 앞서 있을 때만 동작하기 때문입니다)

728x90

'개발일지' 카테고리의 다른 글

pintos - Virtual Memory(1)  (0) 2023.12.14
pintos (부끄러운)실수 기록  (0) 2023.12.14
pintos - USER PROGRAMS (1)  (0) 2023.12.05
pintos - USER PROGRAMS (intro)  (0) 2023.12.04
pintos - THREADS(1)  (0) 2023.11.28