Um git commit pode ter mais de 2 pais?


48

Em desta documentação é mencionado

Um objeto de confirmação pode ter qualquer número de pais.

Mas, pelo que entendi, o único caso em que um commit terá mais de um pai é quando uma mesclagem ocorreu e, nesse caso, haverá apenas dois pais. Então, minha pergunta é: um commit pode ter mais de 2 pais? Se assim for, quando?


11
github.com/torvalds/linux/commit/… - Eu não acho que o Github saiba como exibir um diff de 27 direções, mas fique à vontade para clonar o repositório e visualizá-lo.
user253751

Respostas:


43

Você pode usar o git merge para mesclar mais de um commit no seu ramo atual. De man git-merge(ou git help merge):

git-merge - Une dois ou mais históricos de desenvolvimento

O resultado será um comprometimento com mais de dois pais quando você fizer isso.


33
Uma mesclagem de mais de um ramo (ou seja, um commit com mais de dois pais) é coloquialmente conhecida como "mesclagem de polvo". Essa também é a fonte de inspiração para o logotipo e a mascote do GitHub, o gato de oito patas: foi originalmente chamado de Octopuss, mas foi renomeado como Octocat, mais amigável para as empresas.
Jörg W Mittag

4
Quais são as vantagens de mesclar três ou mais ramificações em uma única confirmação, em vez de uma série de confirmações?
Tor Klingberg 30/03

2
Histórico do @TorKlingberg Cleaner, mas não deixe de testar o produto final antes de enviar para o repsitory remoto.
Ferrybig

5
@KasunSiyambalapitiya - Existem vários exemplos em um repositório em particular no github . Um dos muitos polvos se funde nesse repo que envolve 27 pais .
precisa saber é o seguinte

1
@ JörgWMittag Literalmente nada disso é verdade. Fonte: trabalhou no GitHub por cinco anos.
gjtorikian

5

Sim, que tal 100k pais?

Aqui está um exemplo ao vivo do GitHub com uma mesclagem de 100k confirmações: https://github.com/cirosantilli/test-octopus-100k Gerado com este script .

Jogo de perguntas sobre cultura geral

Linus não gosta de confirmações com mais de 60 pais: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

É puxado, e está bom, mas há claramente um equilíbrio entre "a fusão de polvos é boa" e "Cristo, isso não é um polvo, é uma fusão de Cthulhu".

Dê uma olhada no formato do objeto de confirmação do Git

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

A partir dessa análise, podemos ver que a lista de pais é uma lista arbitrária e separada de nova linha do tipo:

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

e assim um número arbitrário de pais é permitido.

Exemplo mínimo

Roteiro:

#!/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"

Resultado:

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

Não tenho certeza se o GitHub simplesmente não consegue lidar com uma mesclagem dessa magnitude ou se você o deixou como um repositório privado. Ou se o GitHub está apenas tendo algum problema não relacionado. Mas, independentemente disso, o link de mesclagem de 100k é um erro de 500 para mim.
8bittree

@ 8bittree ele não consegue lidar, repo privado seria 400 :-) github.com/isaacs/github/issues/1344
Ciro Santilli新疆改造中心法轮功六四事件

Qual é essa conexão entre a sandália barbada que veste os advogados da FOSS e a Lovecraft que eu encontro repetidamente?
Neutrino

3

Você pode especificar mais de uma ramificação ao mesclar.

Por exemplo:

git merge branch_A branch_B branch_C [...]

Então comprometer tem mais pais.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.