자식 커밋에 부모가 2 명 이상있을 수 있습니까?


48

이 문서 에서는 언급되어 있습니다

커밋 개체에는 여러 부모가있을 수 있습니다.

그러나 내 이해에 따르면 커밋에 부모가 둘 이상있는 유일한 경우는 병합이 발생한 경우이며,이 경우 부모는 두 명뿐입니다. 내 질문은, 커밋에 부모가 2 명 이상있을 수 있습니까? 그렇다면 언제?


11
github.com/torvalds/linux/commit/…-Github 이 27-way diff를 표시하는 방법을 알고 있다고 생각하지 않지만 저장소를 복제하여 직접 볼 수 있습니다.
user253751

답변:


43

git merge를 사용하여 하나 이상의 커밋을 현재 브랜치에 병합 할 수 있습니다. 부터 man git-merge(또는 git help merge) :

git-merge-둘 이상의 개발 히스토리에 참여

그렇게하면 두 명 이상의 부모와 결심하게됩니다.


33
둘 이상의 브랜치 병합 (즉, 둘 이상의 부모와의 커밋)은 구어체 적으로 "문어 병합"이라고합니다. 그것은 8 개의 다리가 달린 고양이 인 GitHub의 로고와 마스코트에 영감을주는 원천이기도합니다. 원래 고양이는 Octopuss라고 불렸지만 더 친근한 Octocat으로 이름이 바뀌 었습니다.
Jörg W Mittag

4
일련의 커밋 대신 단일 커밋에 3 개 이상의 브랜치를 병합하면 어떤 이점이 있습니까?
Tor Klingberg

2
@TorKlingberg Cleaner 이력은 있지만 원격 담당자에게 전달하기 전에 최종 제품을 테스트해야합니다.
Ferrybig

5
@KasunSiyambalapitiya- 하나의 특정 github 저장소 에 여러 예제가 있습니다 . 많은 문어 중 하나가 27 명의 부모포함 하는 레포에서 합쳐 집니다.
David Hammen

1
@ JörgWMittag 말 그대로 그 어느 것도 사실이 아닙니다. 출처 : GitHub에서 5 년간 근무했습니다.
gjtorikian

5

네, 부모님은 어떻습니까?

다음은 100k 커밋을 병합 한 라이브 GitHub 예제입니다. https://github.com/cirosantilli/test-octopus-100k 이 스크립트로 생성 됩니다 .

하찮은 일

Linus는 60 명 이상의 부모와의 커밋을 좋아하지 않습니다 : https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

그것은 뽑아지고 괜찮습니다. 그러나 "문어 병합은 괜찮습니다"와 "그리스도, 그것은 문어가 아니고, 그것은 크 툴후 병합"입니다.

Git 커밋 객체의 형식을 살펴보십시오

https://stackoverflow.com/questions/22968856/what-is-the-file-format-of-a-git-commit-object/37438460#37438460

이 분석에서 부모 목록이 임의의 줄 바꿈으로 구분 된 유형 목록임을 알 수 있습니다.

parent {parent_1_sha}
parent {parent_2_sha}
...
parent {parent_N_sha}

따라서 임의의 수의 부모가 허용됩니다.

최소 예

스크립트:

#!/usr/bin/env bash
set -eu

mkdir tmp
cd tmp
git init

touch root
git add .
git commit -m root
sha_root="$(git log -1 --format="%H")"

touch 1
git add .
git commit -m 1
sha1="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 2
git add .
git commit -m 2
sha2="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 3
git add .
git commit -m 3
sha3="$(git log -1 --format="%H")"

git merge -m merge "$sha1" "$sha2"

산출:

*-.   2d2a6c2 (HEAD -> master) merge
|\ \  
| | * 2300c18 2
| * | 7e096cb 1
| |/  
* | 50aa125 3
|/  
* a1e94fd root

GitHub가 그 규모의 병합을 처리 할 수 ​​않는지 또는 개인 저장소로 남겨 두 었는지 확실하지 않습니다. 또는 GitHub에 관련이없는 문제가있는 경우. 그러나 100k 병합 링크는 500 오류입니다.
8bittree

이 처리 할 수없는 8bittree @, 개인 REPO 400 :-) 것 github.com/isaacs/github/issues/1344
치로 틸리新疆改造中心法轮功六四事件

FOSS 옹호자를 착용 한 수염 샌들과 내가 반복적으로 말하고있는 Lovecraft 간의 관계는 무엇입니까?
Neutrino

3

병합 할 때 둘 이상의 브랜치를 지정할 수 있습니다.

예를 들면 다음과 같습니다.

git merge branch_A branch_B branch_C [...]

그런 다음 커밋에는 더 많은 부모가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.