이 자식 경고를 처리하는 방법은 무엇입니까? "다양한 지점을 조정하는 방법을 지정하지 않고 가져 오는 것은 권장되지 않습니다."


167

git pull origin master다음 메시지가 나타납니다.

warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:

  git config pull.rebase false  # merge (the default strategy)
  git config pull.rebase true   # rebase
  git config pull.ff only       # fast-forward only

You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.

remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.

그런 다음 풀이 성공적으로 완료되었습니다. 하지만 여전히이 메시지에 의문이 있습니다.
이 경우 가장 좋은 방법은 무엇입니까?


1
경고가 혼란 스럽다는 버그 보고서를 제출하세요. 한 가지 옵션은 "권장"이어야하며 경고는 버전 변경이 발생했기 때문이 아니라 요청시에만 표시되어야합니다. 이 예기치 않은 동작으로 인해 많은 자동 스크립트가 이제 중단 될 수 있습니다.
Wolfgang Fahl

1
@WolfgangFahl, 경고는 명시 적으로 변경 될 때까지 기본 동작을 계속 유지하므로 스크립트에 영향을주지 않아야합니다. 풀이 0이 아닌 종료 코드를 반환하도록해서는 안됩니다 (오류가 아니라 경고 인 경우). 여러 서버에 배포 한 몇 가지 CI / CD 스크립트는 영향을받지 않고 성공률로 계속 작동합니다.
Qumber

@Qumber-의견 주셔서 감사합니다. 예를 들어 Crontab 항목은 출력이 나타나지 않거나 간단한 grep으로 필터링 될 수있는 경우 전자 메일 보내기를 시작합니다. 예기치 않은 출력은 모든 종류의 부작용을 가질 수 있습니다.
Wolfgang Fahl

@WolfgangFahl, 모든 풀에는 일반적으로 다른 출력이 있습니다. 따라서 이것에만 의존하는 스크립트는 아마도 잘못 작성되었을 것입니다. 또한 광범위한 테스트없이 프로덕션 환경을 업그레이드해서는 안됩니다. 나는 제품을 전혀 업그레이드하지 않는 것을 선호합니다. 대신 최신 모든 것이 포함 된 새 인스턴스를 만들고 거기에서 내 앱을 호스팅하고 모든 것을 테스트 한 다음 프로덕션으로 만듭니다.
Qumber

답변:


198

기본 모드에서 git pull은 git fetch와 git merge FETCH_HEAD의 약자입니다.

당신이 작업을 수행 할 때 git pull origin master,
git pull종종 병합 커밋 만드는 병합을 수행합니다. 따라서 기본적으로 원격에서 가져 오는 것은 무해한 작업이 아닙니다. 이전에 존재하지 않았던 새로운 커밋 sha를 만들 수 있습니다. 이 동작은 사용자를 혼란스럽게 할 수 있습니다. 무해한 다운로드 작업이어야한다고 느끼는 것이 실제로는 예측할 수없는 방식으로 커밋 기록을 변경하기 때문입니다.

이를 방지하려면

git pull --ff-only

(아니면? 어떤 것이 당신의 필요에 맞는지 계속 읽으십시오)

를 사용 git pull --ff-only하면 Git은 새 커밋을 생성하지 않고 "빨리 감기"할 수있는 경우에만 브랜치를 업데이트합니다. 이 작업을 수행 할 수없는 경우 git pull --ff-only오류 메시지와 함께 중단됩니다.

--ff-only기본적 으로 항상 사용하도록 Git 클라이언트를 구성 할 수 있으므로 명령 줄 플래그를 잊어 버린 경우에도이 동작이 발생합니다.

git config --global pull.ff only

참고 : --global플래그는 시스템의 모든 저장소에 대한 변경 사항을 적용합니다. 현재있는 리포지토리에 대해서만이 동작을 원하면 플래그를 생략하십시오.

여기 에서 찍은



이 경고는 Joe가 답변에서 지적했듯이 Git 2.27에서 추가되었습니다.

완전한 경고는 다음과 같습니다.

분기 된 분기를 조정하는 방법을 지정하지 않고 당기는 것은 권장되지 않습니다. 다음 가져 오기 전에 다음 명령 중 하나를 실행하여이 메시지를

억제 할 수 있습니다. git config pull.rebase false # merge (기본 전략)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only

"git config"를 "git config --global"으로 대체하여 모든 저장소에 대한 기본 환경 설정을 설정할 수 있습니다. 명령 줄에서 --rebase, --no-rebase 또는 --ff-only를 전달하여 호출마다 구성된 기본값을 재정의 할 수도 있습니다.

경고는 세 가지 명령을 옵션으로 제공하며이 모든 명령은 경고를 표시하지 않습니다. 그러나 그들은 다른 목적으로 사용됩니다.

git config pull.rebase false     # merge (the default strategy)

이렇게하면 기본 동작이 유지되고 경고가 표시되지 않습니다.

git config pull.rebase true      # rebase

이것은 실제로 원격 분기 위에서 커밋하여 로컬 및 원격에서 단일 분기를 유지합니다 (하나는 로컬에 다른 분기는 원격에있는 기본 동작과는 달리 두 가지를 결합하기 위해 병합이 수행됨). ).

git config pull.ff only          # fast-forward only

이것은 로컬 브랜치를 빨리 감을 수있는 경우에만 풀을 수행합니다. 그렇지 않은 경우 오류 메시지와 함께 중단됩니다 (커밋을 생성하지 않음).


최신 정보:

당신이 경우 Git 2.29이상, 당신은 지금 설정할 수 있습니다 pull.fffalse, true또는 only경고를 제거 할 수 있습니다.

git config pull.ff true

true-이것이 기본 동작입니다. 풀은 가능하면 빨리 감기고 그렇지 않으면 병합됩니다.

git config pull.ff false

false -당기기는 절대 빨리 감기가 아니며 항상 병합이 생성됩니다.

git config pull.ff only

only -가능한 경우 당기기를 빨리 감습니다. 그렇지 않으면 오류 메시지와 함께 작업이 중단됩니다.


9
답변에 시간과 노력을 기울여 주셔서 감사하지만 솔직히 이것은 여전히 ​​완전히 이해할 수 없습니다.
Jared Nedzel

1
여기서 언급 했듯이 경고는 분기가 실제로 분기되는지 여부에 영향을받지 않습니다 . 이니셜 "당신의 지점은 아마도 갈라지고 있습니다." 오해의 소지가 있습니다.

3
메시지의 세 가지 옵션은 메시지 를 억제하는 데 효과 가 없었 습니다. 그러나 여기에 대한 대답 ( git config --global pull.ff only) 은했다 .
DiskJunky

1
아하! 감사합니다 @Qumber. 이미 시도 pull.rebase false했지만 설명 된대로 작동하지 않았습니다. 그것은 한 항상 병합 커밋 만들고, 결코 빠르게 전달합니다. 근본 원인은 내가 merge.ff false설정을 가지고 있었기 때문 입니다. 해당 설정을 지운 후 필요할 때 빨리 감습니다. 여기 문서 ( git pull 문서와 거의 동일 )
stwr667

2
아래에 언급 한 Git 2.29 옵션을 포함 시켰습니다. 좋은 지적입니다. 찬성.
VonC

65

이것은 Git 2.27에 추가 된 새로운 경고입니다 .

 * "git pull" issues a warning message until the pull.rebase
   configuration variable is explicitly given, which some existing
   users may find annoying---those who prefer not to rebase need to
   set the variable to false to squelch the warning.

에 대한 경고를 제거하려면 원하는 기본 동작으로 제안 된 값 중 하나를 설정 git pull하면 명령 줄에서 동작을 지정하지 않은 경우 (사용 --ff, --no-ff, --ff-only, --rebase). 모든 경우에 가능 git하면 빨리 감기 ( What is git fast-forwarding? ) 병합 을 시도 합니다. 설정은 분기에 변경 사항이 있지만 원격 분기에 없는 경우 발생하는 작업을 제어합니다 .

  git config pull.rebase false  # merge (the default strategy)

이것은 기존의 기본 동작입니다. 경고 및 동작의 변화가 없도록 설정하십시오. git원격 분기를 로컬 분기로 병합합니다.

  git config pull.rebase true   # rebase

여기에서는 git원격 분기 위에 변경 사항을 다시 적용하려고 시도합니다. git pull --rebase를 언제 사용해야합니까?를 참조하십시오 . 원하는 이유에 대한 자세한 내용은

  git config pull.ff only       # fast-forward only

빨리 감기 병합이 불가능한 경우 git진행을 거부합니다. 으로 자식 풀의 차이가 --rebase와 자식 풀 --ff 전용 인용 :

현재 HEAD가 이미 최신 상태이거나 병합이 빨리 감기로 해결 될 수없는 경우 0이 아닌 상태로 병합 및 종료를 거부합니다.


20
이것은 실제로 가장 정답입니다. 왜냐하면 저와 같은 사람들이 거의 10 년 동안 git을 사용한 후 갑자기이 경고를 보는 이유를 설명하기 때문입니다. 그러나 제공된 옵션에 대한 지침이 제공되면 유용합니다. 예를 들어 pull.ff를 "only"로 설정한다고해서 "pull --rebase"를 사용하여 재정의하는 것을 막지는 않습니다.
kdopen

pull.rebase = true과 의 차이점은 무엇입니까 branch.autoSetupRebase = always?
테쿠 마라


1
"지점에 변경 사항이 있지만 원격 지점에없는 경우." 그렇다면 git은 그럴 경우 에만이 경고를 던져야한다고 생각합니다 . 내가 메인 라인을 당기고 있다면 (그리고 메인 라인이 적절하게 사용된다면) 그것에 대해 걱정할 필요가 없습니다.
Keith Tyler

5
@Joe 답변과 같은 I, 그리고 그것이 생각 올바른 대답,하지만 당신은 상관없이 자식이 실제로 있는지 여부의 참조 완료 아무것도. 나는이 경고를 발행 할 수있는 권리 시간이 자식이하는 경우하다고 생각 일을,이 메시지와 함께 실패합니다. 이 메시지를 사전에 스팸 사용자에게만 보내는 것이 아닙니다. git과의 내 사랑 / 증오 관계에 기여하는 또 다른 것.
Jon V

7

git config pull.ff only 또는 동등하게 git pull --ff-only 하게 가장 안전한 것입니다. 그 이유는 리베이스가 히스토리를 덮어 쓸 수 있고 다른 개발자가 동일한 브랜치에 강제 푸시 한 경우 커밋이 손실 될 수 있기 때문입니다.

그러나 그들 모두는 유효합니다.


3

참고 : 이전에 우리는 " git pull" ( 남자 )를 가르쳤습니다. 에게 사용자가 기록을 병합, 다시 기반 또는 빨리 감기 만 허용 할 필요가 없다고 말하지 않고 경고가 pull.ff구성 변수를 설정 한 사용자에게 트리거 될 때 경고하도록 .

이것은 더 이상 사실이 아닙니다 (의미 : Git 2.29 (2020 년 4 분기) 에서는 더 더 이상 경고 없음 ).

Alex Henrie ( )의 commit 54200ce (2020 년 9 월 24 일)를 참조하십시오 . (Merged by Junio ​​C Hamano -- in commit 299deea , 29 Sep 2020)alexhenrie
gitster

pull: pull.ff설정된 경우 경고하지 않음

서명자 : Alex Henrie

설정을 충분히 이해 한 사용자 pull.ff는 추가 지침이 필요하지 않습니다.


Git 2.31 (Q1 2021) 이전에 사용자가 " git pull" ( man ) 에게 rebase 또는 merge를 사용 하라고 말하지 않으면 이 명령은 사용자에게 rebase 또는 merge 중에서 선택하라는 큰 메시지를 제공하지만 어쨌든 병합을 생성하여 작업을 다시 실행하기 위해 rebase를 원합니다.

메시지를 제공하는 조건을 강화하여이 문제의 초기 부분을 수정합니다. 기록이 빨리 감기면 사용자가 리베이스 또는 병합 중에서 선택하도록 중지하거나 강제 할 이유가 없습니다.

참조 7539fdc 커밋 , b044db9 커밋 에 의해 (2020년 12월 14일를) Junio C 하마노 ( gitster) .
참조 c525de3 커밋 , 278f4be 커밋 , 77a7ec6 커밋 에 의해 (2020년 12월 12일) 펠리페 콘트레라스를 ( felipec) .
(Merged by Junio ​​C gitsterHamano -- in commit d3fa84d , 06 Jan 2021)

pull: ff가 아닌 경우에만 기본 경고 표시

제안자 : Junio ​​C Hamano
서명자 : Felipe Contreras

당길 때마다 성가신 경고를 표시 할 필요가 없습니다. 빨리 감기가 아닌 경고 만 표시 할 수 있습니다.

현재 경고 테스트는 여전히 통과하지만 인수 또는 구성 때문이 아니라 모두 빨리 감기 때문입니다.

빨리 감기가 아닌 상황을 지금 테스트해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.