2013-03-02 8 views
3

저는 여전히 버전 관리와 Github에 대해 전반적으로 새로운입니다. 뭔가 나에게 혼란스럽고 나는 내 머리를 감싸고있는 것처럼 보일 수 없다. 우리는 두 명의 사람들이 동일한 레일 애플리케이션 프로젝트를 진행하는 시나리오를 상상해보십시오. 가이 A는 마스터 레포를 가지고 있고, 가이 B는 레포를 포크로 만든 사람입니다. 이제 가이 B는 앱에없는 새로운 기능을 만듭니다. 그렇게하면서 그는 원하는 결과를 얻기 위해 일부 파일을 편집하고 경우에 따라 이동해야했습니다.Git Fork/Merge Conflicts?

한편 Guy A는 매우 유사한 기능을 사용하고 있으며 매우 유사한 파일을 편집하고 이동해야하지만 매우 다른 소스 코드가 있습니다. 아니면 다른 소스 코드를 사용하여 동일한 파일을 편집하는 다른 기능을 사용하고있을 수도 있습니다. 이제 Guy B는 pull 요청을 제출하고 Guy A는 자신이 만든 기능을 master 분기에 병합해야합니다. github은 두 명의 다른 사람들이 다른 방식으로 변경 한 동일한 파일을 어떻게 조정합니까?

+0

내가 이해하는 것으로부터, github에 푸시 된 것이 무엇이든지 이전 커밋을 덮어 쓸 것입니다. –

+0

문제는 두 기능을 모두 유지하려는 경우입니다. – muyiwamat

+0

마스터 브랜치의 소유자 (A)가 푸시하도록 허용 한 다음 다른 사람 (B)이 A의 기능을 가진 커밋을 가져올 수 있습니다. 그런 다음 변경 사항을 [filename (s)] (으)로 푸시 할 수 있습니다. _ B –

답변

1

:

  • 가이 A는 지역의 repo 변화한다 -> 푸시 변경 원격 REPO에를

  • 가이 B 지역의 repo의 변화하게 -> 원격 REPO에 푸시 변경

  • 사람 B는 자신의 변경 사항의 변경과 병합되는 것을 git merge 다음에 git fetch 또는 그래서 git rebase 않습니다 (그것은 여기 실패) 원격. 가이 B는 즉시 이러한 변경 사항을 리모컨으로 푸시해야합니다.

  • 가이 A는 로컬 저장소에서 몇 가지 변경 사항을 적용합니다. -> 변경 사항을 푸시합니다 (다시 실패합니다). 그는 병합 또는 리베이스에 대한 Guy B와 비슷한 단계를 거칩니다.

그리고 Github의 측면에서 말하기는 원격 REPO에 대한 변경 사항을 밀어의 개념은 GitHub의에서 pull request로 처리됩니다. 누군가가 일부 저장소의 일부 지점으로 끌어 오기 요청을 보내면이 대상에 대한 변경 내용의 병합/리베이스를 수행 한 후 pull request을 보내는 것은 요청자의 책임입니다.

요청자가 병합을 수행하는 데 충분한 시간이 걸리지 않았거나 이전에 요청한 풀 요청이 있었기 때문에 많은 양의 충돌이 발생하여 충돌을 일으킨 경우 소유자는 리퀘 스터에게 최신 변경 사항 위에 업데이트 된 pull request을 보내도록 요청할 수 있습니다.

즉, 풀 요청을받은 사람은 일반적으로 fast-forward merges을 수락하기 만하면 행복 하겠지만 약간의 예외가 있습니다.

+0

Hmmmm 완벽한 해결책 인 것 같습니다. 충돌이있을 때 원격 저장소로 이동하는 것이 실패 할 수 있다는 것을 전혀 모릅니다. 그것을 지워 줘서 고마워, 지금은 완벽하게 잘 이해하고있다. – muyiwamat

1

Github는 풀 요청에 병합을 사용합니다. 때로는 수동 병합을 통해 요청 병합을 처리 할 수없는 충돌을 해결하기 위해 Guy B의 레포에서 수행해야합니다. 때로는 리베이스가 조금 더 잘 작동하지만 마일리지가 다를 수 있습니다.

개인적으로 내 방법은 코드를 마지막으로 추가하는 사람은 끌어 오기 요청 또는 수동 통합을 통해 신뢰할 수있는 repo 또는 분기로 되돌아 가기 전에 병합/리베이스를 담당하는 사람입니다. 나는이 워크 플로가 어떻게되는지하는 다중 사용자 프로젝트에서 작업 한

+0

지금은 조금 더 명확하지만 아직 조금 혼란 스럽습니다. 나는 시간과 함께 더 잘 이해할 것 같다. 고마워. 전혀 관련없는 메모에서 리베이스하는 것은 무엇입니까? – muyiwamat

+0

Rebase는 지점에 누군가의 변경 사항을 추가하는 것입니다. 예를 들어 가이 A는 A-> B-> C-> D이고 자네는 A-> B-> C2-> D2입니다. Rebasing은 당신의 라인에 마지막 rebase/merge 이후에 일어난 가이 A의 커밋을 추가 할 것이므로 당신은 다음과 같이 보일 것입니다. A-> B-> C-> D-> C2-> D2 –

+0

아. 나는 배울 것이 많다. github을 만든 사람들은 많은 생각을했습니다. 정보 주셔서 감사합니다. – muyiwamat

관련 문제