[Git] Git Pull 시 need to specify how to reconcile them

2023. 3. 19. 18:50Developers 공간 [Shorts]/Software Basic

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

 git pull origin master
From https://github.com/GreagerProject2/Y_frontend_web
* branch master -> FETCH_HEAD
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config —global" to set a default hint: preference for all repositories. You can also pass —rebase, —no-rebase,
hint: or —ff-only on the command line to override the configured default per hint: invocation.

 

git pull 을 했더니 위와 같은 메시지가 나오면서 pull이 되지 않습니다..

 

혹은 위 문제를 해결 하더라도 git pull 시 아래와 같은 에러가 납니다.

Fatal: Not possible to fast-forward, aborting

 

아래 더보기를 통해 자세한 용어를 참조하시는 것을 추천드립니다.

더보기

-----------------------------------------------------------------------------------------------------

<git branch merge 용어>

  1. 관계 (전제조건)
    • fast-forward(ff) 관계 : History가 포함관계 일 때
      • Branch1의 Commit history : A > B > C > D
      • Branch2의 Commit history : A > B 
    • non-ff 관계 : History가 포함관계가 아닐 때
      • Branch3의 Commit history : A > B > C
      • Branch4의 Commit history : A > B > D
  2. 상황별 방법
    • fast-forward(ff) Merge : ff 관계인 경우 ff 형태로 ①commit을 만들지 않고 ②branch의 commit 참조만 바뀐다.
      • git checkout Branch2 && git merge Branch1 
      • Branch1의 Commit history : A > B > C > D
      • Branch2의 Commit history : A > B        > D
    • no-ff Merge : ff관계 상관없이 "ff가 아닌 형태로 ①commit을 새로 만들고 ②branch의 merge 결과를 저장합니다."
      • git checkout Branch4 && git merge --no-ff Branch3
      • Branch3의 Commit history : A > B > C
      • Branch4의 Commit history : A > B > D > E
  3. Merge가 필요할 때 Merge 방법
    • Merge 기본 방식(Three-way) : merge 할 때의 방법으로, ff가 아닌 형태로 ①commit을 새로 만들고 ②branch의 merge 결과를 저장합니다.
      • git checkout Branch4 && git merge --no-ff Branch3
      • Branch3의 Commit history : A > B > C
      • Branch4의 Commit history : A > B > D > E
      • ** conflict markers : conflict가 나서 merge를 했을 때 다른 부분들을 표시해주는 방식입니다.
        <<<<<<< HEAD
            my local commit
        =======
            pulled commit
        >>>>>>> 8dcbf52aea6c16
    • Merge Rebase 방식 : merge 할 때의 방법으로,  ff 형태로 ①commit을 새로 만들고 ②branch의 merge 결과를 저장합니다. history가 깔끔합니다.
      • git checkout Branch4 && git rebase Branch3
      • Branch3의 Commit history : A > B > C
      • Branch4의 Commit history : A > B > C > D'
    • Merge Cherry-Picking 방식 : merge 할 때의 방법으로, Three-way와 같지만 모든 변동사항을 저장하는 것이 아닌 특정 commit들이 만든 변경만 현재 branch에 반영하는 경우입니다. 
      • git checkout Branch4 && git cherry-pick C
      • Branch3의 Commit history : A > B > C
      • Branch4의 Commit history : A > B > D > C+D

-----------------------------------------------------------------------------------------------------


2. Why? (원인)

  • git pullgit fetch + git merge 입니다.
  • 문제점
    • 첫번째 문제는 에러메시지가 나지 않고 위와 같이 메시지가 나온것은 새로운 commit이 발생했는데 충돌이 났고, config에 맞게 충돌을 해결해야하는데, 현재 새로운 PC에서 git pull에 대한 config 셋팅이 제대로 되어있지 않아서 그렇습니다.
    • 두번째 문제는 config 셋팅을 해주어도, fast-forward방법에 의해서는 해결을 할 수 없는 confict 상태라는 것입니다.
      (따라서 보통 어떤 것이 충돌 나기 떄문에 Error 가 난다는 메시지가 나오기 떄문에 저는 아래와 같이 미리 파일을 복사해둔 후에 아래와 같이 해결합니다.)
git fetch --all
git checkout app/lib/target_file.cpp
git pull

 


3. How? (해결책)

  • 현재 셋팅 확인 하기
    • 보통 global의 경우 ~/.gitconfig에 있으며, local 의 경우 $Project/.git/gitconfig 에 있습니다. 
    • 결과에 pull.rebase 등의 셋팅이 없는 경우 : default로는 아래와 같습니다.
# git config location check
git config --list --show-origin

# git config contest check
git config -l
git config --global --list

# to the default
git config --global pull.ff only # false | true | only
git config --global pull.rebase false # false | true | interactive | merges
  • 하나씩 셋팅 변경하기
    • pull.ff only : ff 인상황에만 merge를 합니다.
    • pull.rebase true : "pull.ff only"인상황에서는 동작을 하지 않으며, 아닌 경우 merge에 rebase를 활용하겠다는 뜻입니다.
git config pull.rebase false  # merge (the default strategy)
git config pull.rebase true   # rebase
git config pull.ff only       # fast-forward only
git config --unset pull.ff    # remove setting

 

즉, 해결방법은 위 원인에서 설명한 바와 같이 강제로 fetch 하여 conflict를 손수 해결하거나, pull.ff only 옵션을 끈다음에 merge 혹은 pull하는 방법이 있겠습니다.

 


 

728x90
반응형