2017-12-02 10 views
7

은 내가 git pull 이해 생각이 나는 "간단히 말해"라고 부르는에서 그것을 설명하는 방법입니다 일반적으로"git pull --rebase"를 간단하게 설명하는 방법은 무엇입니까?

  1. , git pull"로컬"로는 "원격"브랜치를 병합입니다 분기.
  2. 보다 상세히, git는 "원격"브랜치의 내용을 사용하여 "로컬"브랜치의 내용을 "업데이트"/ "수정"합니다.
  3. "local"브랜치에서 파일이 수정되었지만 "remote"브랜치에서는 수정되지 않았다면, 병합 후에 파일의 내용은 "local"브랜치의 내용과 동일 할 것입니다 "지점. 그 반대도 마찬가지입니다. 파일이 "원격"브랜치에서 수정되었지만 "로컬"브랜치에서는 수정되지 않았다면, 컨텐트는 "원격"브랜치에서 가져옵니다.
  4. 두 브랜치 ("local"과 "remote")에서 파일이 수정 된 경우 두 브랜치에서 수정을 시도하십시오. 변경 내용이 파일의 다른 위치에서 발생하면 두 변경 내용이 적용되고 병합 후에 파일의 내용에 나타납니다.
  5. 변경 사항이 같은 장소에서 발생하는 경우 "병합 충돌"로 알려진 사항이 있으며 단순화를 위해이 사례를 건드리지 않을 것입니다.
  6. 병합 결과 "로컬"리포지토리가 수정되므로 "커밋"해야합니다.

이제 git pull --rebase에 대해서도 같은 종류의 설명을하고 싶습니다. 이 용어/개념은 나 같은 초보자를 혼란시키기 때문에 "머리", "색인", "가져 오기", "상류"와 같은 용어를 사용하고 싶지 않습니다. 나는이 "진보 된"개념을 배워야한다는 것을 알고 있으며, 튜토리얼을 읽음으로써 그것을하지만 지금은 학습 과정의 일부로서 git pull --rebase을 이해하고자합니다.

나는 다음과 같은 설명을 듣고 어떤 점에서

내 생각을 덧붙였다. 작성자 : git pull --rebase. 병합 할 때 위에서 설명한 것처럼 "대칭"방식이 아닙니다. 대신, 우리는 먼저 "로컬"저장소의 변경 사항을 "잊어 버리고"원격 저장소의 변경 사항 만 적용합니다. 그렇게함으로써 우리는 기본적으로 원격 저장소를 "복사"합니다. 그런 다음 "로컬"저장소 의 변경 사항을 상단에에 적용합니다. 그러나 그것이 정확히 그것이 무엇을 의미하는지는 분명하지 않습니다. 특히, "위에"의미합니다.

+0

git pull은 git fetch와 git merge입니다. 색인과 함께 HEAD가 무엇인지 이해하는 데 실제로 도움이 될 수 있습니다. 그렇지 않으면 무언가가 계획대로 빨리 진행되지 않으면 샌드 뱅크를 치게됩니다. – rubenvb

+0

내가 질문에 썼 듯이, 나는 "가져 오기"가 무엇을 의미하는지 모른다. – Roman

+1

@Roman, 당신은 지금 ... – alexis

답변

6

다음 두 가지 사항을 명확히 할 수 있습니다 : 두 가지 분기의 파일 상태에 초점을 맞추고 있지만 발생하는 변경 집합에 대해서는 더 나은 방법을 고려해야합니다. 두 번째 문제는 git pullgit fetchgit merge의 두 작업에 대한 속기입니다. 예, "fetch"과 같은 단어는 사용하고 싶지 않지만 "고급 개념"은 아닙니다. 무슨 일이 일어나고 있는지 알고 싶으면 거기서 시작해야합니다.

  • git fetch 기본적으로 정보 용이에 대해 알고하지 않았다 변경 지역의 repo.

  • git merge은 새로 변경된 변경 사항을 로컬 변경 사항과 통합합니다.

캐치 상황이 동기화없이 모두의 repos에 발생 된 경우, 그들이 갈라 수도 있다는 것입니다 : 위의 시간은 왼쪽에서 오른쪽으로 보여줍니다

... b--o--o--o--o (remote) 
    \ 
     x--x--x  (local) 

을; 가장 오른쪽에있는 점이 가장 최근의 점입니다. 따라서 새로 도착한 변경 사항은 이전 상태 인 "b"로 표시된 파일의 수정 사항입니다.

  • git pull

    , 즉 일반 git merge, 최선이 할 수있는 두 가지의 최신 상태를 병합합니다.

  • git pull --rebase "b"로 표시된 상태가 아니라 가장 최근의 원격 상태로 변경된 것처럼 가장합니다. 그것은 다음과 같습니다 있도록 즉 그것은 역사를 다시 시도합니다 : 차이를의

    ... b--o--o--o--o    (remote) 
           \ 
            x--x--x  (local) 
    

합니다. 한 가지 결과는 rebase하지 않으면 repo 기록에 "x"변경 사항이 적용되었지만 "o"변경 사항이없는 상태 (이후에 되감기 할 수 있음)가 포함되어 있다는 것입니다. 리베이스 후 리포지토리에 해당 위치가 없습니다.

+0

매우 명확한 답변에 감사드립니다. 나는 당신이 쓴 것을 모두 이해했으며,'가져 오기 '와'rebase'가 의미하는 것을 배웠습니다. 내가 놓친 유일한 이유는 'git pull'또는'git pull --rebase'에 따라 로컬 브랜치의 내용이 달라지는지를 아는 것입니다.다시 말해, 'o-o-o'와 'x-x-x'를 병행하여 병합하여 병합하면, 먼저 'o-o-o'를 할 때와 'x-x-x'할 때와 다른 결과 (내용)를 얻을 수 있습니다. 다시 말해, 'o-o-o'및 'x-x-x'교환 작업입니까? – Roman

+0

@Roman : 사실, 이들 *이 잘 작동하지 않고 다른 결과를 얻는 경우가 있습니다. 그들은 매우 일반적인 것이 아니지만 그들은 존재합니다. 처음에는 git fetch를 실행하고, 병합을 원한다면 git merge를, rebase를 원한다면'git rebase'를 실행하십시오. 이 둘을 나누면 결정을 내리기 위해'git log '를 실행할 기회를 얻게 될뿐 아니라 진행 상황에 대한 훨씬 더 명쾌한 그림을 줄 수 있습니다. – torek

1

간편 : 작업 내용이 로컬 (푸시되지 않았 음을 의미) 인 경우 git pull --rebase은 업데이트 된 기록 위에 로컬 작업을 재생하는 역할을합니다.

git fetch은 원격 저장소의 최신 커밋 (예 : origin/master)으로 기록을 업데이트합니다.
그런 다음 업데이트 된 기록 위에 작업 (사용자의 master 브랜치의 로컬 커밋)이 하나씩 재생됩니다 (리베이스가 수행하는 것임).

푸시하기를 원하면 푸시는 매우 간단하며 커밋은 origin/master 위에서 완료된 새로운 커밋 일 뿐이므로 병합이 필요하지 않습니다. 당신이 완전히 since Git 2.6 그 REBASE 부분을 숨길 수

참고 : REBASE 잘 진행하지 않으며, 당신은 중단해야

git config pull.rebase true 
git config rebase.autoStash true 

그리고 경우에도 힘내는 since Git 2.10의 은닉 현재 작업을 복원합니다.

관련 문제