2017-01-09 13 views
1

는 두 사용자가병합 모든 커밋은 중앙 상황을 단순화하기 위해

A -> B -> C  A -> B -> D # and Repo at A -> B 

모두 두 사용자가 동시에에 밀어하려고처럼 역사는 커밋 가정합니다. 그래서 처음 두 가지 질문 상승이 병합이 발생하는 방법입니다 먼저 사용자는 첫 번째 기회를 얻을 것이다 그리고 지금의 repo는 그래서 그는

A -> B -> C -> D or A -> B -> D -> C 

에서 이제 밀어 전에 다시 당겨하는 데 필요한

A -> B -> C 

이제 2 사용자에있다 (타임 스탬프에 ..!)? 어떻게 커밋이 첫 번째 C 또는 D가되는지 결정합니다. 두 번째 이유는이 병합 작업이 원격 또는 중앙 Repo에서 수행되는 이유입니다 (병합 충돌이 없다고 가정).

다른 사람들을 위해 git을 사용하려고합니다. 동기화 기술 기술 N 사용자가 동시에 뭔가를 푸시하려고 시도하는 경우 각 사용자가 푸시 할 수 있기 전에 N-1 번 당겨야합니다.

따라서 병합 충돌이없는 것으로 가정하면 병합을 중앙에서 수행 할 수있는 방법이 있습니다. 사용자가 결국 끌어 내려고하지만 N-1이 당기는 것을 피하기 위해서입니다.

+0

어떻게 중앙 병합이 N-1 문제를 해결할 것인가? 모든 사용자는 여전히 다른 사용자가 변경 한 내용을 얻기 위해 저장소를 동기화해야합니다. – akash93

+0

주요 문제로 생각되는 동시성 문제는 실제로는 사소한 문제입니다. 누군가가 당신을 강타하면, 당신은 병합/리베이스를하고 그것을 처리해야합니다. –

+0

당신은 100 명의 사용자가 동시에 푸시하려고하고 마지막 1 명이 푸시 할 수 있기 전에 99 시간을 끌어야 만한다면 실제로 중요한 문제가 될 것이라고 생각하지 않습니다. event git는 새로운 푸시를 통합하는 데 약간의 시간이 걸린다. – runitfirst

답변

2

각 사용자는 푸시 할 수있는 전에 N-1 번 당겨해야합니다

그들은하지 않습니다 : 각 사용자가 밀어 다음 다시 시도 가져옵니다. 그 동안 다른 사용자가 푸시하지 않으면 해당 한 명의 사용자가 계속해서 푸시됩니다.
n-1 번 (즉, 다른 사용자 한 명이 밀어 넣기 때문에 각 푸시가 실패 함을 의미)을 당길 확률은 매우 낮습니다. 100 사용자가 동시에 밀어하려고하는 경우

당신은 실제로 큰 문제가 될 수 있다고 생각하지 않습니다 지난 1 밀어 수있는 전에 99 시간을 끌어해야합니다.?

아니요.이 경우 각 사용자가 전용 분기 (사용자 당 하나씩)를 밀어 넣을 수 있으므로 문제를 피할 수 있습니다.
이러한 동시 조작은 서버 측에서 해결됩니다 (통합 분기에서 병합이 수행됨). 그것은 (당신이 해결하기 위해 너무 복잡 할 것입니다 무엇을 설명) 클라이언트 측

왼쪽되지 않을 것입니다 무슨 베어의 repo에 모든 자식 객체를 전송하는 (아마도 rabbitmq)를 큐잉 시스템을 사용하고 머리를 설정하는 방법에 대한 필수. 그것에 대한 당신의 생각은 무엇입니까? 클러스터링 상황에서 좋을까요?

당신은 전송이 노출 된 자식의 repo에
다음 (따라서 한 가지 사용자 당) 실패하지 않음을 확인해야, 다른 프로세스 시도하고 새로운이 사용자의 지점에 밀어 커밋 병합 할 수 있습니다. 충돌로 인해 실패하면 통합 자에게 상황을 해결하기위한 알림 전자 메일을 보냅니다.

+0

감사합니다. 그러나 정확하게 thats 문제. N 사용자가 지속적으로 뭔가를 푸시하려고하는 스레드를 실행 중입니다. 그리고 분명히 단 한 명의 사용자 만이 밀 수 있습니다. 그래서 N-1이 다시 당겨지게됩니다. – runitfirst

+0

@runitfirst 그러면 스레드를 항상 성공 시키려면 사용자 당 하나의 분기를 고려해야합니다. 클라이언트 측에서 작동하도록하는 대신 서버 측에서 해당 분기를 병합하는 것을 고려하십시오. – VonC

+0

@runitfirst 수정 된 답변보기 – VonC

2

N 사용자가 기계이고 모두 동일한 속도로 실행되는 경우 그렇습니다. 그러면이 문제가 발생합니다.

실제로 4 명의 배우 만있는 문제를 살펴보고 그 중 3 명이 실제로이 문제가 있는지 확인해 봅시다. 우리의 네 명은 캐롤, 데이비드, 엠마, 팰론입니다.

예제에서와 같이 중앙 저장소는 커밋 A와 B로 시작됩니다. 어쨌든, 캐롤, 데이비드, 에머, 팰론 모두 네 번에 새로운 커밋을 끝내고 14 : 17 : 23.2에 밀어 넣으 려하지만 캐롤의 컴퓨터가 가장 빠르기 때문에 중앙 저장소에 커밋됩니다. :

A--B--C <-- master 

데이비드, 엠마, 그리고 펄롱이 자신의 푸시가 빠르게 전달 아님을 알리는 오류 메시지가 그들이 다시 시도해야합니다. 그러나 팰런의 전화가 울리거나 (텍스트로 윙윙 거리다) 그는 그것에 정신이 산다. 한편 데이비드와 엠마는 푸시가 실패했다는 사실을 모두 알고 있습니다.

David는 전에 이것을 보지 못했습니다. 그래서 그는 이제 StackOverflow를 검색하여 자신이해야 할 일을 찾아야합니다. Emma는 Git에 더 익숙합니다. 그녀는 git fetch && git rebase && git show을 실행하고 그녀의 변화가 좋음을 확인합니다. 지금은 14 : 18 : 09.6입니다. git push origin master에서 엠마 종류와 그녀의 밀어가 진행됩니다

A--B--C--E 

다윗이 지금에 대한 REBASE 대 병합 읽고 있습니다. Fallon은 14:19:39에 전화를 끊거나 그 실패를 알아 차립니다. David와 Fallon은 모두 git pull을 실행합니다 (Emma만큼 똑똑하지 않고 rebase가 더 우수하다는 것을 인식하지 못합니다). 자신의 저장소가 될 :

A--B--C--E--M <-- master 
    \ /
    D----/ 

과 :

A--B--C--E--G <-- master 
    \ /
    F----/ 

각각을. 몇 가지 기적으로, 그들은 거의 같은 시간에, 14 : 21 : 01 분량으로 Fallon을 약간 앞당겨서 밀어 붙이기 때문에 David는 또 다른 "빨리 감기"오류를 얻습니다. 중앙 저장소 지금 거울의 펄롱의 저장소 :

A--B--C--E--G <-- master 
    \ /
    F----/ 

데이비드 물론, 약뿐만 아니라 리베이스 읽고, 그래서 그는 모든 정말의 도덕적 동등를 실행 않을 때 (어떻게 든 git pull에서 마술 다르다 생각 git pull --rebase을 시도 git fetch && git merge 대신 git fetch && git rebase).

A--B--C--E--G--D' <-- master 
    |\ /
    | F----/ 
    \ 
    D [abandoned] 

을 그는 14시 21분 28초에서 다시 git push을 시도하고 성공이 사본은 자신이 G의 끝에 D을 커밋합니다. 중앙 저장소는 master에 커밋 D'을 가져오고 모든 사용자는 만족합니다.

David는 두 번 가져와야하는 유일한 사람이며 전체 프로세스는 약 4 분이 걸렸습니다. 물론 그는 여전히 git pull이 실제로 어떻게 작동하는지 이해하지 못하지만 적어도 현재 리베이스를 사용하는 것을 알고 있습니다. :-)

+0

+1하지만이 프로세스는 확장되지 않습니다. 앞서 언급했듯이 많은 수의 사용자에게 전용 지점과 서버 측 병합이보다 지속 가능할 것입니다. – VonC

+0

다른 분기 방법을 가진 메인 라인 브랜치가있는 전용 브랜치. 실제로 나는 한 지점을 사용하는 수십 명의 사람들에게도 문제를 보지 못했습니다. – torek

+0

좋은 설명. 나는 거기에 사용자 전용 기계가 없습니다 주석으로. gitpython 및 watchdog 라이브러리를 사용하여 파일 시스템의 변경 사항을 감지합니다 ..com을 수정하고 푸시합니다. 수동은 아니며 연속적으로 실행되는 스레드를 통한 모든 것 – runitfirst