JS (Java Script)

git 에러 __ Need to specify how to reconcile divergent branches.

GABOJOK 2023. 9. 28. 23:58

상황

git에서 main 브렌치에 있던 것들을 pull한 뒤에, 작업을 하다가

다른 브렌치에 최신으로 업로드 된 내용을 확인 하기 위해서 같은 레포의 다른 브렌치를 pull 했다.

그랬더니 이런 메세지가 출력되었다. 

 

(그런데 단순히 git 에서 main을 pull 받아온 상태에서 ,

같은 레포의 다른 브렌치를 pull 해도 같은 메세지가 출력되었다.)

 

 

 

🧐

 

 

 

에러메세지

 

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.

fatal : Need to specify how to reconcile divergent branches.

 

 

 

 

힌트에 적힌  명령어가 궁금해서 찾아봤다.

 

 

 

❗️rebase

간단하게 말하면, 커밋 기록들을 바꿔줄 수 있는 기능이다. 

장점은 커밋 이력이 마치 하나의 브렌치에서 작업한 것 처럼 선형의 히스토리를 남긴다.

주의점은 다시 작업해야 하는 경우가 발생 할 수 있다. 

 

참고한 블로그

https://cross-the-line.tistory.com/20

 

[GIT] rebase 란 무엇인가?

Git Rebase 란 무엇인가 Git Rebase 란 말 그대로 base를 재설정한다는 의미로, 하나의 브랜치가 다른 브랜치에서 파생되서 나온 경우, 다른 브랜치에서 진행된 커밋을 다시 가져와서 base를 재설정하는

cross-the-line.tistory.com

 

 

그래서 아래의 명령어는 이런 의미다. 

 

git config pull.rebase true

👉  pull 할 때 마다 rebase 옵션이 적용된다.

이렇게 하면 커밋 히스토리가 더 깔끔하게 유지되고, 병합 커밋이 생성되지 않는다.

 

 

git config pull.rebase false


👉  pull 할 때 rebase 옵션이 적용되지 않는다. 

이렇게 하면 병합 커밋이 생성된다. 

 

 

 

 git config pull.ff only

👉  git pull 할 때 fast-forward 병합만 허용하도록 한다. 

 

 

 

 

👀🧐👀 fast-forward 병합이란?

현재 브렌치가 병합 대상 브렌치의 최신 커밋을 직접 포함하고 있을때 일어나는 병합 방법 이다. 

이 경우에 git은 추가적인 병합 커밋을 생성하지 않고 현재 브랜치를 최신 커밋으로 이동시킨다. 

 

 

 

 

👶🧐그렇다면 git config pull.ff only 이걸 입력하면 어떤 일이 벌어질까?🧐❓


1. 만약 현재 브랜치가 "fast-forward"로 병합할 수 있는 상태이면 (즉, 최신 커밋을 직접 포함하고 있으면), 

➡️`git pull`은 병합을 수행합니다.
    
2. 그러나 현재 브랜치가 "fast-forward"로 병합할 수 없는 상태이면 (즉, 최신 커밋을 포함하지 않으면), 

➡️`git pull`은 병합을 거부하며 오류 메시지를 표시합니다.

 

 

 

https://ramen4598.tistory.com/251\

 

[Github] conflict 해결하기

로컬에서 작업을 하다가 pull을 할 때 conflict가 발생한다. 원격 저장소의 변경사항과 로컬 저장소의 변경사항 사이에 누구를 우선적으로 반영할지 판단하기 어려워서 발생한 것 같다. conflict를 해

ramen4598.tistory.com

 

 

나의 경우 작업을 다시하는 위험성을 감수하고 싶지 않아서 rebase 기능은 쓰지 않기로 했고, 

힌트 메세지로 주었던 fast-forward 병합 기능을 허용해 보기로 했다. 



git config pull.rebase false 하고
git config pull.ff only  이렇게 한 뒤에 
다시  같은 레포에 올라온 다른 브렌치에 올라온 내용을 받기 위해
git pull origin 브렌치이름 

이렇게 해줬다. 

 


그랬더니 뜨는 에러 메세지..

fatal: Not possible to fast-forward, aborting.

 

fast-forward 병합 기능을 사용할 수 없다고 나온다. 

그래서 다시 아래의 명령어로 fast-forward 기능을 풀어주었다.

git config --unset pull.ff

 

 

그리고 또 한번  "git pull origin 브렌치이름"  시도..

 

 

또 다른 메세지..🥲

Please enter a commit message to explain why this merge is necessary,
especially if it merges an updated upstream into a topic branch.
Lines starting with '#' will be ignored, and an empty message aborts# the commit.

 

 

왜 merge가 필요한지 커밋 메세지를 남겨달라는 말인거 같은데 입력이 안되었다.

이에 대한 해결 방법으로 스텍오버플로우 에서 이런 글을 봤다.

 

1.  i 를 눌러서 입력이 가능하게 만들어 준다.   
2.  commit message 를 입력한다.
3.  esc  눌러서 메세지 입력에서 나온다.
4.  :wq 를 입력한다.
5.  enter 를 누른다

 

이 글에서는  이렇게 설명한다. 

근본적인 문제는 Git이 기본적으로 대부분의 사람들이 사용하기에는 너무 직관적이지 않은 편집기인 VI 또는 Vim을 사용한다는 것

그리고 실제 유저가 사용하는 편집기가 다르다는 것.

 

https://stackoverflow.com/questions/19085807/please-enter-a-commit-message-to-explain-why-this-merge-is-necessary-especially

 

Please enter a commit message to explain why this merge is necessary, especially if it merges an updated upstream into a topic b

I am using Git. I did a pull from a remote repo and got an error message: Please enter a commit message to explain why this merge is necessary, especially if it merges an updated upstream into a

stackoverflow.com

 

 

 

이렇게 했더니 잘 해결 되었다.!!!

몇번이나 만난 에러라 앞으로 계속 사용하게 될 git을 좀 더 이해하고 다루고 싶어서 찾아보고 정리해 두었다.

다음에 또 이 에러를 만나면 어떻게 나아가야 할지 방법을 알게 되어서 너무 기쁘다 😆😎