2016-10-05 5 views
1

bitbucket을 사용 중이며 git의 rebase 기능을 사용하여 문제가 발생했습니다. 간단히 말해서 rebase 할 때마다 이미 적용한 변경 사항을 다시 적용해야합니다. 아래 단계를 사용하여 문제를 재현했습니다. 그것의 단순화 된 버전이지만 결과는 동일했습니다.rebase와 함께 git workflow를 올바르게 사용하려면 어떻게해야합니까?

  1. 개발자 A는 커밋 밀어하는 자식의 repo를 만들고 contributors.txtmaster에 추가됩니다. 지금 master에는 contributors.txt 파일이 있습니다. 파일 내용은 Developer A
  2. 입니다. 개발자 A는 master에서 branch-a을 만듭니다.
  3. 개발자 B는 master에서 branch-b을 만듭니다.
  4. 개발자 A는 기여자 파일을 branch-a에 추가합니다. Developer A Developer A2
  5. 개발자 B는 참여자 개발자 A가 커밋 커밋 원격 branch-a
  6. 개발자 B에 변경 내용을 밀어 원격 branch-b에 대한 변경 사항을 밀어 Developer A Developer B
  7. 처럼 branch-b 그렇게 보이는 파일을 추가합니다.
  8. 개발자 A는 branch-amaster을 병합합니다.
  9. 개발자 B가 마스터를 체크 아웃하고 끌어 오기 때문에 로컬 마스터는 위의 8 단계에서 설명한 병합에 의해 적용된 변경 사항으로 업데이트됩니다.
  10. 개발자 B는 branch-b을 확인하고 개발자 012가 혼합 충돌을 얻습니다. 개발자 B는 고정 충돌을 추가 git add을 수행하고 git rebase --continue를 실행 Developer A Developer A2 Developer B
  11. 같은 파일이 지금 보이는 있도록
  12. 개발자 B는 병합 충돌을 해결합니다. 모든 것이 잘됩니다.
  13. 개발자 B는 로컬 및 리모컨 branch-b이 병합되었으므로 이제 branch-b을 가져옵니다. (당기기 전에 업스트림을 설정해야 함)
  14. 개발자 B가 병합 충돌을 해결하면 로컬 branch-b에 변경 사항이 적용되어 원격으로 푸시 될 수 있습니다.
  15. 개발자 B가 branch-b을 원격으로 푸시합니다. git push origin branch-b을 사용하십시오. 모든 것이 잘됩니다.
  16. 개발자 B는 branch-b에 새 파일을 만들고 커밋합니다.
  17. 개발자 B는 않습니다
    • git checkout master
    • git pull (이 마지막 풀 즉 단계 이후 변경되지 않았기 때문에 마스터가 최신 9)
    • git checkout branch-b
    • git rebase master
  18. git rebase master이 실행되면 git은 개발자 B에게 같은 충돌을 다시 해결하도록 요청합니다. 왜 이런 일이 생길까요?이미 적용된 변경 사항을 알고 다시 적용하지 않아야합니까?

이 문제를 해결하기 위해 리베이스 대신 병합을 사용할 수 있다고 생각합니다. 하지만 내가 rebase를 잘못 사용하고있는 것 같습니다. 내가 뭘 잘못하고 있는지 알려주십시오.

답변

1

13 단계 후에 git push origin branch-b --force을 수행 할 수 있어야합니다. 이렇게하면 리베이스 된 버전이 branch-b으로 리모컨으로 전송되며 마스터의 맨 위에 리베이스되기 때문에 아무 문제없이 마스터와 병합 할 수 있어야합니다.

이전 방법의 문제점은 master의 맨 위에 rebase 한 후에 master의 맨 위에 리베이스되지 않은 origin/branch-b에 병합 커밋을 추가하는 것입니다. 따라서 여전히 분기됩니다. 강제 푸시를 수행하면 리모트 분기가 리베이스 된 분기로 바뀝니다.

+0

해결책을 이해합니다. 그러나이 문제에 대해 분명하지 않다. 13 단계를 성공적으로 마쳤 으면 원점/지점 -b가 마스터 위에 리베이스 되었습니까? – ysfiqbl

+0

로컬 브랜치 -b가 리베이스되었지만, 리베이스 후에 아무 것도 푸시되지 않았기 때문에 origin/branch-b가 없습니다. 그래서 당신이 밀어 넣을 때 여전히 병합 충돌이 발생합니다. 밀어 넣기를 수행하면 origin/branch-b가 리베이스 된 버전으로 바뀝니다. –

+0

알겠습니다. 고마워요. 그것은 이제 완벽하게 이해됩니다. 이 워크 플로 대신 다른 워크 플로를 수행해야합니까? 내가 rebase를 사용하고 싶다면이 방법을 사용하는 것이 좋습니다. – ysfiqbl