2016-09-19 3 views
14

저장소 G는 Gerrit를 통해 관리되는 github 저장소를 고려하십시오. 저장소 A를 복제했고 저장소 A의 마스터 분기에서 시작하여 새 분기를 만들었습니다.이 새 분기를 새 gitlab 저장소 B에 밀어 넣었습니다. 저장소 B의 관리자이고 다른 개발자와 공유했습니다. 개발자는이 지점을 사용할 수 없지만 요청을 병합 할 수는 있습니다. 리포지토리 B의 마스터 분기에서 일부 끌어 오기 요청을 병합했습니다. 따라서 리포지토리 B에는 리포지토리 A의 초기 커밋과 끌어 오기 요청의 새 커밋이 있습니다. B는 커밋 (b a) 위에 커밋합니다.git을 사용하여 공유 분기 저장소 업데이트

그런 다음 리포지토리 B를 새로운 리포지토리 A 커밋으로 업데이트하려고합니다. 이러한 커밋을 +라고 부릅니다.

나는 두 가지 참조 : I는 B에 병합 경우

  1. 를, 그 결과는 다음과 B A +는.
  2. A +에서 B를 리베이스하면 그 결과는 다음과 같습니다. b a + a.

옵션 1 : 개발 커밋은 외부 커밋과 섞여 있습니다. 디버깅하기가 어렵고 차이점을 강조하기가 어렵습니다.

옵션 2 : 리모컨 B에서 변경 사항을 강제 적용해야합니다. 실수하지 않으면 결과는 다음과 같을 수 있습니다. 1. 개발자가 B를 가져오고 B의 로컬 마스터에서 커밋 한 경우 그들의 현지 변화를 잃을 것이다; 2. 브랜치 B를 강제 업데이트 한 후에 개발자가 로컬 브랜치를 리베이스 할 때 큰 문제가 발생할 수 있습니다.

문제를 피하려면 어떻게해야합니까?

답변

7

내가 제대로 이해한다면, 당신은 다음과 같이 약간 보이는 하나의 (로컬) 저장소가 :

      A/master 
           ↓ 
* -- * -- * -- a -- * -- * -- a+ 
       \ 
       * -- * -- b 
          ↑ 
         B/mybranch 

: 그것은 다음과 같습니다, 그래서

  A/master 
       ↓ 
* -- * -- * -- a 
       \ 
       * -- * -- b 
          ↑ 
         B/mybranch 

지금, A가 업데이트됩니다 직선에 있지 않은 분기가 두 개인 점에 유의하십시오. 따라서 AB에 병합 할 때 a+ b a이 표시된다고 말하는 것은 올바르지 않습니다. 당신은 병합을받을 수 있나요하지만, 그대로 그 역사를 유지 :

      A/master 
           ↓ 
* -- * -- * -- a -- * -- * -- a+ 
       \    \ 
       * -- * -- b --- M 
           ↑ 
          B/mybranch 

당신이 볼 수 있듯이, 여전히 커밋에서 제공된 정보가 있습니다 aa+ 사이의 사람이 한 지점에서 온, 그리고 ab 사이의 다른 것들은 다른 것들로부터 왔습니다. M은 해당 tro 지점을 결합합니다. 일반적으로 은이를 해결하는 올바른 방법입니다.

리비전 오버의 장점은 자신이 알아 차렸 듯이 커밋이 그대로 유지된다는 것입니다. 두 저장소 중 하나와 상호 작용 한 모든 사용자는 아무런 문제없이 간단히 변경 사항을 가져올 수 있습니다. 이러한 커밋을 리베이스 한 경우 수동으로 수정해야합니다 (실제로 커밋하지 못하는 경우도 있으므로 커밋이 중복되어 더 복잡한 기록을 생성하고 실제로 만들 것입니다).

여기서 병합하는 것이 좋습니다.예, 역사는 직선처럼 완벽하게 보일 수는 없지만 일어난 일을 적절히 나타냅니다. 독립적 인 개발 라인이 있으며 업스트림 리포지토리 A의 변경 사항으로 업데이트되었습니다. 이 정보는 유용 할 수 있으므로 사용자를 유지하는 것이 좋습니다. 특히 두 리모콘과 상호 작용하는 사용자가있는 경우 저장소를 두 리모컨과 호환되도록 유지하는 것이 좋습니다. 여기

      A/master 
           ↓ 
* -- * -- * -- a -- * -- * -- a+ 
       \ 
       * -- * -- b -- [A] 
           ↑ 
          B/mybranch 

, [A] : 당신은 또한 당신의 BA에서 모든 변경 사항을 스쿼시 수

당신은 다음과 같이하고, A과의 호환성을 걱정하지 않는 역사를 원하지 않는 경우

, 단일 커밋에서 aa+ 사이의 모든 변경 사항을 포함하는 압축 된 커밋입니다. 모든 커밋을 스쿼시하면서 AB에 리베이스하여이 결과를 얻을 수 있습니다. 이 경우 커밋 메시지에서 변경 내용이 어디서 발생했는지 명확하게 명시해야합니다.

관련 문제