A principal razão do que eu posso ver é a seguinte:
- A interface do usuário do GitHub para mesclar solicitações pull atualmente (outubro de 2015) não permite editar a primeira linha da mensagem de confirmação, forçando-a a ser
Merge pull request #123 from joebloggs/fix-snafoo
- A interface do usuário do GitHub para navegar no histórico de consolidação atualmente não permite visualizar o histórico da ramificação do
--first-parent
ponto de vista
- A interface do usuário do GitHub por observar a culpa em um arquivo atualmente não permite que você veja a culpa do arquivo com o
--first-parent
ponto de vista (observe que isso foi corrigido apenas no Git 2.6.2, para que pudéssemos perdoar o GitHub por não ter isso. acessível)
Portanto, quando você combina todas as três situações acima, você obtém uma situação em que as confirmações não ordenadas que estão sendo mescladas parecem feias na interface do usuário do GitHub.
Seu histórico com confirmações esmagadas será algo como
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... Hotfix for android display issue
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... Implemented pop-up to select language
Considerando que, sem commits esmagados, a história parecerá algo como
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... hotfix for #5849564648
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Quando você tem muitos commits em um rastreamento de relações públicas em que ocorreu uma mudança, pode se tornar um pesadelo se você se restringir ao uso da interface do usuário do GitHub .
Por exemplo, você encontra um ponteiro nulo sendo des-referenciado em algum lugar de um arquivo ... então você diz "quem fez isso e quando? Que versões de lançamento são afetadas?". Em seguida, você passa pela visão de culpa na interface do usuário do GitHub e vê que a linha foi alterada em789fdfffdf
... "mas espere um segundo, essa linha estava apenas tendo seu recuo alterado para se encaixar no restante do código", então agora você precisa navegar para o estado da árvore desse arquivo no commit pai e visitar novamente a página da culpa ... eventualmente você encontra o commit ... é um commit de 6 meses atrás ... "ah **** isso pode estar afetando os usuários por 6 meses" você diz ... ah mas espere, esse commit estava na verdade em uma solicitação pull e só foi mesclada ontem e ninguém fez um lançamento ainda ... "Porra, gente por fundir commits sem esmagar o histórico" é o clamor que geralmente pode ser ouvido após cerca de 2 ou 3 expedições de arqueologia de código via UI do GitHub
Agora, vamos considerar como isso funciona se você usar a linha de comando Git (e o incrível 2.6.2, que tem a correção git blame --first-parent
)
- Se você estivesse usando a linha de comando Git, seria capaz de controlar completamente a mensagem de consolidação de mesclagem e, portanto, a consolidação de mesclagem poderia ter uma boa linha de resumo.
Portanto, nosso histórico de submissões se pareceria
$ git log
1256556316... #423 Added new slideshow feature
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... #324 Hotfix for android display issue
787g8fgf78... hotfix for #5849564648
f56556316e... #28 Implemented pop-up to select language
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Mas também podemos fazer
$ git log --first-parent
1256556316... #423 Added new slideshow feature
56556316ad... #324 Hotfix for android display issue
f56556316e... #28 Implemented pop-up to select language
(Em outras palavras: a CLI do Git permite que você coma e coma também)
Agora, quando atingimos o problema do ponteiro nulo ... bem, apenas usamos git blame --first-parent -w dodgy-file.c
e recebemos imediatamente o commit exato em que a referência de ponteiro nulo foi introduzida no ramo mestre, ignorando alterações simples de espaço em branco.
Obviamente, se você estiver fazendo mesclagens usando a interface do usuário do GitHub, isso git log --first-parent
é realmente péssimo, graças ao GitHub forçando a primeira linha da mensagem de confirmação de mesclagem:
1256556316... Merge pull request #423 from jrandom/add-slideshows
56556316ad... Merge pull request #324 from ahacker/fix-android-display
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
Então, para resumir uma longa história:
A interface do usuário do GitHub (outubro de 2015) tem várias deficiências na maneira como mescla solicitações pull, como apresenta o histórico de confirmação e como atribui informações de culpa. A melhor maneira atual de solucionar esses defeitos na interface do usuário do GitHub é solicitar às pessoas que comprimam suas confirmações antes da mesclagem.
A CLI do Git não possui esses problemas e você pode escolher facilmente qual visualização deseja ver para descobrir o motivo pelo qual uma alteração específica foi feita dessa maneira (olhando o histórico dos commits sem interrupção), bem como veja os commits efetivamente esmagados.
Post Script
A razão final frequentemente citada para comprimir commits é facilitar o backporting ... se você tiver apenas um commit para back port (ou seja, o commit squashed), será fácil escolher facilmente ...
Bem, se você está olhando para a história do git git log --first-parent
, pode escolher os commits de mesclagem. A maioria das pessoas se confunde com confirmações de mesclagem de seleção de cereja porque você precisa especificar a -m N
opção, mas se você recebeu a confirmação a partir de git log --first-parent
então você sabe que é o primeiro pai que deseja seguir, assim serágit cherry-pick -m 1 ...