git pull --rebase는 언제 사용해야합니까?


806

나는 git pull --rebase기본적으로 사용 하는 사람들 과 절대로 그것을 사용하지 않으려는 사람들을 알고 있습니다. 나는 병합과 rebasing의 차이점을 이해한다고 생각하지만, 나는 이것을 문맥에 두려고합니다 git pull. 많은 병합 커밋 메시지를보고 싶지 않거나 다른 문제가 있습니까?


1
git pull --rebase 에 대해 조언하는 사람들을위한 소스 ? 리베이스 또는 git 리베이스는 git pull --rebase 와 별도의 활동입니다 !
— przemo_li

답변:


584

당신은 git pull --rebase언제 사용해야

  • 변경 사항은 별도의 지점이 필요하지 않습니다

실제로-왜 그렇지 않습니까? 더 명확하고 커밋에 논리적 그룹 을 강요하지 않습니다 .


좋아, 나는 약간의 설명이 필요하다고 생각한다. Git에서는 아시다시피 분기 및 병합을 권장합니다. 변경 사항을 가져 오는 로컬 지점과 원격 지점은 실제로 다른 지점입니다.git pull 병합에 관한 것입니다. 매우 자주 푸시하지 않고 대개 완성 된 기능을 구성하기 전에 여러 변경 사항을 누적하므로 합리적입니다.

그러나 어떤 이유에서든이 두 지역 (원격 및 지역)이 하나의 지점 인 경우 실제로 더 나을 것이라고 생각합니다 . SVN 에서처럼. 여기 git pull --rebase가 시작됩니다. 더 이상 병합하지 않고 실제로 원격 지점에서 커밋 . 그것이 실제로 관한 것입니다.

위험한지 아닌지는 로컬 및 원격 지점을 분리 할 수없는 것으로 취급하는지의 문제입니다. 때로는 합리적입니다 (변경이 적거나 강력한 개발을 시작할 때 작은 변경으로 중요한 변경이있을 경우). 때로는 그렇지 않습니다 (일반적으로 다른 지점을 만들 때 너무 게으른 경우). 그러나 그것은 다른 질문입니다.


17
같은 지점에서 작업 할 때 유용하지만 워크 스테이션을 변경할 수 있다고 생각합니다. 한 워크 스테이션에서 변경 사항을 커밋하고 푸시 한 다음 다른 워크 스테이션에서 리베이스를 가져오고 동일한 브랜치에서 계속 작업합니다.
— Pablo Pazos

11
끌어 당기면 자동으로 리베이스되도록 Git을 설정하는 것이 좋습니다 git config --global pull.rebase preserve .
— Colin D Bennett

2
하나의 브랜치에서 작업 할 때만 pull --rebase를 사용해야한다는 데 동의하지 않습니다. 다른 상황으로 인해 불가능하지 않은 한 항상 사용해야합니다.
— Tomáš Fejfar

@P Shved ... '그러나, 어떤 이유에서든,이 두 가지 (원격과 로컬)에 하나의 브랜치가 있다면 실제로 더 나을 것이라고 생각합니다. 로컬 환경에서는 브랜치와 원격 브랜치 미러를 원산지 / 마스터로 사용할 수 있습니다. 여기에 입력을 제공해 주시겠습니까?
— Mandroid

736

"git pull --rebase"가 실제로 무엇을 의미하는지에 대한 다른 관점을 제공하고 싶습니다. 때로는 잃어버린 것 같습니다.

Subversion (또는 CVS)을 사용한 적이 있다면 "svn update"의 동작에 익숙 할 것입니다. 커밋에 대한 변경 사항이 있고 변경이 업스트림으로 인해 커밋이 실패하면 "svn update"입니다. Subversion은 업스트림 변경 사항을 귀하와 병합하여 충돌을 일으킬 수 있습니다.

Subversion이 방금 한 것은 본질적으로 "pull --rebase"였습니다. 최신 버전을 기준으로 로컬 변경 사항을 재구성하는 작업은 "변경된"부분입니다. 실패한 커밋 시도 전에 "svn diff"를 수행 한 후 결과 diff를 "svn diff"의 출력과 비교 한 경우 두 diff의 차이는 리베이스 작업이 수행 한 작업입니다.

이 경우 Git과 Subversion의 주요 차이점은 Subversion에서 "귀하의"변경 사항은 작업 복사본에서 커밋되지 않은 변경 사항으로 만 존재하지만 Git에서는 실제로 커밋이 로컬에 있다는 것입니다. 다시 말해, 힘내에서 당신은 역사를 포크했습니다. 당신의 역사와 상류의 역사가 갈라졌지만 공통 조상이 있습니다.

제 생각에는, 현지 지사가 단순히 상류 지사를 반영하고 지속적으로 개발하는 일반적인 경우에는 올바른 의미는 항상 "--rebase"입니다. 왜냐하면 그것이 실제로 의미 론적으로 하고 있기 때문입니다. . 당신과 다른 사람들은 지점의 의도 된 선형 이력을 해킹하고 있습니다. 푸시 시도 이전에 다른 누군가가 푸시를 시도했다는 사실은 관련이 없으며, 이러한 타이밍 사고로 인해 역사에 병합되는 것은 비생산적인 것처럼 보입니다.

어떤 이유로 든 무언가가 지사가 될 필요성을 실제로 느낀다면 그것은 제 생각에는 다른 관심사입니다. 그러나 병합 형태로 변경 사항을 표현하려는 구체적이고 적극적인 욕구가 없다면 기본 동작은 "git pull --rebase"여야합니다.

프로젝트의 역사를 관찰하고 이해해야하는 다른 사람들을 고려하십시오. 역사가 곳곳에 수백 건의 합병으로 흩어 지길 원하십니까? 아니면 의도적 인 발산 개발 노력의 실제 합병을 나타내는 엄선 된 몇 건의 합병 만 원하십니까?


18
@MarceloCantos 분명히, git (도구)이 기본적으로 rebase되어야한다고 말하지는 않습니다. 리베이스가 본질적으로 역사를 파괴하기 때문에 위험합니다. 워크 플로 측면에서 분기를 계획하지 않고 다른 사람들이 작업중인 일부 분기를 해킹 할 때 "git pull --rebase"가 사용자의 기본 동작이어야합니다.
— scode

1
말하면 안된다는 git config --global branch.autosetupmerge always말입니까?
— Marcelo Cantos

9
@MarceloCantos 아니요; 아닙니다.) 개인적으로 autosetupmerge ast를 기본값을 true로 유지합니다 (로컬 <-> 원격 이외의 지점 사이에서 다시 네 번째로 병합하는 경우 명시 적으로 좋아합니다). 저는 인간으로서 항상 "git pull --rebase"를 일반적인 "마스터 브랜치 최신 마스터"워크 플로의 일부로 사용한다고 명시 적으로 분기하지 않는 한 병합 커밋을 만들고 싶지 않기 때문입니다.
— scode

9
@scode +1 rebase / merge 질문 으로 많은 어려움을 겪은 후 마침내 여기에 답이 있습니다.
— AgileYogi

10
이 답변은 분산되지 않은 버전 제어 시스템 사용자를 적절한 브랜치의 이점을 제대로 이해할 수있는 기회를 제공하는 대신 Git에 적용하려는 시도 일뿐입니다.
— Alexey Zimarev

211

아마도 그것을 설명하는 가장 좋은 방법은 예입니다.

  1. Alice는 주제 분기 A를 작성하고 작업합니다.
  2. Bob은 관련이없는 주제 B를 작성하고 작업합니다.
  3. 앨리스는 않습니다 git checkout master && git pull. 마스터는 이미 최신 상태입니다.
  4. 밥은 않습니다 git checkout master && git pull. 마스터는 이미 최신 상태입니다.
  5. 앨리스는 git merge topic-branch-A
  6. 밥은 git merge topic-branch-B
  7. 밥은 git push origin master앨리스 전에
  8. Alice는 git push origin master빨리 감기 병합이 아니기 때문에 거부됩니다.
  9. Alice는 오리진 / 마스터의 로그를보고 커밋이 자신과 관련이 없음을 확인합니다.
  10. 앨리스는 git pull --rebase origin master
  11. Alice의 병합 커밋이 풀리고 Bob의 커밋이 풀리고 Alice의 커밋이 Bob의 커밋 후에 적용됩니다.
  12. Alice는 그렇습니다. git push origin master모든 사람들은 앞으로 로그를 볼 때 쓸모없는 병합 커밋을 읽을 필요가 없다는 사실에 만족합니다.

병합되는 특정 분기는 예제와 관련이 없습니다. 이 예제의 마스터는 릴리스 브랜치 또는 개발자 브랜치가 될 수 있습니다. 요점은 Alice & Bob이 동시에 로컬 브랜치를 공유 원격 브랜치에 병합한다는 것입니다.


2
좋은. 나는 git co master && git pull; git checkout topic-branch-A; git rebase master; git checkout master; git merge topic-branch-A; git push origin master다른 사람의 지배가 내 앞에 밀려 나면 분명하고 반복 되는 경향이있다 . 나는 당신의 레시피에서 간결한 장점을 볼 수 있지만.
— HankCa


148

git pull --rebase같은 지점에서 다른 사람들과 공동 작업 할 때 사용해야한다고 생각합니다 . 작업 → 커밋 → 작업 → 커밋주기에 있으며 작업을 푸시하기로 결정하면 동일한 브랜치에 병렬 작업이 있기 때문에 푸시가 거부됩니다. 이 시점에서 나는 항상 을 pull --rebase. 스쿼시 (커밋을 평평하게하기 위해)를 사용하지 않지만 추가 병합 커밋을 피하기 위해 rebase합니다.

Git 지식이 증가함에 따라 내가 사용했던 다른 버전 제어 시스템보다 역사를 훨씬 더 많이 찾고 있습니다. 작은 병합 커밋이 많은 경우 역사에서 일어나는 더 큰 그림의 초점을 쉽게 잃을 수 있습니다.

이것은 실제로 rebasing (*)하는 유일한 시간이며 나머지 워크 플로는 병합 기반입니다. 그러나 가장 빈번한 커미터가 이것을 수행하는 한, 역사는 결국 훨씬 더 좋아 보입니다.

(*) Git 코스를 가르치는 동안 특정 상황에서 rebasing feature 브랜치를 옹호했기 때문에 학생이 나를 체포했습니다. 그리고 그는이 답을 읽었습니다.) 그러한 재분배도 가능하지만, 그것은 항상 사전에 배열 된 합의 된 시스템에 따라야하며, 따라서 항상 "적용되지 않아야"합니다. 그리고 그 당시 나는 보통 pull --rebase어느 쪽도 하지 않습니다 .


2
확실히 하나는 로그에서 병합 커밋 숨길 수있는 스크립트를 작성할 수 있습니다
— 하센

3
병합은 완전히 사소한 아니라 어떤 수단도 차이점을 포함 할 수 있습니다
— krosenvold

9
@hasen j 예. 그러나 그 합병의 내용은 중요 할 수 있습니다
— krosenvold

이 답변은 선택된 답변과 비교하여 모호하고 의견이 있습니다. "동일 지점"이란 정확히 무엇을 의미합니까? 그러나 선택한 답변에없는 몇 가지 좋은 점이 있습니다.
— iwein

1
"브랜치 (branch)"에 대한 모호함은 심판을 사용하는 방법이 너무 많기 때문에 의도적 인 것입니다. "작업 라인"은 하나의 옵션입니다.
— krosenvold 2016 년

49

나는 이유가 지금까지 생각하지 않습니다 하지 사용 pull --rebase- 내가 특별히 내 수 있도록 힘내에 코드를 추가 git pull항상 상류 커밋에 대해 리베이스에 명령을.

히스토리를 살펴볼 때 기능을 수행하는 사람 / 갈인이 언제 동기화를 중단했는지 아는 것은 결코 흥미롭지 않습니다. 그 / 그녀가하는 동안 그 / 그녀에게 유용 할 수 있지만, 그것이 바로 그 일 reflog입니다. 다른 사람들에게 소음을 추가하는 것입니다.


2
"역사를 살펴볼 때 기능을 담당하는 사람이 언제 동기화를 중단했는지 아는 것은 결코 흥미롭지 않습니다." / 그러나 이것이 중간 커밋이 빌드를 깨뜨릴 수 있음을 의미하지 않습니까?
— eglasius

10
그렇습니다. 또한 "전체 상태"도 아닙니다. 우리가 원하지 않는 이유입니다. 나는 그가 어떻게 도착했는지가 아니라 그가 원하는 것을 알고 싶다.
— 더스틴

4
경우 pull --rebase항상 사용되어야한다, 왜하지 않습니다 pull기본적으로합니까?
— straya

2
나는 당신이 당신의 자신의 의견을 형성해야 할 것을 두려워합니다. .gitconfig옵션 중 일부가 옳은 일을 할 수 있도록 몇 가지 사항 이 있습니다. git rebase와 같이 git rebase는 기본적으로 잘못된 일을한다고 생각합니다 ... 동의하지 않으면 의견을 정당화 할 필요가 없습니다.
— 더스틴

8
당신이 "상류"에서 master끌어 와서, 그리고 당신이 끌어온 지점이 아직 공개되지 않았다면 좋은 조언처럼 보입니다 . 피처 브랜치에서 다른 한편으로 피처 브랜치를 당기면 master다른 방법과 비슷합니다. 사용할 이유가 없습니다 --rebase. 이것이 기본값이 아닌 이유 일 수 있습니다. Rebases는 변경 사항이 계층의 맨 위에서 아래쪽으로 전달되는 방식이고 병합은 다시 위쪽으로 흐르는 방식이라는 것을 알았습니다. derekgourlay.com/blog/git-when-to-merge-vs-when-to-rebase
— jolvi

38

기억해라:

  • 풀 = 페치 + 병합
  • pull --rebase = 페치 + 리베이스

따라서 지점을 처리하려는 방식을 선택하십시오.

병합과 rebase의 차이점을 더 잘 알고 있습니다. :)


9

나는 그것이 개인적인 취향으로 귀결된다고 생각합니다.

변경 사항을 적용하기 전에 바보 같은 실수를 숨기고 싶습니까? 그렇다면 git pull --rebase완벽합니다. 나중에 커밋을 몇 (또는 하나) 커밋으로 스쿼시 할 수 있습니다. 푸시되지 않은 히스토리에 병합 된 경우 git rebase나중에 수행하기가 쉽지 않습니다 .

개인적으로 바보 같은 실수를 모두 게시하지 않아도되므로 리베이스 대신 병합하는 경향이 있습니다.


8
이 질문을 보는 사람에게주의하십시오.이 답변은 "git pull --rebase를 언제 사용해야합니까?"라는 질문과는 전혀 관련이 없습니다.
— therealklanni

3
@ therealklanni 나는 대답을 편집하여 질문과 관련이있는 방법을 명확하게 얻었습니다 (의도를 파괴하지 않고).
— Paŭlo Ebermann

더럽고 구조화되지 않은 작업 로그를 공유하는 것은 정직한 노력이 아니라 게으름입니다. 당신은 사람들이 당신의 토끼 개발 및 디버깅 구멍을 통해 당신을 쫓아서 시간을 낭비하고 있습니다; 엉망으로하지 말고 결과를 주라.
— 크리 시타

8

git pull --rebase공동 작업자에서 기록 재 작성을 숨길 수 있습니다 git push --force. 다른 사람이 커밋하기 전에 커밋을 푸시하는 것을 잊어 버린 경우 git pull --rebase 에만 사용하는 것이 좋습니다 .

커밋하지 않았지만 작업 공간이 깨끗하지 않은 경우 바로 git stash전에 git pull. 이렇게하면 작업 내역을 자동으로 다시 작성하지 않습니다 (일부 작업을 자동으로 삭제할 수 있음).

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