GitHub에서 분기와 분기


278

github 프로젝트 분기의 생성과 github 프로젝트 분기의 장점과 단점에 대해 더 많이 알고 싶습니다.

Forking은 원래 프로젝트의 공동 작업자 목록에 있지 않아도되므로 내 프로젝트 버전을 원래 버전과 분리시킵니다. 사내에서 프로젝트를 개발하고 있기 때문에 사람들을 공동 작업자로 추가하는 데 아무런 문제가 없습니다. 그러나 프로젝트를 분기하면 병합 변경 사항이 기본 프로젝트로 다시 병합되는 것이 더 어려울 지 이해하고 싶습니다. 즉, 분기로 인해 두 프로젝트를 더 쉽게 동기화 할 수 있는지 궁금합니다. 다시 말해, 분기 할 때 주 프로젝트의 버전과 주 프로젝트간에 변경 사항을 병합하고 푸시하는 것이 더 쉬운가요?

답변:


279

해당 특정 프로젝트의 공동 작업자로 등록되어 있지 않기 때문에 분기를 만들거나 기존 분기를 가져 와서 다시 밀어 낼 수는 없습니다.

포킹은 GitHub 서버 측 의 복제 지나지 않습니다 .

  • 직접 밀 수있는 가능성없이
  • 포크 큐 기능은 병합 요청을 관리하기 위해 추가

다음과 같은 방법으로 포크를 원본 프로젝트와 동기화시킵니다.

  • 원본 프로젝트를 리모컨으로 추가
  • 원래 프로젝트에서 정기적으로 가져 오기
  • 해당 페치에서 업데이트 한 관심 지점 위에 현재 개발을 리베이스하십시오.

리베이스를 사용하면 변경 사항을 간단하게 처리 할 수 ​​있으며 (병합 충돌이 발생하지 않음) 원본 프로젝트의 관리자가 자신의 프로젝트에 패치를 포함시키기를 원할 때 당김 요청이 더 쉬워집니다.

직접적인 참여가 항상 가능하지는 않지만 실제로 공동 작업을 허용하는 것이 목표입니다 .


GitHub 측에서 복제한다는 사실은 이제 두 개의 "중앙"저장소 ( "중앙"이 "여러 공동 작업자에게 표시됨") 임을 의미
하므로 프로젝트의 공동 작업자로 직접 추가 할 수있는 경우 다른 프로젝트를 관리 할 필요가 없습니다. 포크로 하나.

GitHub에 포크

병합 경험은 거의 동일하지만 추가 수준의 간접적 (포크를 먼저 눌렀다가 원래 리포지토리에서 진화의 위험으로 더 이상 빨리 감기 병합을 더 이상 진행하지 않도록)을 요구하십시오. .
즉, 올바른 워크 플로우 git pull --rebase upstream(업스트림에서 새로운 커밋을 기반으로 작업을 리베이스) 한 다음 git push --force origin자신의 커밋이 항상 원래 (업스트림) 리포지토리의 커밋 위에있는 방식으로 기록을 다시 작성해야합니다. .

또한보십시오:


3
우리는 사내에서 프로젝트를 개발하고 있으며 사람들을 공동 작업자로 추가하는 데 아무런 문제가 없습니다. 그러나 프로젝트를 분기하면 변경 내용을 주 프로젝트로 다시 병합하는 것이 더 어려워 지는지 이해하고 싶습니다.
reprogrammer

7
@reprogrammer : 공동 작업자를 추가 할 수 있으면 분기 할 필요가 없습니다. 로컬로 리베이스 한 다음 대상 브랜치를 병합 한 다음 두 개의 중앙 리포지토리 (원본 및 포크) 를 관리하지 않고 하나의 중앙 리포지토리로 직접 푸시 할 수 있습니다. 리베이스는 거의 동일하지만 포크가 포함될 때 추가 간접 지향이 있습니다. 다시 : 여기 필요하지 않습니다. 내 답변을 업데이트했습니다.
VonC

14
솔직히, 꼭 그럴 필요는 없더라도, 선임 개발자, 팀장 또는 다른 "신뢰할 수있는"사람들에게만 쓸 수있는 신성한 레포갖는 것이 좋습니다 . 다른 모든 팀원은 포크 (~ 샌드 박스)로 작업하고 풀 요청 형식으로 변경 사항을 제공해야합니다. DVCS는이를 가능하게 해주므로이를 "모범 사례"로 채택하고 소규모 프로젝트에서도이를 성공적으로 사용합니다.
intland

1
@intland 그래서 stackoverflow.com/users/6309/vonc?tab=responses ?에 설명 된대로 "통합 관리자 워크 플로우"를 선호합니다 . 대기업에 Git을 도입 한 적이 있기 때문에 "통합 관리자"로 전환하기 전에 먼저 중앙 집중식 워크 플로우 (모든 사람에게 친숙 함)를 채택하는 경향이 있습니다.
VonC

15
분기를 끊고 완전히 새로운 나무를 시작하는 데 사용되므로 포크를 "견과"라고 부릅니다. 내 두 센트-수목 관용구를 좋아한다.
Eric

66

높은 수준의 차이점은 다음과 같습니다.

분기

찬성

  • 사용자별로 분기를 유지합니다
  • 기본 리포지토리의 혼란을 줄입니다
  • 팀 프로세스에 외부 기고자 프로세스가 반영됩니다.

단점

  • 활성화 된 (또는 해당 문제에 대해 비활성화 된) 모든 브랜치를보기 어렵게 만듭니다.
  • 지점에서 공동 작업하는 것이 더 까다 롭습니다 (포크 소유자는 사람을 공동 작업자로 추가해야 함)
  • Git의 여러 리모컨 개념을 이해해야합니다.
    • 추가 정신 부기 필요
    • 이것은 Git에 익숙하지 않은 사람들에게는 워크 플로우를 더 어렵게 만듭니다.

분기

찬성

  • 한 곳에서 프로젝트를 중심으로 모든 작업을 수행합니다.
  • 모든 공동 작업자는 동일한 지점으로 푸시하여 협업 할 수 있습니다.
  • 처리 할 Git 리모콘은 하나뿐입니다

단점

  • 버려진 지점은 더 쉽게 쌓을 수 있습니다.
  • 팀 기여 프로세스가 외부 기여자 프로세스와 일치하지 않습니다
  • 팀원을 브랜치하기 전에 기고자로 추가해야합니다.

"외부 기고자 프로세스"란 무엇입니까?
Kars Barendrecht

1
@KarsBarendrecht "외부 기고자"라는 용어를 사용하도록 업데이트되었습니다. write저장소에 대한 권한 이없는 사람입니다 .
Aidan Feldman

45

Git의 일반적인 워크 플로와 관련이 있습니다. 메인 프로젝트의 저장소로 직접 푸시 할 수 없을 것입니다. GitHub 프로젝트의 리포지토리가 브랜치 기반 액세스 제어를 지원하는지 확실하지 않습니다. 예를 들어 마스터 브랜치에 푸시 할 권한을 다른 사람에게 부여하고 싶지 않기 때문입니다.

일반적인 패턴은 다음과 같습니다.

  • 원래 프로젝트의 저장소를 포크하여 자체 GitHub 사본을 가지면 변경 사항을 푸시 할 수 있습니다.
  • GitHub 리포지토리를 로컬 머신에 복제
  • 선택적으로 원래 저장소를 로컬 저장소의 추가 원격 저장소로 추가하십시오. 그런 다음 해당 리포지토리에 게시 된 변경 내용을 직접 가져올 수 있습니다.
  • 로컬에서 수정하고 커밋하십시오.
  • 일반적으로 프로젝트 저장소에 대한 쓰기 권한이 없으므로 GitHub 저장소로 변경 사항을 푸시하십시오.
  • 프로젝트 관리자에게 문의하여 변경 사항을 가져 와서 검토 / 병합하도록 요청하고 프로젝트 저장소로 되돌 리도록하십시오 (원하는 경우).

이것이 없으면, 공공 프로젝트가 누군가가 자신의 커밋을 직접 추진하게하는 것은 매우 드문 일입니다.


@RecoJohnson, 음 ... 나는 내 대답에 "pull"이라는 단어를 사용하지 않았습니다 (그러나 "pull"은 Git 용어로 효과적으로 "fetch"+ "merge"입니다). "푸시"의 어떤 사용법이 잘못되었다고 생각하십니까?
Bruno

2
@RecoJohnson GitHub 포크에 대한 공헌자 푸시로서; 프로젝트 관리자는 여러분의 포크에서 귀하의 기여를 이끌어냅니다.
mljrg

1
오픈 소스 세계에서는 개발 팀이 잘 정의 된 git을 사용하는 개발 팀이있는 많은 조직보다 공동 작업자가 배정되지 않을 것이라는 가정이 더 사실이라고 생각합니다. 나는 이것이 중요한 구별과 충분하지 않은 것으로 생각합니다. 아마도 gitlab과 같은 회사가 기업의 요구를 이해하고 통제가 필요하기 때문에 번성하는 이유 일 것입니다.
code4cause

8

Forking은 기존 저장소에서 완전히 새로운 저장소를 생성합니다 (gitHub / bitbucket에서 간단히 git clone 수행)

포크는 가장 잘 사용됩니다. '분할'의 의도가 논리적으로 독립적 인 프로젝트를 만드는 경우에는 부모와 다시 통합 될 수 없습니다.

지점 전략은 기존 / 작업 저장소에 새로운 지점을 만듭니다.

분기가 가장 잘 사용됩니다. 분기를 원점과 병합하려는 의도로 기능을 통해 작업 할 임시 장소로 만들 때.

더 구체적 :- 오픈 소스 프로젝트에서 리포지토리에 푸시 할 수있는 사람을 결정하는 것은 리포지토리의 소유자입니다. 그러나 오픈 소스의 아이디어는 모든 사람이 프로젝트에 기여할 수 있다는 것입니다.

이 문제는 포크로 해결됩니다. 개발자가 오픈 소스 프로젝트에서 무언가를 변경하려고 할 때 공식 저장소를 직접 복제하지 않습니다. 대신, 그들은 그것을 만들어서 사본을 만듭니다. 작업이 완료되면 저장소 소유자가 변경 사항을 검토하고 변경 사항을 자신의 프로젝트에 병합할지 여부를 결정할 수 있도록 풀 요청을 작성합니다.

핵심 분기점은 기능 분기와 유사하지만 분기를 작성하는 대신 저장소 포크를 작성하고 병합 요청을 수행하는 대신 풀 요청을 작성합니다.

아래 링크는 잘 설명 된 방식으로 차이점을 제공합니다.

https://blog.gitprime.com/the-definitive-guide-to-forks-and-branches-in-git/

https://buddy.works/blog/5-types-of-git-workflows

http://www.continuousagile.com/unblock/branching.html


이 답변에서 "가장 많이 사용 된"진술은 브랜칭이 오픈 소스 프로젝트와 같은 것들뿐만 아니라 실제 세계에서 포크가 어떻게 사용되는지에 대한 현실을 막는 많은 문제를 무시하는 것으로 보입니다. 지정된 리포지토리를 직접 수정할 수있는 권한이없는 프로젝트에서 사람들이 공동 작업을 수행 할 수 있도록 끌어 오기 요청과 함께 포크를 사용하는 것이 매우 일반적입니다.
StriplingWarrior
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.