2017-12-21 30 views
0

명령의 다음과 같은 세 가지 시퀀스를 수행하면 동일한 수행이 세 세트의 git 명령은 동일한 기능을 수행합니까?

명령 1 :

git fetch origin master 
git rebase origin master 

명령 2 :

git pull origin master --rebase 

명령 3 :

git fetch origin master 
git checkout FETCH_HEAD 

나의 이해는 세 명령 모두 똑같이 수행합니다. 즉,

  1. 지정된 원격 저장소의 지정된 분기에서 모든 커밋을 "다운로드"하십시오.
  2. 다운로드 된 커밋의 "맨 위에"현재 분기에서 커밋을 넣습니다.
+1

'git checkout FETCH_HEAD'는 분리 된 헤드로서'FETCH_HEAD'를 체크 아웃합니다. 새로운 커밋은 그 위에 놓이지 않습니다. – PetSerAl

+0

"git checkout FETCH_HEAD"가 무엇을하는지 이해하지 못하는 이유는 "FETCH_HEAD를 체크 아웃하는 것"이 ​​무엇을 의미하는지 이해할 수 없다는 것입니다. – Roman

답변

4

첫 번째 명령 집합에서 rebase은 의도 한 것과 다를 수 있습니다. rebase은 리모컨을 인수로 사용하지 않습니다.

(UPDATE : 어떤 상황에서 말했다 git의 Ref 같은 원격 이름을 해석하는 것이며, 그것은 심지어 당신은 내가 나 자신에 의존하지 않을의 의미를 나타냅니다 가능하지만, :.이 경우 상징적 인 참조 refs/remotes/origin/HEAD - origin의 "기본 지점"으로 해석 할 수 있으며 유효한 HEAD 참조가있는 시간에 원점을 복제하여 로컬을 생성 한 경우 일반적으로 존재합니다. originrefs/remotes/origin/HEAD이 가리키는 범위로 확장됩니다 .)

나는 너를 의미한다고 생각한다.

git rebase origin/master master 

업스트림 구성을 기반으로 작성했으며 이미 master을 체크 아웃 한 간단한 방법이 있습니다. 나는 이것이 당신이하고자하는 일이라고 가정 할 때 계속하겠습니다.

두 번째 명령은 첫 번째 명령 집합의 약식입니다.

그러나 세 번째 명령은 동일하지 않습니다. rebase은 새로운 커밋을 만들고 refs를 이동하지만 (기존 커밋 세트를 "이동"하는 것으로 나타남), checkout은 그 중 어떤 것도 수행하지 않습니다. checkout은 현재 HEAD 만 이동합니다.설명하기

,의 당신이

A -- B <--(master) 
       ^HEAD 

있다고 가정하자 기원은 당신이 rebase로 할 경우 지금

A -- B <--(master) 
\   ^(HEAD) 
    C <--(origin/master) 

를 얻을 수 있습니다 fetch 경우에 따라서

A -- C <--(master) 

있다

git rebase origin/master master 

(또는 일반적인 configuraiton 단지

git rebase 

)는

B 
/
A -- C <--(origin/master) 
     \ 
     B' <--(master) 
       ^HEAD 

하게 될 겁니다 본인은이 B' 표시되어 master에 커밋 이유를 설명하기 위해 그림에 B을 유지했다. 원래 B 커밋은 여전히 ​​존재하지만 (현재는) B'rebase에 생성 된 새로운 커밋입니다. B이 "dangling"이기 때문에 결국 가비지 수집 될 수 있습니다. 당신이 말을하는 fetch 후 대신 fetch의 경우 대신 rebase 등을하지 않으면, 당신은, 다른 한편으로

git pull --rebase origin master 

시작했다 기대할 수있는 것을이기도

git checkout FETCH_HEAD 

당신은 얻을 것

A -- B <--(master) 
\ 
    C <--(origin/master) 
    ^(HEAD) 

새 커밋 없음, 이동 참조 없음; 그냥 HEAD 변경 (그리고 당신은 분리 된 HEAD 상태입니다).

+0

"더 많든 적든간에"정확히 동일하지는 않은지 (항상 같지는 않을 수도 있음)? – Roman

+0

나는이 문장을 이해할 수 있을지 확신하지 못한다. "새로운 커밋을 생성하고 (기존 커밋 세트를"이동 "하는 것처럼 보이는) 참조를 옮긴다." 제 말은 정확히 무엇을 의미합니까? 그것은 원격 저장소에서 커밋을 복사하고 그 위에 로컬 커밋을 넣는 것입니까? – Roman

+0

@Roman - "다소 다르다"는 말은 구성 옵션과 두 가지가 동일하지 않은 특별한 상황을 허용 할 수있는 다른 요소가 있음을 의미합니다. 그러나 일상적인 사용에서는'pull --rebase '를'fetch'와'rebase'와 바꾸어 쓸 수 있습니다. –