[Git] Git Pull 시 need to specify how to reconcile them
2023. 3. 19. 18:50ㆍDevelopers 공간 [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 용어>
- 관계 (전제조건)
- 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
- fast-forward(ff) 관계 : History가 포함관계 일 때
- 상황별 방법
- 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
- fast-forward(ff) Merge : ff 관계인 경우 ff 형태로 ①commit을 만들지 않고 ②branch의 commit 참조만 바뀐다.
- 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
- Merge 기본 방식(Three-way) : merge 할 때의 방법으로, ff가 아닌 형태로 ①commit을 새로 만들고 ②branch의 merge 결과를 저장합니다.
-----------------------------------------------------------------------------------------------------
2. Why? (원인)
- git pull 은 git 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
반응형
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[Bash] 현재 Linux시스템의 OS 확인하기 (0) | 2023.09.08 |
---|---|
[Jupyter] Notebook 원격에서 작업하기 (0) | 2023.04.15 |
[Python] 간단한 프로그램 Multiprocessing 만들기 (0) | 2023.03.07 |
[Bash] Process 실행 후에 시간이 지난 후 진행이 안될 때 (0) | 2023.03.07 |
[CMake] 기초 템플릿 (0) | 2023.03.01 |