본문 바로가기

TIL

git pull 동기화 전략

팀프로젝트를 하는동안 팀원들이 작업한 파일이  pull request, merge 가 완료된 후 내 로컬에서 pull 을 하는 과정에서 오류가 발생했다.

 

현재 로컬과 원격 간의 커밋 반영 상황이 다른 경우 이를 동기화 하기 위해 아래 세가지 방법 중 하나를 선택하라는 경고 메세지이다.

발생했던 경고 메세지

 

☀︎ git config pull.rebase false : merge 형식으로 받아오도록 설정

☀︎ git config pull.rebase true : rebase 형식으로 받아오도록 설정

☀︎ git config pull.ff only : fast-forward only 으로 받아오도록 설정

 

■  발생 배경

원격 브랜치 dev : 커밋 A → 커밋 B

로컬 브랜치 mypage : 커밋 A → 커밋 C

커밋 A 까지 반영된 원격 브랜치 dev 를 로컬에 가져와 새 브랜치 mypage 를 파서 커밋 C를 만들었고,

원격 dev 에는 새로운 커밋 B가 생겨서 해당 커밋을 로컬 mypage 에 가져오려고 하니 발생한 상황

 

■  내가 선택한 방법

☀︎  git config pull.rebase false

git pull 실행 시 원격 dev 의 커밋 B 가 로컬 mypage 로 가져와지고 병합된 커밋 D 가 생성됨.

병합 커밋 D : Merge branch 'dev' into mypage

결과(로컬 기준) : A   C →  BD

 

■  다른 방법

☀︎ git config pull.rebase true

git pull 실행 시 로컬 mypage의 커밋 C가 원격 dev의 커밋 B 뒤로 재배치 됨

결과(로컬 기준) : A → B C'(C' 리베이스된 새 커밋)

 

☀︎ git config pull.ff only

이 경우 로컬 브랜치가 원격 브랜치의 직접적인 부모 관계일 때만 가능

B가 로컬에 반영되어 있지 않아서 이 방법은 실행 불가 

 

* fast-forward 란?

2개의 커밋 A와 B가 있을때에 커밋A에 따른 히스토리가 커밋B에 따른 히스토리에 전부 포함되어 있는 경우,2개의 커밋은 fast-forward관계이다 라던지 커밋A는 커밋B에 fast-forward한다라고 말한다.

 

fast-forward인 관계

커밋B의 히스토리에 커밋A의 히스토리가 모두 포함되어 있다.

 

참고

https://blog.naver.com/PostView.nhnblogId=parkjy76&logNo=220308638231&categoryNo=73&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView


git config pull.rebase false 으로 선택해서 pull 을 하니 아래와 같이 왜 이 merge가 필요한지 커밋메세지를 입력하라는 말이 나왔다.

이때 키보드 눌러봐도 변화가 없어서 나는 :wq 를 입력해서 빠져나왔었다. 궁금해서 검색해보니 아래 순서대로 진행하면 된다고 한다.

  1. press i (i for insert)
  2. write your merge message
  3. press esc (escape)
  4. write :wq (write & quit)
  5. then press enter

 

 

☀︎ 이후부터 원격브랜치를 내 로컬브랜치에 가져올 때 원격의 브랜치와 로컬 브랜치가 동일하지 않으면 절대 pull 을 하지 않는것을 원칙으로 하게 되었다. 

dev(원격) -> dev(로컬) 원격과 로컬의 브랜치가 동일한 상태에서 pull 을 받아와 로컬브랜치 mypage 로 다시 이동해서 로컬에서 merge 시킨 후 원격에 push 및 pr 을 생성하도록 하였고 이후부터는 위와같은 문제가 전혀 발생하지 않았다.