git에서 가져 오기는 pull과 어떻게 다르며 병합은 rebase와 어떻게 다릅니 까?


160

나는 이것을 이해할 수 없다. 나는 웹과 책에서 많은 것을 읽었고 뭔가가 내 머리 속에 머물러 있지 않습니다. 누군가 나에게 다음의 더미 버전을 줄 수 있습니까?

  • git fetch vs pull
  • git merge vs rebase

24
나는 질문자와 동정한다. 문서와 조언은 너무 무겁고 워크 플로우 순열이 너무 커서 혼란 스러울 수 있습니다. 머리가 터져서 무엇을 물어야할지 잘 모릅니다. 분명하지 않습니다.
Ed Randall

3
페스트로 렐라 답변을 수락 한 것으로 선택하지 않으시겠습니까?
Arashsoft

그는 2013 년 이후로 볼 수 없기 때문에 @Arashsoft
VdeX

답변:


415

페치 vs 풀

fetch 원격 * 브랜치에서 변경 사항을 다운로드하여 리포지토리 데이터를 업데이트하지만 로컬 * 브랜치는 변경하지 않습니다.

pull로컬 브랜치에 대한 변경을 fetch추가로 수행합니다 merge.

차이점이 뭐야? pull가져온 분기의 변경 사항으로 로컬 분기를 업데이트합니다. A fetch는 현지 지사를 진출시키지 않습니다.

병합 대 리베이스

다음과 같은 기록이 있습니다.

          C --- D --- E 지역
         /
    A --- B --- F --- G 리모트

merge두 개의 개발 이력을 결합합니다. 원격 브랜치에서 분기 된 후 로컬 브랜치에서 발생한 변경 사항을 재생하고 결과를 새 커밋에 기록합니다. 이 작업은 각 커밋의 조상을 유지합니다.

의 효과 merge는 다음과 같습니다.

          C --- D --- E 지역
         / \
    A --- B --- F --- G --- H 리모트

rebase로컬 브랜치에 존재하는 커밋을 가져 와서 원격 브랜치 위에 다시 적용합니다. 이 작업은 로컬 커밋의 조상을 다시 씁니다.

의 효과 rebase는 다음과 같습니다.

                  C '-D'-E '지역
                 /
    A --- B --- F --- G 리모트

차이점이 뭐야? A merge는 커밋의 조상을 변경하지 않습니다. A rebase 는 지역 커밋의 조상을 다시 작성합니다.

*이 설명은 현재 분기 로컬 지점이라고 가정하고, 분기에 인수로 지정한 fetch, pull, merge, 또는 rebase원격 지점입니다. 이것은 일반적인 경우입니다. pull예를 들어, 지정된 브랜치 에서 변경 사항을 다운로드하고 리포지토리와 현재 브랜치 merge의 변경 사항을 업데이트합니다 .


31
이것은 지금까지 각 관행에 대한 토론에 들어 가지 않고 가장 간단하고 최상의 설명입니다. 감사합니다!
Jonathan S. Fisher

3
절대적으로 황금빛 답변
ChaseMoskal

5
이 답변을 "좋아할"수 있기를 바랍니다. 어쩌면 나는 그것을 인쇄하고 내 벽에 테이프로 붙일 것입니다.
LarsH

2
나는 stackoverflow에서 얻은 최고의 답변 중 최고라고 말하고 싶습니다. 감사합니다
Shahab J

1
페치가 원격 브랜치에서 변경 사항 만 다운로드하고 리포지토리 데이터를 업데이트하지만 로컬 브랜치를 변경하지 않은 경우 작업 디렉토리가 변경 사항을 표시 / 반영하지 않으면 페치 지점은 무엇입니까? 내 질문은 원래 다른 사람의 변경 사항을 어떻게 볼 수 있는지 확인한 다음 변경 사항을 작업 디렉토리에 병합할지 여부를 결정하는 것입니다 (예 : 다른 사람들의 변경 사항을 실험하여 작업이 중단되지 않도록). 어떻게 혼란스러워? 펄과 실험 / 탐험을해야합니까, 문제가 발생한 경우 하드 리셋을 수행해야합니까?

28

페치 vs 풀

Git fetch는 repo 데이터를 업데이트하지만 git pull은 기본적으로 페치를 수행 한 다음 가져온 브랜치를 병합합니다.

'git pull'과 'git fetch'의 차이점은 무엇입니까?


병합 대 리베이스

Atlassian SourceTree 블로그, 병합 또는 리베이스에서 :

병합은 각 커밋 히스토리의 조상을 보존하면서 두 개의 개발 라인을 통합합니다.

대조적으로, rebasing은 소스 브랜치의 변경 사항을 다시 작성하여 대상 브랜치의 자식으로 표시되도록 개발 라인을 통합합니다. 이러한 커밋은 대상 브랜치 위에 모두 작성된 것처럼 효과적으로 커밋합니다.

또한 Learn Git Branching을 확인하십시오. 이 게임은 HackerNews에 게시되어 있고 ( post to link ) 많은 분기 및 병합 트릭을 가르치는 멋진 게임입니다 . 이 문제에 큰 도움이 될 것이라고 믿습니다.


감사합니다 Felips .. 그래서 원격에서 가져 오면 내 마스터 브랜치에 업데이트가 없습니까? 또한 merga보다 rebase를 더 많이해야 할 것 같습니다
techsjs2013

리베이스 대 병합은 모든 커밋 기록을 다시 작성한다는 점을 염두에두고 의도 한 바에 따라 다릅니다. 그리고 만약 당신이 페치 만한다면, 마스터 브랜치가 변경되지 않을 것입니다. 원격 변경을 적용하기 위해서는 병합 (또는 풀)해야합니다
Felipe Sabino

git merge <remote>/<branch>. 예를 들어, 마스터 브랜치이고 리모트의 이름이 origin 인 경우을 수행 할 수 있습니다 git merge origin/master.
Felipe Sabino

그래서 항상 git checkout master git fetch git diff origin / master git rebase origin master를 수행
해야하는 것처럼 들립니다.

8

풀 대 가져 오기 :

내가 이것을 이해하는 방식 git pull은 단순히 git fetch뒤에옵니다 git merge. 즉, 원격 지점에서 변경 사항을 가져 와서 현재 지점으로 병합합니다.


병합 대 rebase :

명령에 따라 병합이 수행됩니다. 현재 브랜치와 지정된 브랜치 (현재 브랜치)의 차이점을 병합합니다. 즉, 명령 git merge another_branchanother_branch현재 분기로 병합 됩니다.

리베이스는 약간 다르게 작동하며 멋지다. 명령을 수행한다고 가정 해 봅시다 git rebase another_branch. Git은 먼저 현재 분기와 사이의 최신 공통 버전을 찾습니다 another_branch. 즉, 가지가 분기되기 전의 시점입니다. 그런 다음 git은이 분기점을의 머리로 이동합니다 another_branch. 마지막으로 원래 분기 지점 이후 현재 분기의 모든 커밋은 다음과 같습니다. 이 새로운 분기점에서 재생 됩니다. 이렇게하면 분기와 병합 수가 적은 매우 깨끗한 기록이 만들어집니다.

그러나 함정이없는 것은 아닙니다! 버전 기록은 "다시 작성"되므로 커밋이 로컬 git repo에만 존재하는 경우에만 수행해야합니다. 그건: , 커밋을 원격 리포지토리로 푸시 한 경우이 작업을 수행하지 마십시오 .

주어진 리베이스에 대한 설명 온라인 서적에 이해하기 쉬운 그림과 함께 아주 좋습니다.


병합 대신 rebasing으로 당겨

실제로 실제로 rebase를 많이 사용하고 있지만 일반적으로 pull과 함께 사용됩니다.

git pull --rebase

원격 변경 사항을 가져온 다음 병합 대신 리베이스합니다. 즉, 마지막으로 풀을 수행했을 때 모든 로컬 커밋을 재생합니다. 병합을 사용하여 일반 풀을 수행하는 것보다 훨씬 깔끔하다는 것을 알았습니다.


그래서 내가 일하고 있고 지사이고 푸시하기 전에 다시 마스터로 병합하고 싶습니다. 마스터를 체크 아웃 한 다음 rebase 수정을 받아야합니까?
techsjs2013

나는 아직도 REBASE 대 스탠드 병합 아래 해달라고
techsjs2013

나는 pestrella의 대답에서 제공 한 그림이 그 차이를 매우 명확하게 보여줍니다. 또한 다음을 확인하십시오. git-scm.com/book/en/Git-Branching-Rebasing을 -설명에 꽤 괜찮은 일을합니다 (답변에있는 것과 동일한 링크이지만 게으른 것들에 대해 다시 제공됩니다).
Steinar

0

병합 -HEAD 브랜치는 각 커밋 히스토리의 조상을 유지하면서 새로운 커밋을 생성합니다. 동일한 지점에서 동시에 작업하는 여러 사람이 병합 커밋을 수행하면 기록이 오염 될 수 있습니다.

Rebase- 새로운 커밋을 만들지 않고 한 브랜치의 변경 사항을 다른 브랜치에 다시 씁니다. 코드 히스토리는 단순하고 선형 적이며 읽을 수 있지만 다른 변경 사항을 볼 수 없기 때문에 풀 요청에서는 작동하지 않습니다.

내가 사용하는 것이 git merge특징 기반의 워크 플로우를 처리 할 때 또는 내가 REBASE에 익숙하지 않은 생각합니다. 그러나 더 깨끗하고 선형적인 역사를 git rebase원한다면 더 적절합니다. 자세한 내용은 이 병합 또는 리베이스 기사 를 확인 하십시오 .

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