2017-12-10 1 views
3

을 사용하면 다음과 같은 상황이 발생합니다. (여기서 P는 사람을 의미 함).git pull 대신

P1 및 P2는 master에서 devP1 및 devP2 자신의 분기를 만들었습니다. P2가 방금 작업을 마쳤으므로 로컬 마스터와 병합 한 다음 원격 마스터 리포지토리에 푸시합니다. 모두 괜찮습니다.

는하지만, P1도 그의 작품을 종료, 그래서 그는 다음 밀어 노력하고, 로컬 마스터와 합병, 같은 일을하고있다. 그러나 분명히 원격 주인은 자신의 로컬 마스터보다 앞서 있으며 밀어 낼 수 없습니다.

이 경우, 나는 그런 종류의 상황에서 master 브랜치를 가져 왔지만, 누군가는 최근 merge commit을 만들었 기 때문에 이것은별로 좋지 않다고 말했습니다. 그가 나를 잃고 내가이 상황에 그런 종류의에 어떻게해야 해요 이해할 수 없었던 경우

는 그입니다. 누군가 나에게 여기서 무엇을해야하는지 설명 할 수 있습니까? 어떤 종류의 rebase가있을 수 있습니까? 하지만 원격 지점을 올바르게 리베이스 할 수는 없습니까?

도움과 설명에 감사드립니다. 나는 이것을 어디에서도 발견 할 수 없었다. 1. 풀 마스터, 마스터에 devP1를 병합하고 마스터를 밀어 :

+0

에 대한 git fetch --all && git merge ... 또는 git pull --rebase에 대한 바로 가기입니다 변화와 함께 부드러운 rebase.- –

답변

1

나는 당신의 대담이 생각했던 대신 병합의 git rebase를 사용하여 실제로 무엇인지 생각한다. rebase가 무엇인지 보여주는 간단한 다이어그램을 살펴보십시오.

master: ... A -- B -- D 
local: ... A -- B -- C 

위의 그림은 P1 그의 작품을 밀어 시도 할 때 가지의 상태를 표현하기 위해 시도합니다. 그의 local 브랜치와 리모트 master은 모두 커밋 B까지 동일합니다. 그러나 P2master 위에 D 커밋 밀었다, 다음 P1 로컬 C를 저지했다. P1가 원격 master을 끌어 병합하고 추진한다면, 우리는 다음 다이어그램 것이다 :

master: ... A -- B -- D -- M' 
local: ... A -- B -- C -- M 

지금 우리가 local 및 원격 master 가지 모두 커밋을 병합가 볼을 (MM'로 표시) . 그러나 여기에는 대안이 있습니다. P1이를 통해 원격 master 분기에 자신의 지역 지점으로 업데이트 할 수 : 지금 여기

git checkout local 
# do a fetch if not up to date already 
# git fetch origin 
git rebase origin/master 

하면 그림은 리베이스 후 같을 것이다 것입니다 :

master: ... A -- B -- D 
local: ... A -- B -- D -- C'  (C' labelled as such because it is a new commit) 

에주의 여기에 무엇 때문에 리베이스가 완료된 경우 롤백local 사이의 가장 최근의 커밋에 대한 분기가 master이고 커밋이 B입니다.그런 다음 재생master에서 커밋합니다.이 경우 커밋은 D입니다. 마지막으로 local 분기에 고유 한 커밋을 적용합니다.이 경우 커밋 C을 커밋합니다.

git push origin master 

이이처럼 보이는 그림을 떠날 것이다 :

당신이 희망을 볼 수있는이,의 좋은 점은, 지금은 그냥 일반 git push을 할 수 P1 원격 master에 커밋 자신의 가지고 있다는 것입니다 :

이제 master 브랜치에 병합 커밋이 없습니다.

리베이스 작업은 일반적으로 브랜치 히스토리를 다시 작성하는 작업을 포함하며 재 작성중인 브랜치가 이미 공개적으로 공유 된 경우 복잡 할 수 있습니다. P2의 경우 그의 local 브랜치가 그에게만 사용되고 있다면, 브랜치를 다시 페널티하는 것은 없습니다. 원격 master 브랜치는 위에서 수행 한 작업으로 다시 작성되지 않았습니다. 그러나 이것은 항상 사실 일 수는 없으며 계속 명심해야합니다.

로컬 마스터와 병합을하지 않습니다,하지만 리모트 마스터와 수
+0

고마워, 내가 뭘 찾고 있던 것 같습니다. – Rockleader01

+0

질문이 있으시면 언제든지 문의하십시오. 단일 SO 응답에서도 리베이스를 철저히 설명하는 것은 어렵습니다. –

+0

이미 rebase를 알고 있으므로 괜찮습니다. 방금이 병합 커밋을 시도하기보다는 리베이스를 사용하는 것을 고려한 "트릭"을 보지 못했습니다. – Rockleader01

0

는 지금까지 내가 아는 한, u는 두 가지 옵션이 있습니다. 2. devP2를 가져옵니다. devP1을 devP2에 리베이스하십시오. devP1을 마스터 및 oush 마스터에 병합하십시오.

편집 : P1도이 작업을 수행 할 수 있습니다. 마스터를 하드 리셋하여 원본으로 되돌립니다. 마스터를 당겨. 마스터에 devP1을 리베이스하십시오. devP1을 마스터와 푸시 마스터로 병합하십시오.

0

git fetch --all 
git merge origin/master <--no-ff> 

아니면

git fetch --all 
git rebase origin/master 

이있는 경우뿐만 아니라 pull 함께 할 수있는 작업을, 리베이스 수 규칙을 병합하고 모든 지점을 병합하고 원격 지점과 병합했지만 누군가가 밀어 넣기보다 여전히 빠르면 마지막 병합을 재설정하고 다시 수행 할 수 있습니다.

git reset --hard HEAD^ 
git merge.... 
git push origin master 

이렇게하는 방법은 여러 가지가 있습니다. 올바른 길은 없습니다. 일부 회사는 마스터에 대한 모든 변경 사항을 --no-ff와 병합해야한다는 규칙을 시행하고 일부 회사는 리베이스를 선호합니다. Botw 방법은 정확합니다, 차이점은 당신이 자식의 역사에서 말할 수있을 것입니다.

잘못 될 경우 이전 커밋을 기억할 필요가 없습니다. 언제든지 git reflog을 실행할 수 있습니다.

PS : - --hard와 리베이스 할 때 당신은 여전히 ​​당신의 마지막 지점이 커밋에 액세스 할 수 있도록 경우 뭔가 틀려서 git pull 그냥 가지 commitid 것은 "기억"해야합니다 git fetch --all && git rebase ...

+0

설명 주셔서 감사합니다. – Rockleader01