git pull VS git fetch vs git rebase


294

또 다른 질문 은 말했다git pullgit fetch + 와 같습니다 git merge.

그러나 git pullVS git fetch+ 의 차이점은 무엇 git rebase입니까?


2
누군가가 링크를 정리해야합니다 ... 그리고 다른 질문에 얼마나 많은 표가 있는지에 놀랐습니다.
xenoterracide

13
@xeno : 나는 그 사람들이 얼마나 많은 사람들이 가고 있는지 생각한다. "나도이 질문을했다"
bobobobo

45
언젠가는 git 문서를 읽을 시간이 있지만 그때까지는 이런 유형의 질문에 투표권을 추가합니다.
Eran Medan

답변:


336

귀하의 질문에서 실제로 git merge와 의 차이점에 대해 묻는다는 것이 분명합니다 git rebase.

당신이 일반적인 경우에 있다고 가정합시다-당신은 당신의 마스터 브랜치에서 약간의 작업을 수행했고, 당신은 또한 약간의 작업을 수행 한 원점에서 가져옵니다. 가져온 후에는 다음과 같습니다.

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

충돌이 없다고 가정하면이 시점 (git pull의 기본 동작)을 병합하면 다음과 같이 끝납니다.

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

다른 한편으로 당신은 적절한 rebase를했다면, 당신은 이것으로 끝날 것입니다 :

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

작업 트리의 내용은 두 경우 모두 동일해야합니다. 방금 다른 역사를 만들었습니다 . rebase는 히스토리를 다시 작성하여 R원래 커밋 된 위치 ( ) 대신 원래의 새 마스터 브랜치 ( )를 커밋 한 것처럼 보입니다 H. 다른 누군가가 이미 마스터 브랜치에서 가져온 경우 리베이스 접근 방식을 사용해서는 안됩니다.

마지막으로 git pullconfig 매개 변수 branch.<name>.rebase를 true 로 설정하여 병합 대신 rebase를 사용하도록 지정된 분기에 대해 실제로 설정할 수 있습니다 . 를 사용하여 단일 풀에 대해서도이 작업을 수행 할 수 있습니다 git pull --rebase.


39
누군가가 이미 지사에서 뽑은 후 리베이스를하면 어떻게됩니까? 그게 레포를 깨뜨릴 까?
Didier A.

12
누군가가 당신의 마스터 지부에서 뽑았는지 어떻게 알 수 있습니까?
Frank

29
누군가 하지 않았다는 것을 확실 하지 않다면 , 그들이 가지고 있다고 가정해야합니다.
Chris Down

4
나는 당신이 원산지 / 마스터가 아닌 다른 곳에서도 변경 사항을 추진하지 않는 한, 다른 사람이 문제의 변경 사항을 가져 와서 문제를 겪지 않을 것이라고 생각했습니다. 스승님, 처음에는 재베이스 할 것이 없습니다. 경고는 실제로 X-> origin / X보다 복잡한 것이있는 경우에만 중요하지만 잘못 될 수 있습니다. 누군가 내가 간과하고있는 시나리오를 알고 있다면 공유하십시오.
neverfox

1
@SteveChambers 아니요, 결과가 아닙니다. 이 줄은 단순히 커밋 조상을 나타냅니다. 즉 A는 B의 부모입니다. Q 또는 B가 처음인지 여부에 대한 의미는 없습니다. 이러한 모든 작업은 시간이 아닌 커밋 그래프를 기반으로합니다. Rebase는 커밋 타임 스탬프가 무엇이든 상관없이 결과로 커밋을 간단히 이식합니다.
Cascabel

9

TLDR :

git pull실행처럼 git fetch다음 git merge
git pull --rebase과 같다 git fetch다음git rebase

첫 진술에 대한 답장으로

git pullgit fetch+ 와 같습니다 git merge.

"기본 모드에서 git pull은 줄임말 git fetchgit mergeFETCH_HEAD입니다."git pull 실행 git fetch지정된 파라미터 다음 호출 git merge"현재 지점으로 검색된 지점의 머리를 병합

(참고 : https://git-scm.com/docs/git-pull )


두 번째 진술 / 질문 :

'그러나 git pullVS git fetch+ 의 차이점은 무엇입니까?git rebase '

다시 같은 출처에서 :
git pull --rebase

"--rebase를 사용하면 git merge 대신 git rebase를 실행합니다."


자, 물어보고 싶다면

'사이의 차이 mergerebase'

즉, 너무 여기에 대한 답변 :
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(방법의 버전 기록을 변경의 차이가 기록)


2
"git pull --rebase"는 대부분 "git fetch then git rebase"와 같지만 항상 그런 것은 아닙니다. 어떤 상황에서는 "git pull --rebase"가 조금 더합니다. 여기에서 자주 참조되는 예를보십시오 : gitolite.com/git-pull--rebase
Daniel K.

1
답변 주셔서 감사합니다. 나는 git fetch + git rebase지금부터 명령이 작동 하는 방식을 이해합니다 . 지금부터 우리 자식 트리에 충돌이 거의 없습니다 :)
Travis Le
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.