Skip to main content

끌어오기 요청 병합 정보

기능 분기의 모든 커밋을 유지하거나, 모든 커밋을 단일 커밋으로 스쿼시하거나, 개별 커밋을 head 분기에서 base 분기로 개별 커밋을 다시 적용하여 끌어오기 요청을 병합할 수 있습니다.

커밋 병합

GitHub.com의 끌어오기 요청에서 기본 병합 끌어오기 요청 옵션을 클릭하면 기능 분기의 모든 커밋이 병합 커밋의 기본 분기에 추가됩니다. 끌어오기 요청은 --no-ff 옵션을 사용하여 병합됩니다.

끌어오기 요청을 병합하려면 리포지토리에 쓰기 권한이 있어야 합니다.

기능 분기의 커밋과 추가 병합 커밋이 모두 'main'에 추가되는 표준 병합 및 커밋 흐름의 다이어그램.

커밋 스쿼시 및 병합

GitHub.com에서 끌어오기 요청에 대해 Squash 및 병합 옵션을 선택하면 끌어오기 요청의 커밋이 단일 커밋으로 Squah됩니다. 토픽 분기의 기여자 개별 커밋을 모두 보는 대신 커밋이 하나의 커밋으로 결합되어 기본 분기에 병합됩니다. Squah된 커밋이 있는 끌어오기 요청은 빨리 감기 옵션을 사용하여 병합됩니다.

끌어오기 요청을 Squah하고 병합하려면 리포지토리에서 쓰기 권한이 있어야 하며 리포지토리에서 Squah 병합을 허용해야 합니다.

기능 분기의 여러 커밋이 '기본'에 추가된 하나의 커밋으로 결합되는 커밋 스쿼싱 다이어그램입니다.

Squash 및 병합을 사용하여 리포지토리에서 보다 간소화된 Git 기록을 만들 수 있습니다. 진행 중인 작업 커밋은 기능 분기에서 작업할 때 유용하지만 Git 기록을 보존하는 것이 반드시 필요하지는 않습니다. 기본 분기에 병합하는 동안 이러한 커밋을 하나의 커밋으로 Squash하는 경우 명확한 Git 기록으로 원래 변경 내용을 보존할 수 있습니다.

Squash 병합에 대한 병합 메시지

스쿼시 및 병합할 때 GitHub에서는 사용자가 편집할 수 있는 기본 커밋 메시지를 생성합니다. 리포지토리 구성 방법과 끌어오기 요청에 있는 커밋 수(병합 커밋은 제외)에 따라, 이 메시지에는 끌어오기 요청 제목, 끌어오기 요청 설명 또는 커밋 관련 정보가 포함될 수 있습니다.

커밋 수요약설명
하나의 커밋단일 커밋에 대한 커밋 메시지의 제목과 끌어오기 요청 번호단일 커밋에 대한 커밋 메시지의 본문 텍스트
둘 이상의 커밋끌어오기 요청 제목과 끌어오기 요청 번호모든 Squash된 커밋에 대한 커밋 메시지 목록(날짜 순서)

리포지토리에 대한 유지 관리자 또는 관리자 액세스 권한이 있는 사람은 모든 스쿼시된 커밋에 대한 리포지토리의 기본 병합 메시지가 끌어오기 요청 제목만 사용하거나, 끌어오기 요청 제목 및 커밋 세부 정보를 사용하거나, 끌어오기 요청 제목 및 설명을 사용하도록 설정할 수 있습니다. 자세한 내용은 "끌어오기 요청에 대한 커밋 Squash 구성"을(를) 참조하세요.

장기 실행 분기 Squash 및 병합

끌어오기 요청이 병합된 후 끌어오기 요청의 헤드 분기에서 작업을 계속하려면 끌어오기 요청을 Squash하고 병합하지 않는 것이 좋습니다.

끌어오기 요청을 만들 때 GitHub은 헤드 분기와 베이스 분기 모두에 있는 가장 최근 커밋인 공통 상위 커밋을 식별합니다. 끌어오기 요청을 Squash하고 병합할 때 GitHub는 공통 상위 커밋 이후 헤드 분기에서 수행한 모든 변경 내용을 포함하는 커밋을 베이스 분기에 만듭니다.

이 커밋은 헤드 분기가 아닌 베이스 분기에만 있으므로 두 분기의 공통 상위 항목은 변경되지 않습니다. 헤드 분기에서 계속 작업한 다음 두 분기 간에 새 끌어오기 요청을 만들면 끌어오기 요청에는 이전 끌어오기 요청에서 Squash 및 병합한 커밋을 포함하여 공통 상위 항목 이후의 모든 커밋이 포함됩니다. 충돌이 없으면 이러한 커밋을 안전하게 병합할 수 있습니다. 그러나 이 워크플로는 병합이 충돌할 가능성을 더 높입니다. 장기 실행 헤드 분기에 대한 끌어오기 요청을 계속 Squash하고 병합하는 경우 동일한 충돌을 반복적으로 해결해야 합니다.

커밋 다시 지정 및 병합

GitHub.com에서 끌어오기 요청에서 다시베이스 및 병합** 옵션을 선택하면 **병합 커밋 없이 토픽 분기(또는 헤드 분기)의 모든 커밋이 개별적으로 기본 분기에 추가됩니다. 이러한 방식으로 다시 지정 및 병합 동작은 선형 프로젝트 기록을 유지 관리하여 빨리 감기 병합과 유사합니다. 그러나 다시 지정은 새 커밋을 사용하여 기본 분기에 커밋 기록을 다시 작성하여 이를 달성합니다.

GitHub Enterprise Cloud의 다시 지정 및 병합 동작은 git rebase와 약간 다릅니다. GitHub에서의 다시 지정 및 병합은 커밋한 사람 정보를 항상 업데이트하고 새 커밋 SHA를 만듭니다. 반면에 GitHub 외부의 git rebase는 상위 커밋 위에 다시 지정이 발생할 때 커밋한 사람 정보를 변경하지 않습니다. git rebase에 대한 자세한 내용은 Git 설명서에서 git-rebase를 참조하세요.

끌어오기 요청을 다시 지정하고 병합하려면 리포지토리에서 쓰기 권한이 있어야 하며 리포지토리에서 다시 지정 병합을 허용해야 합니다.

git rebase의 시각적 표현은 Pro Git Book에서 “Git 분기 - 다시 지정” 챕터를 참조하세요.

다음과 같은 경우 GitHub.com에서 자동으로 다시 지정하고 병합할 수 없습니다.

  • 끌어오기 요청에 병합 충돌이 있습니다.
  • 베이스 분기에서 헤드 분기로 커밋을 다시 실행하면 충돌이 실행됩니다.
  • 커밋을 다시 지정하는 것은 병합 충돌 없이 다시 지정이 가능하지만 병합과는 다른 결과를 생성하는 경우와 같이 “안전하지 않은” 것으로 간주됩니다.

여전히 커밋을 다시 지정하지만 GitHub.com에서 자동으로 다시 지정하고 병합할 수 없는 경우 다음을 수행해야 합니다.

  • 명령줄에서 로컬로 베이스 분기에 토픽 분기(또는 헤드 분기)를 다시 지정
  • 명령줄에서 병합 충돌을 해결합니다.
  • 다시 지정된 커밋을 끌어오기 요청의 토픽 분기(또는 원격 헤드 분기)에 강제 푸시합니다.

리포지토리에서 쓰기 권한이 있는 모든 사용자는 GitHub.com의 다시 지정 및 병합 단추를 사용하여 변경 내용을 병합할 수 있습니다.

간접 병합

끌어오기 요청은 헤드 분기 외부에서 직접 또는 간접적으로 베이스 분기에 병합되는 경우 자동으로 병합될 수 있습니다. 즉, 대상 분기의 끝에서 헤드 분기 팁 커밋에 연결할 수 있게 되면 예시:

  • 분기 main 가 커밋 C에 있습니다.
  • 분기 feature 가 분기 해제되었으며 main 현재 커밋 D에 있습니다. 이 분기에는 끌어오기 요청 대상에 지정되었습니다 main.
  • 분기 feature_2 가 분기되고 feature 현재 커밋 E에 있습니다. 이 분기에는 끌어오기 요청 대상도 있습니다 main.

끌어오기 요청 E --> main가 먼저 병합되는 경우 끌어오기 요청 D --> main 는 이제 모든 커밋에 feature 연결할 수 main있으므로 자동으로_ 병합_된 것으로 표시됩니다. 명령줄에서 서버로 병합 feature_2 하고 서버로 main 푸시 main 하면 두 끌어오기 요청이 모두_ 병합된 것으로 표시됩니다_.

간접 병합은 끌어오기 요청의 헤드 분기 커밋이 리포지토리의 베이스 분기로 직접 푸시되거나 끌어오기 요청의 헤드 분기 커밋이 다른 끌어오기 요청에 있고 병합 커밋 만들기 옵션을 사용하여 리포지토리의 베이스 분기에 병합되는 경우에만 발생할 수 있습니다.

다른 끌어오기 요청의 헤드 분기에 있는 커밋이 포함된 끌어오기 요청이 Squash 및 병합 또는 다시 지정 및 병합 옵션을 사용하여 병합되는 경우 베이스 분기에 새 커밋이 생성되며 다른 끌어오기 요청은 자동으로 병합되지 않습니다.

간접적으로 병합되는 끌어오기 요청은 분기 보호 규칙이 충족되지 않은 경우에도 merged로 표시됩니다.

추가 참고 자료