1*4f98d97cSDaniel Pereira.. SPDX-License-Identifier: GPL-2.0 2*4f98d97cSDaniel Pereira 3*4f98d97cSDaniel Pereira==================================== 4*4f98d97cSDaniel PereiraBackporting e resolução de conflitos 5*4f98d97cSDaniel Pereira==================================== 6*4f98d97cSDaniel Pereira 7*4f98d97cSDaniel Pereira:Autor: Vegard Nossum <vegard.nossum@oracle.com> 8*4f98d97cSDaniel Pereira 9*4f98d97cSDaniel Pereira.. contents:: 10*4f98d97cSDaniel Pereira :local: 11*4f98d97cSDaniel Pereira :depth: 3 12*4f98d97cSDaniel Pereira :backlinks: none 13*4f98d97cSDaniel Pereira 14*4f98d97cSDaniel PereiraIntrodução 15*4f98d97cSDaniel Pereira========== 16*4f98d97cSDaniel Pereira 17*4f98d97cSDaniel PereiraAlguns desenvolvedores podem nunca precisar lidar de fato com backporting de 18*4f98d97cSDaniel Pereirapatches, mesclagem de ramificações (branches) ou resolução de conflitos em seu 19*4f98d97cSDaniel Pereiratrabalho diário, portanto, quando um conflito de mesclagem aparece, pode ser 20*4f98d97cSDaniel Pereiraassustador. Felizmente, resolver conflitos é uma habilidade como qualquer outra, 21*4f98d97cSDaniel Pereirae existem muitas técnicas úteis que você pode usar para tornar o processo mais 22*4f98d97cSDaniel Pereirasuave e aumentar sua confiança no resultado. 23*4f98d97cSDaniel Pereira 24*4f98d97cSDaniel PereiraEste documento tem como objetivo ser um guia abrangente e passo a passo para 25*4f98d97cSDaniel Pereirabackporting e resolução de conflitos. 26*4f98d97cSDaniel Pereira 27*4f98d97cSDaniel PereiraAplicando o patch a uma árvore 28*4f98d97cSDaniel Pereira============================== 29*4f98d97cSDaniel Pereira 30*4f98d97cSDaniel PereiraÀs vezes, o patch que você está fazendo backport já existe como um commit do 31*4f98d97cSDaniel Pereiragit, caso em que você apenas faz o cherry-pick dele diretamente usando 32*4f98d97cSDaniel Pereira``git cherry-pick``. No entanto, se o patch vier de um e-mail, como costuma 33*4f98d97cSDaniel Pereiraacontecer no caso do kernel Linux, você precisará aplicá-lo a uma árvore usando 34*4f98d97cSDaniel Pereira``git am``. 35*4f98d97cSDaniel Pereira 36*4f98d97cSDaniel PereiraSe você já usou o ``git am``, provavelmente já sabe que ele é bastante exigente 37*4f98d97cSDaniel Pereirasobre o patch ser aplicado perfeitamente à sua árvore de código-fonte. Na 38*4f98d97cSDaniel Pereiraverdade, você provavelmente já teve pesadelos com arquivos ``.rej`` e tentando 39*4f98d97cSDaniel Pereiraeditar o patch para fazê-lo ser aplicado. 40*4f98d97cSDaniel Pereira 41*4f98d97cSDaniel PereiraRecomenda-se fortemente, em vez disso, encontrar uma versão base apropriada onde 42*4f98d97cSDaniel Pereirao patch se aplique de forma limpa e *então* fazer o cherry-pick dele para a sua 43*4f98d97cSDaniel Pereiraárvore de destino, pois isso fará com que o git exiba marcadores de conflito e 44*4f98d97cSDaniel Pereirapermitirá que você resolva os conflitos com a ajuda do git e de quaisquer outras 45*4f98d97cSDaniel Pereiraferramentas de resolução de conflitos que preferir usar. Por exemplo, se você 46*4f98d97cSDaniel Pereiraquiser aplicar um patch que acabou de chegar na LKML a um kernel estável mais 47*4f98d97cSDaniel Pereiraantigo, você pode aplicá-lo ao kernel principal (mainline) mais recente e, em 48*4f98d97cSDaniel Pereiraseguida, fazer o cherry-pick dele para a sua ramificação estável mais antiga. 49*4f98d97cSDaniel Pereira 50*4f98d97cSDaniel PereiraGeralmente é melhor usar exatamente a mesma base a partir da qual o patch foi 51*4f98d97cSDaniel Pereiragerado, mas isso não importa tanto, desde que ele se aplique de forma limpa e 52*4f98d97cSDaniel Pereiranão esteja muito longe da base original. O único problema ao aplicar o patch na 53*4f98d97cSDaniel Pereirabase "errada" é que isso pode trazer mais alterações não relacionadas no 54*4f98d97cSDaniel Pereiracontexto do diff ao fazer o cherry-pick dele para a ramificação mais antiga. 55*4f98d97cSDaniel Pereira 56*4f98d97cSDaniel PereiraUm bom motivo para preferir o ``git cherry-pick`` em vez do ``git am`` é que o 57*4f98d97cSDaniel Pereiragit conhece o histórico preciso de um commit existente, de modo que ele saberá 58*4f98d97cSDaniel Pereiraquando o código foi movido de lugar e teve seus números de linha alterados; isso, 59*4f98d97cSDaniel Pereirapor sua vez, torna menos provável que o patch seja aplicado no lugar errado (o 60*4f98d97cSDaniel Pereiraque pode resultar em erros silenciosos ou conflitos confusos). 61*4f98d97cSDaniel Pereira 62*4f98d97cSDaniel PereiraSe você estiver usando o `b4`_. e estiver aplicando o patch diretamente de um 63*4f98d97cSDaniel Pereirae-mail, você pode usar o ``b4 am`` com as opções ``-g``/``--guess-base`` e 64*4f98d97cSDaniel Pereira``-3``/``--prep-3way`` para fazer parte disso automaticamente (veja a 65*4f98d97cSDaniel Pereira`apresentação do b4`_ para mais informações). No entanto, o restante deste 66*4f98d97cSDaniel Pereiraartigo assumirá que você está fazendo um ``git cherry-pick`` simples. 67*4f98d97cSDaniel Pereira 68*4f98d97cSDaniel Pereira.. _b4: https://people.kernel.org/monsieuricon/introducing-b4-and-patch-attestation 69*4f98d97cSDaniel Pereira.. _apresentação do b4: https://youtu.be/mF10hgVIx9o?t=2996 70*4f98d97cSDaniel Pereira 71*4f98d97cSDaniel PereiraAssim que tiver o patch no git, você pode prosseguir e fazer o cherry-pick dele 72*4f98d97cSDaniel Pereiraem sua árvore de código-fonte. Não se esqueça de fazer o cherry-pick com ``-x`` 73*4f98d97cSDaniel Pereirase quiser um registro por escrito de onde o patch veio! 74*4f98d97cSDaniel Pereira 75*4f98d97cSDaniel PereiraNote que, se você estiver enviando um patch para a ramificação estável (stable), 76*4f98d97cSDaniel Pereirao formato é ligeiramente diferente; a primeira linha após a linha de assunto 77*4f98d97cSDaniel Pereiraprecisa ser:: 78*4f98d97cSDaniel Pereira 79*4f98d97cSDaniel Pereira commit <upstream commit> upstream 80*4f98d97cSDaniel Pereira 81*4f98d97cSDaniel Pereiraou:: 82*4f98d97cSDaniel Pereira 83*4f98d97cSDaniel Pereira [ Upstream commit <upstream commit> ] 84*4f98d97cSDaniel Pereira 85*4f98d97cSDaniel PereiraResolvendo conflitos 86*4f98d97cSDaniel Pereira==================== 87*4f98d97cSDaniel Pereira 88*4f98d97cSDaniel PereiraIh, rapaz; o cherry-pick falhou com uma mensagem vagamente ameaçadora:: 89*4f98d97cSDaniel Pereira 90*4f98d97cSDaniel Pereira CONFLICT (content): Merge conflict 91*4f98d97cSDaniel Pereira 92*4f98d97cSDaniel PereiraO que fazer agora? 93*4f98d97cSDaniel Pereira 94*4f98d97cSDaniel PereiraEm geral, os conflitos aparecem quando o contexto do patch (ou seja, as linhas 95*4f98d97cSDaniel Pereiraque estão sendo alteradas e/ou as linhas que cercam as alterações) não 96*4f98d97cSDaniel Pereiracorresponde ao que está na árvore à qual você está tentando aplicar o patch. 97*4f98d97cSDaniel Pereira 98*4f98d97cSDaniel PereiraNo caso de backports, o que provavelmente aconteceu foi que a ramificação 99*4f98d97cSDaniel Pereira(branch) a partir da qual você está fazendo o backport contém patches que não 100*4f98d97cSDaniel Pereiraestão na ramificação para a qual você está fazendo o backport. No entanto, o 101*4f98d97cSDaniel Pereirainverso também é possível. Em qualquer caso, o resultado é um conflito que 102*4f98d97cSDaniel Pereiraprecisa ser resolvido. 103*4f98d97cSDaniel Pereira 104*4f98d97cSDaniel PereiraSe a sua tentativa de cherry-pick falhar com um conflito, o git edita os 105*4f98d97cSDaniel Pereiraarquivos automaticamente para incluir os chamados marcadores de conflito, 106*4f98d97cSDaniel Pereiramostrando onde está o conflito e como as duas ramificações divergiram. Resolver 107*4f98d97cSDaniel Pereirao conflito normalmente significa editar o resultado final de forma que ele leve 108*4f98d97cSDaniel Pereiraem consideração esses outros commits. 109*4f98d97cSDaniel Pereira 110*4f98d97cSDaniel PereiraA resolução do conflito pode ser feita manualmente em um editor de texto comum 111*4f98d97cSDaniel Pereiraou usando uma ferramenta dedicada de resolução de conflitos. 112*4f98d97cSDaniel Pereira 113*4f98d97cSDaniel PereiraMuitas pessoas preferem usar seu editor de texto comum e editar o conflito 114*4f98d97cSDaniel Pereiradiretamente, pois pode ser mais fácil entender o que você está fazendo e 115*4f98d97cSDaniel Pereiracontrolar o resultado final. Definitivamente, existem prós e contras em cada 116*4f98d97cSDaniel Pereiramétodo, e às vezes há valor em usar ambos. 117*4f98d97cSDaniel Pereira 118*4f98d97cSDaniel PereiraNão abordaremos o uso de ferramentas de mesclagem (merge tools) dedicadas aqui, 119*4f98d97cSDaniel Pereiraalém de fornecer algumas indicações de várias ferramentas que você poderia usar: 120*4f98d97cSDaniel Pereira 121*4f98d97cSDaniel Pereira- `Modo Emacs Ediff <https://www.emacswiki.org/emacs/EdiffMode>`__ 122*4f98d97cSDaniel Pereira- `vimdiff/gvimdiff <https://linux.die.net/man/1/vimdiff>`__ 123*4f98d97cSDaniel Pereira- `KDiff3 <http://kdiff3.sourceforge.net/>`__ 124*4f98d97cSDaniel Pereira- `TortoiseMerge <https://tortoisesvn.net/TortoiseMerge.html>`__ 125*4f98d97cSDaniel Pereira- `Meld <https://meldmerge.org/help/>`__ 126*4f98d97cSDaniel Pereira- `P4Merge <https://www.perforce.com/products/helix-core-apps/merge-diff-tool-p4merge>`__ 127*4f98d97cSDaniel Pereira- `Beyond Compare <https://www.scootersoftware.com/>`__ 128*4f98d97cSDaniel Pereira- `IntelliJ <https://www.jetbrains.com/help/idea/resolve-conflicts.html>`__ 129*4f98d97cSDaniel Pereira- `VSCode <https://code.visualstudio.com/docs/editor/versioncontrol>`__ 130*4f98d97cSDaniel Pereira 131*4f98d97cSDaniel PereiraPara configurar o git para funcionar com elas, veja ``git mergetool --help`` ou 132*4f98d97cSDaniel Pereiraa `documentação oficial do git-mergetool`_. 133*4f98d97cSDaniel Pereira 134*4f98d97cSDaniel Pereira.. _documentação oficial do git-mergetool: https://git-scm.com/docs/git-mergetool 135*4f98d97cSDaniel Pereira 136*4f98d97cSDaniel PereiraPatches pré-requisitos 137*4f98d97cSDaniel Pereira---------------------- 138*4f98d97cSDaniel Pereira 139*4f98d97cSDaniel PereiraA maioria dos conflitos acontece porque a ramificação para a qual você está 140*4f98d97cSDaniel Pereirafazendo o backport não possui alguns patches em comparação com a ramificação a 141*4f98d97cSDaniel Pereirapartir da qual você está fazendo o backport. No caso mais geral (como a 142*4f98d97cSDaniel Pereiramesclagem de duas ramificações independentes), o desenvolvimento poderia ter 143*4f98d97cSDaniel Pereiraocorrido em qualquer uma das ramificações, ou as ramificações simplesmente 144*4f98d97cSDaniel Pereiradivergiram -- talvez a sua ramificação mais antiga tenha recebido alguns outros 145*4f98d97cSDaniel Pereirabackports que, por si só, precisaram de resoluções de conflitos, causando uma 146*4f98d97cSDaniel Pereiradivergência. 147*4f98d97cSDaniel Pereira 148*4f98d97cSDaniel PereiraÉ importante sempre identificar o commit ou os commits que causaram o conflito, 149*4f98d97cSDaniel Pereirapois, caso contrário, você não poderá ter confiança na correção da sua 150*4f98d97cSDaniel Pereiraresolução. Como um bônus adicional, especialmente se o patch for em uma área com 151*4f98d97cSDaniel Pereiraa qual você não está muito familiarizado, os registros de alterações (changelogs) 152*4f98d97cSDaniel Pereiradesses commits frequentemente lhe darão o contexto para entender o código e os 153*4f98d97cSDaniel Pereiraproblemas ou armadilhas potenciais com a sua resolução de conflito. 154*4f98d97cSDaniel Pereira 155*4f98d97cSDaniel Pereiragit log 156*4f98d97cSDaniel Pereira~~~~~~~ 157*4f98d97cSDaniel Pereira 158*4f98d97cSDaniel PereiraUm bom primeiro passo é olhar o ``git log`` para o arquivo que possui o 159*4f98d97cSDaniel Pereiraconflito -- isso geralmente é suficiente quando não há muitos patches no 160*4f98d97cSDaniel Pereiraarquivo, mas pode ficar confuso se o arquivo for grande e frequentemente 161*4f98d97cSDaniel Pereiramodificado por patches. Você deve executar o ``git log`` no intervalo de commits 162*4f98d97cSDaniel Pereiraentre a sua ramificação atualmente ativa (``HEAD``) e o pai do patch que você está 163*4f98d97cSDaniel Pereiraescolhendo (``<commit>``), ou seja:: 164*4f98d97cSDaniel Pereira 165*4f98d97cSDaniel Pereira git log HEAD..<commit>^ -- <path> 166*4f98d97cSDaniel Pereira 167*4f98d97cSDaniel PereiraMelhor ainda, se você quiser restringir essa saída a uma única função (porque é 168*4f98d97cSDaniel Pereiraonde o conflito aparece), você pode usar a seguinte sintaxe:: 169*4f98d97cSDaniel Pereira 170*4f98d97cSDaniel Pereira git log -L:'\<function\>':<path> HEAD..<commit>^ 171*4f98d97cSDaniel Pereira 172*4f98d97cSDaniel Pereira.. note:: 173*4f98d97cSDaniel Pereira O ``\<`` e o ``\>`` ao redor do nome da função garantem que as 174*4f98d97cSDaniel Pereira correspondências fiquem ancoradas em um limite de palavra. Isso é 175*4f98d97cSDaniel Pereira importante, pois essa parte é na verdade uma regex e o git segue apenas a 176*4f98d97cSDaniel Pereira primeira correspondência; portanto, se você usar 177*4f98d97cSDaniel Pereira ``-L:thread_stack:kernel/fork.c``, ele poderá fornecer apenas resultados 178*4f98d97cSDaniel Pereira para a função ``try_release_thread_stack_to_cache``, embora existam muitas 179*4f98d97cSDaniel Pereira outras funções naquele arquivo contendo a string ``thread_stack`` em seus 180*4f98d97cSDaniel Pereira nomes. 181*4f98d97cSDaniel Pereira 182*4f98d97cSDaniel PereiraOutra opção útil para o ``git log`` é a ``-G``, que permite filtrar por certas 183*4f98d97cSDaniel Pereirastrings que aparecem nos diffs dos commits que você está listando:: 184*4f98d97cSDaniel Pereira 185*4f98d97cSDaniel Pereira git log -G'regex' HEAD..<commit>^ -- <path> 186*4f98d97cSDaniel Pereira 187*4f98d97cSDaniel PereiraEsta também pode ser uma maneira prática de encontrar rapidamente quando algo 188*4f98d97cSDaniel Pereira(por exemplo, uma chamada de função ou uma variável) foi alterado, adicionado 189*4f98d97cSDaniel Pereiraou removido. A string de busca é uma expressão regular, o que significa que você 190*4f98d97cSDaniel Pereirapode potencialmente buscar por coisas mais específicas, como atribuições a um 191*4f98d97cSDaniel Pereiramembro específico de uma struct:: 192*4f98d97cSDaniel Pereira 193*4f98d97cSDaniel Pereira git log -G'\->index\>.*=' 194*4f98d97cSDaniel Pereira 195*4f98d97cSDaniel Pereiragit blame 196*4f98d97cSDaniel Pereira~~~~~~~~~ 197*4f98d97cSDaniel Pereira 198*4f98d97cSDaniel PereiraOutra maneira de encontrar commits pré-requisitos (embora apenas o mais recente 199*4f98d97cSDaniel Pereirapara um determinado conflito) é executar o ``git blame``. Neste caso, você 200*4f98d97cSDaniel Pereiraprecisa executá-lo no commit pai do patch para o qual está fazendo o 201*4f98d97cSDaniel Pereiracherry-pick e no arquivo onde o conflito apareceu, ou seja:: 202*4f98d97cSDaniel Pereira 203*4f98d97cSDaniel Pereira git blame <commit>^ -- <path> 204*4f98d97cSDaniel Pereira 205*4f98d97cSDaniel PereiraEste comando também aceita o argumento ``-L`` (para restringir a saída a uma 206*4f98d97cSDaniel Pereiraúnica função), mas, neste caso, você especifica o nome do arquivo no final do 207*4f98d97cSDaniel Pereiracomando, como de costume:: 208*4f98d97cSDaniel Pereira 209*4f98d97cSDaniel Pereira git blame -L:'\<function\>' <commit>^ -- <path> 210*4f98d97cSDaniel Pereira 211*4f98d97cSDaniel PereiraNavegue até o local onde o conflito ocorreu. A primeira coluna da saída do 212*4f98d97cSDaniel Pereirablame é o ID do commit do patch que adicionou uma determinada linha de código. 213*4f98d97cSDaniel Pereira 214*4f98d97cSDaniel PereiraPode ser uma boa ideia dar um ``git show`` nesses commits e ver se eles se 215*4f98d97cSDaniel Pereiraparecem com a possível origem do conflito. Às vezes, haverá mais de um desses 216*4f98d97cSDaniel Pereiracommits, seja porque múltiplos commits alteraram linhas diferentes da mesma área 217*4f98d97cSDaniel Pereirade conflito *ou* porque múltiplos patches subsequentes alteraram a mesma linha 218*4f98d97cSDaniel Pereira(ou linhas) várias vezes. Neste último caso, você pode ter que executar o 219*4f98d97cSDaniel Pereira``git blame`` novamente e especificar a versão mais antiga do arquivo para 220*4f98d97cSDaniel Pereiraanalisar, a fim de cavar mais fundo no histórico do arquivo. 221*4f98d97cSDaniel Pereira 222*4f98d97cSDaniel PereiraPatches pré-requisitos vs. incidentais 223*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224*4f98d97cSDaniel Pereira 225*4f98d97cSDaniel PereiraTendo encontrado o patch que causou o conflito, você precisa determinar se ele 226*4f98d97cSDaniel Pereiraé um pré-requisito para o patch que você está fazendo o backport ou se é apenas 227*4f98d97cSDaniel Pereiraincidental e pode ser pulado. Um patch incidental seria aquele que toca no mesmo 228*4f98d97cSDaniel Pereiracódigo que o patch para o qual você está fazendo o backport, mas não altera a 229*4f98d97cSDaniel Pereirasemântica do código de nenhuma forma relevante. Por exemplo, um patch de limpeza 230*4f98d97cSDaniel Pereirade espaços em branco é completamente incidental -- da mesma forma, um patch que 231*4f98d97cSDaniel Pereirasimplesmente renomeia uma função ou uma variável também seria incidental. Por 232*4f98d97cSDaniel Pereiraoutro lado, se a função que está sendo alterada sequer existe na sua ramificação 233*4f98d97cSDaniel Pereiraatual, então isso não seria nada incidental e você precisa considerar com 234*4f98d97cSDaniel Pereiracuidado se o patch que adiciona a função deve ser aplicado via cherry-pick 235*4f98d97cSDaniel Pereiraprimeiro. 236*4f98d97cSDaniel Pereira 237*4f98d97cSDaniel PereiraSe você descobrir que há um patch pré-requisito necessário, então você precisa 238*4f98d97cSDaniel Pereiraparar e fazer o cherry-pick dele em vez disso. Se você já resolveu alguns 239*4f98d97cSDaniel Pereiraconflitos em um arquivo diferente e não quer fazer isso de novo, você pode 240*4f98d97cSDaniel Pereiracriar uma cópia temporária daquele arquivo. 241*4f98d97cSDaniel Pereira 242*4f98d97cSDaniel PereiraPara abortar o cherry-pick atual, vá em frente e execute 243*4f98d97cSDaniel Pereira``git cherry-pick --abort`` e, em seguida, reinicie o processo de cherry-pick 244*4f98d97cSDaniel Pereiracom o ID do commit do patch pré-requisito. 245*4f98d97cSDaniel Pereira 246*4f98d97cSDaniel PereiraEntendendo os marcadores de conflito 247*4f98d97cSDaniel Pereira------------------------------------ 248*4f98d97cSDaniel Pereira 249*4f98d97cSDaniel PereiraDiffs combinados 250*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~ 251*4f98d97cSDaniel Pereira 252*4f98d97cSDaniel PereiraDigamos que você tenha decidido não fazer o cherry-pick (ou o revert) de patches 253*4f98d97cSDaniel Pereiraadicionais e quer apenas resolver o conflito. O Git terá inserido marcadores de 254*4f98d97cSDaniel Pereiraconflito no seu arquivo. Por padrão, isso se parecerá com algo como:: 255*4f98d97cSDaniel Pereira 256*4f98d97cSDaniel Pereira <<<<<<< HEAD 257*4f98d97cSDaniel Pereira this is what's in your current tree before cherry-picking 258*4f98d97cSDaniel Pereira ======= 259*4f98d97cSDaniel Pereira this is what the patch wants it to be after cherry-picking 260*4f98d97cSDaniel Pereira >>>>>>> <commit>... title 261*4f98d97cSDaniel Pereira 262*4f98d97cSDaniel PereiraIsso é o que você veria se abrisse o arquivo no seu editor. No entanto, se você 263*4f98d97cSDaniel Pereiraexecutasse o ``git diff`` sem nenhum argumento, a saída seria algo assim:: 264*4f98d97cSDaniel Pereira 265*4f98d97cSDaniel Pereira $ git diff 266*4f98d97cSDaniel Pereira [...] 267*4f98d97cSDaniel Pereira ++<<<<<<<< HEAD 268*4f98d97cSDaniel Pereira +this is what's in your current tree before cherry-picking 269*4f98d97cSDaniel Pereira ++======== 270*4f98d97cSDaniel Pereira + this is what the patch wants it to be after cherry-picking 271*4f98d97cSDaniel Pereira ++>>>>>>>> <commit>... title 272*4f98d97cSDaniel Pereira 273*4f98d97cSDaniel PereiraQuando você está resolvendo um conflito, o comportamento do ``git diff`` difere 274*4f98d97cSDaniel Pereirado seu comportamento normal. Note as duas colunas de marcadores de diff em vez 275*4f98d97cSDaniel Pereirada coluna única usual; este é o chamado "`diff combinado`_", aqui mostrando o 276*4f98d97cSDaniel Pereiradiff de 3 vias (ou diff-de-diffs) entre: 277*4f98d97cSDaniel Pereira 278*4f98d97cSDaniel Pereira#. a ramificação atual (antes do cherry-pick) e o diretório de trabalho atual, e 279*4f98d97cSDaniel Pereira#. a ramificação atual (antes do cherry-pick) e o arquivo como ele fica após o 280*4f98d97cSDaniel Pereira patch original ter sido aplicado. 281*4f98d97cSDaniel Pereira 282*4f98d97cSDaniel Pereira.. _diff combinado: https://git-scm.com/docs/diff-format#_combined_diff_format 283*4f98d97cSDaniel Pereira 284*4f98d97cSDaniel PereiraDiffs melhores 285*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~ 286*4f98d97cSDaniel Pereira 287*4f98d97cSDaniel PereiraDiffs combinados de 3 vias incluem todas as outras alterações que aconteceram 288*4f98d97cSDaniel Pereirano arquivo entre a sua ramificação atual e a ramificação a partir da qual você 289*4f98d97cSDaniel Pereiraestá fazendo o cherry-pick. Embora isso seja útil para detectar outras 290*4f98d97cSDaniel Pereiraalterações que você precisa levar em consideração, também torna a saída do 291*4f98d97cSDaniel Pereira``git diff`` um tanto intimidadora e difícil de ler. Em vez disso, você pode 292*4f98d97cSDaniel Pereirapreferir executar ``git diff HEAD`` (ou ``git diff --ours``), que mostra apenas 293*4f98d97cSDaniel Pereirao diff entre a ramificação atual antes do cherry-pick e o diretório de trabalho 294*4f98d97cSDaniel Pereiraatual. Ele se parece com isso:: 295*4f98d97cSDaniel Pereira 296*4f98d97cSDaniel Pereira $ git diff HEAD 297*4f98d97cSDaniel Pereira [...] 298*4f98d97cSDaniel Pereira +<<<<<<<< HEAD 299*4f98d97cSDaniel Pereira this is what's in your current tree before cherry-picking 300*4f98d97cSDaniel Pereira +======== 301*4f98d97cSDaniel Pereira +this is what the patch wants it to be after cherry-picking 302*4f98d97cSDaniel Pereira +>>>>>>>> <commit>... title 303*4f98d97cSDaniel Pereira 304*4f98d97cSDaniel PereiraComo você pode ver, isso é lido exatamente como qualquer outro diff e deixa claro 305*4f98d97cSDaniel Pereiraquais linhas estão na ramificação atual e quais linhas estão sendo adicionadas 306*4f98d97cSDaniel Pereiraporque fazem parte do conflito de mesclagem ou do patch que está sendo aplicado 307*4f98d97cSDaniel Pereiravia cherry-pick. 308*4f98d97cSDaniel Pereira 309*4f98d97cSDaniel PereiraEstilos de mesclagem e diff3 310*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 311*4f98d97cSDaniel Pereira 312*4f98d97cSDaniel PereiraO estilo padrão de marcador de conflito mostrado acima é conhecido como o estilo 313*4f98d97cSDaniel Pereira``merge``. Também está disponível um outro estilo, conhecido como o estilo 314*4f98d97cSDaniel Pereira``diff3``, que se parece com isso:: 315*4f98d97cSDaniel Pereira 316*4f98d97cSDaniel Pereira <<<<<<< HEAD 317*4f98d97cSDaniel Pereira this is what is in your current tree before cherry-picking 318*4f98d97cSDaniel Pereira ||||||| parent of <commit> (title) 319*4f98d97cSDaniel Pereira this is what the patch expected to find there 320*4f98d97cSDaniel Pereira ======= 321*4f98d97cSDaniel Pereira this is what the patch wants it to be after being applied 322*4f98d97cSDaniel Pereira >>>>>>> <commit> (title) 323*4f98d97cSDaniel Pereira 324*4f98d97cSDaniel PereiraComo você pode ver, isso tem 3 partes em vez de 2, e inclui o que o git 325*4f98d97cSDaniel Pereiraesperava encontrar lá, mas não encontrou. É *altamente recomendável* usar este 326*4f98d97cSDaniel Pereiraestilo de conflito, pois deixa muito mais claro o que o patch realmente alterou; 327*4f98d97cSDaniel Pereiraou seja, ele permite que você compare as versões de antes e depois do arquivo 328*4f98d97cSDaniel Pereirapara o commit do qual está fazendo o cherry-pick. Isso permite que você tome 329*4f98d97cSDaniel Pereiramelhores decisões sobre como resolver o conflito. 330*4f98d97cSDaniel Pereira 331*4f98d97cSDaniel PereiraPara alterar os estilos de marcadores de conflito, você pode usar o seguinte 332*4f98d97cSDaniel Pereiracomando:: 333*4f98d97cSDaniel Pereira 334*4f98d97cSDaniel Pereira git config merge.conflictStyle diff3 335*4f98d97cSDaniel Pereira 336*4f98d97cSDaniel PereiraExiste uma terceira opção, ``zdiff3``, introduzida no `Git 2.35`_, que possui as 337*4f98d97cSDaniel Pereiramesmas 3 seções do ``diff3``, mas onde as linhas comuns foram cortadas, tornando 338*4f98d97cSDaniel Pereiraa área de conflito menor em alguns casos. 339*4f98d97cSDaniel Pereira 340*4f98d97cSDaniel Pereira.. _Git 2.35: https://github.blog/2022-01-24-highlights-from-git-2-35/ 341*4f98d97cSDaniel Pereira 342*4f98d97cSDaniel PereiraIterando em resoluções de conflito 343*4f98d97cSDaniel Pereira---------------------------------- 344*4f98d97cSDaniel Pereira 345*4f98d97cSDaniel PereiraO primeiro passo em qualquer processo de resolução de conflito é entender o 346*4f98d97cSDaniel Pereirapatch para o qual você está fazendo o backport. Para o kernel Linux, isso é 347*4f98d97cSDaniel Pereiraespecialmente importante, pois uma alteração incorreta pode levar ao travamento 348*4f98d97cSDaniel Pereirade todo o sistema -- ou pior, a uma vulnerabilidade de segurança não detectada. 349*4f98d97cSDaniel Pereira 350*4f98d97cSDaniel PereiraEntender o patch pode ser fácil ou difícil, dependendo do próprio patch, do 351*4f98d97cSDaniel Pereiraregistro de alterações (changelog) e da sua familiaridade com o código que está 352*4f98d97cSDaniel Pereirasendo alterado. No entanto, uma boa pergunta para cada alteração (ou cada bloco/ 353*4f98d97cSDaniel Pereirahunk do patch) seria: "Por que este hunk está no patch?" As respostas a essas 354*4f98d97cSDaniel Pereiraperguntas orientarão a sua resolução de conflito. 355*4f98d97cSDaniel Pereira 356*4f98d97cSDaniel PereiraProcesso de resolução 357*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~~~~~~ 358*4f98d97cSDaniel Pereira 359*4f98d97cSDaniel PereiraÀs vezes, a coisa mais fácil a fazer é apenas remover tudo, exceto a primeira 360*4f98d97cSDaniel Pereiraparteda do conflito, deixando o arquivo essencialmente inalterado, e aplicar 361*4f98d97cSDaniel Pereiraas alterações manualmente. Talvez o patch esteja alterando um argumento de 362*4f98d97cSDaniel Pereirachamada de função de ``0`` para ``1``, enquanto uma alteração conflitante 363*4f98d97cSDaniel Pereiraadicionou um parâmetro totalmente novo (e insignificante) ao final da lista de 364*4f98d97cSDaniel Pereiraparâmetros; nesse caso, é bastante fácil alterar o argumento de ``0`` para ``1`` 365*4f98d97cSDaniel Pereiramanualmente e deixar o restante dos argumentos como estão. Esta técnica de 366*4f98d97cSDaniel Pereiraaplicar alterações manualmente é mais útil se o conflito tiver trazido muito 367*4f98d97cSDaniel Pereiracontexto não relacionado com o qual você não precisa realmente se preocupar. 368*4f98d97cSDaniel Pereira 369*4f98d97cSDaniel PereiraPara conflitos particularmente difíceis com muitos marcadores de conflito, você 370*4f98d97cSDaniel Pereirapode usar ``git add`` ou ``git add -i`` para indexar (stage) seletivamente as 371*4f98d97cSDaniel Pereirasuas resoluções para tirá-las do caminho; isso também permite que você use 372*4f98d97cSDaniel Pereira``git diff HEAD`` para ver sempre o que ainda resta a ser resolvido ou 373*4f98d97cSDaniel Pereira``git diff --cached`` para ver como está o seu patch até o momento. 374*4f98d97cSDaniel Pereira 375*4f98d97cSDaniel PereiraLidando com arquivos renomeados 376*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 377*4f98d97cSDaniel Pereira 378*4f98d97cSDaniel PereiraUma das coisas mais irritantes que podem acontecer ao fazer o backport de um 379*4f98d97cSDaniel Pereirapatch é descobrir que um dos arquivos modificados foi renomeado, pois isso 380*4f98d97cSDaniel Pereirageralmente significa que o git sequer colocará marcadores de conflito, mas 381*4f98d97cSDaniel Pereiraapenas lavará as mãos e dirá (parafraseando): "Caminho não mesclado! Faça você o 382*4f98d97cSDaniel Pereiratrabalho..." 383*4f98d97cSDaniel Pereira 384*4f98d97cSDaniel PereiraGeralmente existem algumas maneiras de lidar com isso. Se o patch para o 385*4f98d97cSDaniel Pereiraarquivo renomeado for pequeno, como uma alteração de uma única linha, a coisa 386*4f98d97cSDaniel Pereiramais fácil é prosseguir, aplicar a alteração manualmente e dar o caso por 387*4f98d97cSDaniel Pereiraencerrado. Por outro lado, se a alteração for grande ou complicada, você 388*4f98d97cSDaniel Pereiradefinitivamente não vai querer fazê-la manualmente. 389*4f98d97cSDaniel Pereira 390*4f98d97cSDaniel PereiraComo uma primeira tentativa, você pode tentar algo assim, que reduzirá o limite 391*4f98d97cSDaniel Pereira(threshold) de detecção de renomeação para 30% (por padrão, o git usa 50%, o que 392*4f98d97cSDaniel Pereirasignifica que dois arquivos precisam ter pelo menos 50% em comum para que ele 393*4f98d97cSDaniel Pereiraconsidere um par de adição/remoção como uma renomeação potencial):: 394*4f98d97cSDaniel Pereira 395*4f98d97cSDaniel Pereira git cherry-pick -strategy=recursive -Xrename-threshold=30 396*4f98d97cSDaniel Pereira 397*4f98d97cSDaniel PereiraÀs vezes, a coisa certa a fazer será fazer o backport também do patch que 398*4f98d97cSDaniel Pereirarealizou a renomeação, mas esse definitivamente não é o caso mais comum. Em vez 399*4f98d97cSDaniel Pereiradisso, o que você pode fazer é renomear temporariamente o arquivo na 400*4f98d97cSDaniel Pereiraramificação para a qual está fazendo o backport (usando ``git mv`` e commitando 401*4f98d97cSDaniel Pereirao resultado), reiniciar a tentativa de cherry-pick do patch, renomear o arquivo 402*4f98d97cSDaniel Pereirade volta (``git mv`` e commitando novamente) e, finalmente, esmagar (squash) o 403*4f98d97cSDaniel Pereiraresultado usando ``git rebase -i`` (veja o `tutorial de rebase`_) para que ele 404*4f98d97cSDaniel Pereiraapareça como um único commit quando você terminar. 405*4f98d97cSDaniel Pereira 406*4f98d97cSDaniel Pereira.. _tutorial de rebase: [https://medium.com/@slamflipstrom/a-beginners-guide-to-squashing-commits-with-git-rebase-8185cf6e62ec](https://medium.com/@slamflipstrom/a-beginners-guide-to-squashing-commits-with-git-rebase-8185cf6e62ec) 407*4f98d97cSDaniel Pereira 408*4f98d97cSDaniel PereiraPegadinhas 409*4f98d97cSDaniel Pereira---------- 410*4f98d97cSDaniel Pereira 411*4f98d97cSDaniel PereiraArgumentos de função 412*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~~~~~ 413*4f98d97cSDaniel Pereira 414*4f98d97cSDaniel PereiraPreste atenção às alterações em argumentos de função! É fácil deixar passar 415*4f98d97cSDaniel Pereiradetalhes e pensar que duas linhas são iguais quando, na verdade, elas diferem em 416*4f98d97cSDaniel Pereiraalgum pequeno detalhe, como qual variável foi passada como argumento 417*4f98d97cSDaniel Pereira(especialmente se as duas variáveis forem de apenas um caractere e parecerem 418*4f98d97cSDaniel Pereiraiguais, como i e j). 419*4f98d97cSDaniel Pereira 420*4f98d97cSDaniel PereiraTratamento de erros 421*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~~~~ 422*4f98d97cSDaniel Pereira 423*4f98d97cSDaniel PereiraSe você fizer o cherry-pick de um patch que inclua uma instrução ``goto`` 424*4f98d97cSDaniel Pereira(geralmente para tratamento de erros), é absolutamente imperativo verificar em 425*4f98d97cSDaniel Pereiradobro se o rótulo (label) de destino ainda está correto na ramificação para a 426*4f98d97cSDaniel Pereiraqual você está fazendo o backport. O mesmo vale para instruções ``return``, 427*4f98d97cSDaniel Pereira``break`` e ``continue`` adicionadas. 428*4f98d97cSDaniel Pereira 429*4f98d97cSDaniel PereiraO tratamento de erros geralmente fica localizado no final da função, portanto, 430*4f98d97cSDaniel Pereirapode não fazer parte do conflito, mesmo que possa ter sido alterado por outros 431*4f98d97cSDaniel Pereirapatches. 432*4f98d97cSDaniel Pereira 433*4f98d97cSDaniel PereiraUma boa maneira de garantir que você revise os caminhos de erro é sempre usar 434*4f98d97cSDaniel Pereira``git diff -W`` e ``git show -W`` (também conhecido como ``--function-context``) 435*4f98d97cSDaniel Pereiraao inspecionar suas alterações. Para código em C, isso mostrará toda a função 436*4f98d97cSDaniel Pereiraque está sendo alterada em um patch. Uma das coisas que frequentemente dão 437*4f98d97cSDaniel Pereiraerrado durante backports é que algo mais na função mudou em qualquer uma das 438*4f98d97cSDaniel Pereiraramificações a partir da qual ou para a qual você está fazendo o backport. Ao 439*4f98d97cSDaniel Pereiraincluir a função inteira no diff, você obtém mais contexto e pode identificar 440*4f98d97cSDaniel Pereiramais facilmente problemas que de outra forma poderiam passar despercebidos. 441*4f98d97cSDaniel Pereira 442*4f98d97cSDaniel PereiraCódigo refatorado 443*4f98d97cSDaniel Pereira~~~~~~~~~~~~~~~~~ 444*4f98d97cSDaniel Pereira 445*4f98d97cSDaniel PereiraAlgo que acontece com bastante frequência é o código ser refatorado ao "isolar" 446*4f98d97cSDaniel Pereirauma sequência ou padrão de código comum em uma função auxiliar. Ao fazer o 447*4f98d97cSDaniel Pereirabackport de patches para uma área onde tal refatoração ocorreu, você efetivamente 448*4f98d97cSDaniel Pereiraprecisa fazer o inverso ao realizar o backport: um patch para um único local pode 449*4f98d97cSDaniel Pereiraprecisar ser aplicado a múltiplos locais na versão que recebeu o backport. (Um 450*4f98d97cSDaniel Pereiraindicativo para este cenário é que uma função foi renomeada -- mas nem sempre é o 451*4f98d97cSDaniel Pereiracaso.) 452*4f98d97cSDaniel Pereira 453*4f98d97cSDaniel PereiraPara evitar backports incompletos, vale a pena tentar descobrir se o patch 454*4f98d97cSDaniel Pereiracorrige um bug que aparece em mais de um lugar. Uma maneira de fazer isso seria 455*4f98d97cSDaniel Pereirausar o ``git grep``. (Isso, na verdade, é uma boa ideia de se fazer em geral, não 456*4f98d97cSDaniel Pereiraapenas para backports.) Se você descobrir que o mesmo tipo de correção se 457*4f98d97cSDaniel Pereiraaplicaria a outros lugares, também vale a pena ver se esses lugares existem no 458*4f98d97cSDaniel Pereiraupstream -- se não existirem, é provável que o patch precise ser ajustado. O 459*4f98d97cSDaniel Pereira``git log`` é seu amigo para descobrir o que aconteceu com essas áreas, já que o 460*4f98d97cSDaniel Pereira``git blame`` não mostrará código que foi removido. 461*4f98d97cSDaniel Pereira 462*4f98d97cSDaniel PereiraSe você encontrar outras instâncias do mesmo padrão na árvore do upstream e não 463*4f98d97cSDaniel Pereirativer certeza se isso também é um bug, pode valer a pena perguntar ao autor do 464*4f98d97cSDaniel Pereirapatch. Não é incomum encontrar novos bugs durante o processo de backport! 465*4f98d97cSDaniel Pereira 466*4f98d97cSDaniel PereiraVerificando o resultado 467*4f98d97cSDaniel Pereira======================= 468*4f98d97cSDaniel Pereira 469*4f98d97cSDaniel Pereiracolordiff 470*4f98d97cSDaniel Pereira--------- 471*4f98d97cSDaniel Pereira 472*4f98d97cSDaniel PereiraTendo commitado um novo patch sem conflitos, você pode agora comparar o seu 473*4f98d97cSDaniel Pereirapatch com o patch original. É altamente recomendável que você use uma 474*4f98d97cSDaniel Pereiraferramenta como o `colordiff`_ que possa mostrar dois arquivos lado a lado e 475*4f98d97cSDaniel Pereiracolori-los de acordo com as alterações entre eles:: 476*4f98d97cSDaniel Pereira 477*4f98d97cSDaniel Pereira colordiff -yw -W 200 <(git diff -W <upstream commit>^-) <(git diff -W HEAD^-) | less -SR 478*4f98d97cSDaniel Pereira 479*4f98d97cSDaniel Pereira.. _colordiff: https://www.colordiff.org/ 480*4f98d97cSDaniel Pereira 481*4f98d97cSDaniel PereiraAqui, ``-y`` significa fazer uma comparação lado a lado; ``-w`` ignora 482*4f98d97cSDaniel Pereiraespaços em branco e ``-W 200`` define a largura da saída (caso contrário, ele 483*4f98d97cSDaniel Pereirausará 130 por padrão, o que costuma ser um pouco pouco). 484*4f98d97cSDaniel Pereira 485*4f98d97cSDaniel PereiraA sintaxe ``rev^-`` é um atalho prático para ``rev^..rev``, essencialmente 486*4f98d97cSDaniel Pereirafornecendo apenas o diff para aquele único commit; veja também a 487*4f98d97cSDaniel Pereira`documentação oficial do git rev-parse`_. 488*4f98d97cSDaniel Pereira 489*4f98d97cSDaniel Pereira.. _documentação oficial do git rev-parse: https://git-scm.com/docs/git-rev-parse#_other_rev_parent_shorthand_notations 490*4f98d97cSDaniel Pereira 491*4f98d97cSDaniel PereiraNovamente, note a inclusão de ``-W`` para o ``git diff``; isso garante que você 492*4f98d97cSDaniel Pereiraverá a função completa para qualquer função que tenha mudado. 493*4f98d97cSDaniel Pereira 494*4f98d97cSDaniel PereiraUma coisa incrivelmente importante que o colordiff faz é destacar as linhas que 495*4f98d97cSDaniel Pereirasão diferentes. Por exemplo, se um ``goto`` de tratamento de erros teve seus 496*4f98d97cSDaniel Pereirarótulos alterados entre o patch original e o que sofreu o backport, o colordiff 497*4f98d97cSDaniel Pereirairá mostrá-los lado a lado, mas destacados em uma cor diferente. Assim, é fácil 498*4f98d97cSDaniel Pereiraver que as duas instruções ``goto`` estão saltando para rótulos diferentes. Da 499*4f98d97cSDaniel Pereiramesma forma, linhas que não foram modificadas por nenhum dos patches, mas que 500*4f98d97cSDaniel Pereiradiferem no contexto, também serão destacadas e, portanto, se destacarão durante 501*4f98d97cSDaniel Pereirauma inspeção manual. 502*4f98d97cSDaniel Pereira 503*4f98d97cSDaniel PereiraClaro, esta é apenas uma inspeção visual; o teste real é compilar e executar o 504*4f98d97cSDaniel Pereirakernel (ou programa) com o patch aplicado. 505*4f98d97cSDaniel Pereira 506*4f98d97cSDaniel PereiraTestes de compilação (Build testing) 507*4f98d97cSDaniel Pereira------------------------------------ 508*4f98d97cSDaniel Pereira 509*4f98d97cSDaniel PereiraNão abordaremos os testes em tempo de execução aqui, mas pode ser uma boa ideia 510*4f98d97cSDaniel Pereiracompilar apenas os arquivos tocados pelo patch como uma verificação rápida de 511*4f98d97cSDaniel Pereirasanidade. Para o kernel Linux, você pode compilar arquivos únicos assim, 512*4f98d97cSDaniel Pereiraassumindo que você tenha o ``.config`` e o ambiente de compilação configurados 513*4f98d97cSDaniel Pereiracorretamente:: 514*4f98d97cSDaniel Pereira 515*4f98d97cSDaniel Pereira make caminho/para/o/arquivo.o 516*4f98d97cSDaniel Pereira 517*4f98d97cSDaniel PereiraNote que isso não descobrirá erros de ligação (linker errors), então você ainda 518*4f98d97cSDaniel Pereiradeve fazer uma compilação completa após verificar que o arquivo único compila. 519*4f98d97cSDaniel PereiraAo compilar o arquivo único primeiro, você pode evitar ter que esperar por uma 520*4f98d97cSDaniel Pereiracompilação completa *caso* haja erros de compilador em qualquer um dos arquivos 521*4f98d97cSDaniel Pereiraque você alterou. 522*4f98d97cSDaniel Pereira 523*4f98d97cSDaniel PereiraTestes em tempo de execução 524*4f98d97cSDaniel Pereira--------------------------- 525*4f98d97cSDaniel Pereira 526*4f98d97cSDaniel PereiraMesmo um teste de compilação ou de boot bem-sucedido não é necessariamente o 527*4f98d97cSDaniel Pereirasuficiente para descartar uma dependência ausente em algum lugar. Embora as 528*4f98d97cSDaniel Pereirachances sejam pequenas, pode haver alterações de código onde duas modificações 529*4f98d97cSDaniel Pereiraindependentes no mesmo arquivo resultem em nenhum conflito, nenhum erro em tempo 530*4f98d97cSDaniel Pereirade compilação e erros em tempo de execução apenas em casos excepcionais. 531*4f98d97cSDaniel Pereira 532*4f98d97cSDaniel PereiraUm exemplo concreto disso foi um par de patches para o código de entrada de 533*4f98d97cSDaniel Pereirachamada de sistema (system call entry code), onde o primeiro patch salvava/ 534*4f98d97cSDaniel Pereirarestaurava um registrador e um patch posterior fazia uso do mesmo registrador 535*4f98d97cSDaniel Pereiraem algum lugar no meio dessa sequência. Como não havia sobreposição entre as 536*4f98d97cSDaniel Pereiraalterações, era possível fazer o cherry-pick do segundo patch, não ter conflitos 537*4f98d97cSDaniel Pereirae acreditar que tudo estava bem, quando na verdade o código estava agora 538*4f98d97cSDaniel Pereirasobrescrevendo (scribbling over) um registrador não salvo. 539*4f98d97cSDaniel Pereira 540*4f98d97cSDaniel PereiraEmbora a vasta maioria dos erros seja capturada durante a compilação ou ao 541*4f98d97cSDaniel Pereiraexercitar o código superficialmente, a única maneira de *realmente* verificar um 542*4f98d97cSDaniel Pereirabackport é revisar o patch final com o mesmo nível de escrutínio que você daria 543*4f98d97cSDaniel Pereira(ou deveria dar) a qualquer outro patch. Ter testes unitários e testes de 544*4f98d97cSDaniel Pereiraregressão ou outros tipos de testes automáticos pode ajudar a aumentar a 545*4f98d97cSDaniel Pereiraconfiança na correção de um backport. 546*4f98d97cSDaniel Pereira 547*4f98d97cSDaniel PereiraEnviando backports para a árvore estável (stable) 548*4f98d97cSDaniel Pereira================================================= 549*4f98d97cSDaniel Pereira 550*4f98d97cSDaniel PereiraÀ medida que os mantenedores da árvore estável tentam aplicar correções da linha 551*4f98d97cSDaniel Pereiraprincipal (mainline) em seus kernels estáveis via cherry-pick, eles podem enviar 552*4f98d97cSDaniel Pereirae-mails solicitando backports quando encontram conflitos; veja, por exemplo, 553*4f98d97cSDaniel Pereira<https://lore.kernel.org/stable/2023101528-jawed-shelving-071a@gregkh/>. 554*4f98d97cSDaniel PereiraEsses e-mails normalmente incluem os passos exatos que você precisa seguir para 555*4f98d97cSDaniel Pereirafazer o cherry-pick do patch para a árvore correta e enviá-lo. 556*4f98d97cSDaniel Pereira 557*4f98d97cSDaniel PereiraUma coisa a se certificar é que o seu registro de alterações (changelog) esteja 558*4f98d97cSDaniel Pereiraem conformidade com o formato esperado:: 559*4f98d97cSDaniel Pereira 560*4f98d97cSDaniel Pereira <original patch title> 561*4f98d97cSDaniel Pereira 562*4f98d97cSDaniel Pereira [ Upstream commit <mainline rev> ] 563*4f98d97cSDaniel Pereira 564*4f98d97cSDaniel Pereira <rest of the original changelog> 565*4f98d97cSDaniel Pereira [ <summary of the conflicts and their resolutions> ] 566*4f98d97cSDaniel Pereira Signed-off-by: <your name and email> 567*4f98d97cSDaniel Pereira 568*4f98d97cSDaniel PereiraA linha "Upstream commit" às vezes é ligeiramente diferente dependendo da versão 569*4f98d97cSDaniel Pereiraestável. Versões mais antigas usavam este formato:: 570*4f98d97cSDaniel Pereira 571*4f98d97cSDaniel Pereira commit <mainline rev> upstream. 572*4f98d97cSDaniel Pereira 573*4f98d97cSDaniel PereiraO mais comum é indicar a versão do kernel à qual o patch se aplica na linha de 574*4f98d97cSDaniel Pereiraassunto do e-mail (usando, por exemplo, 575*4f98d97cSDaniel Pereira``git send-email --subject-prefix='PATCH 6.1.y'``), mas você também pode 576*4f98d97cSDaniel Pereiracolocá-la na área do Signed-off-by: ou abaixo da linha ``---``. 577*4f98d97cSDaniel Pereira 578*4f98d97cSDaniel PereiraOs mantenedores da árvore estável esperam envios separados para cada versão 579*4f98d97cSDaniel Pereiraestável ativa, e cada envio também deve ser testado separadamente. 580*4f98d97cSDaniel Pereira 581*4f98d97cSDaniel PereiraAlgumas palavras finais de conselho 582*4f98d97cSDaniel Pereira=================================== 583*4f98d97cSDaniel Pereira 584*4f98d97cSDaniel Pereira1) Aborde o processo de backport com humildade. 585*4f98d97cSDaniel Pereira2) Entenda o patch para o qual você está fazendo o backport; isso significa ler 586*4f98d97cSDaniel Pereira tanto o registro de alterações (changelog) quanto o código. 587*4f98d97cSDaniel Pereira3) Seja honesto sobre a sua confiança no resultado ao enviar o patch. 588*4f98d97cSDaniel Pereira4) Peça aprovações explícitas (acks) aos mantenedores relevantes. 589*4f98d97cSDaniel Pereira 590*4f98d97cSDaniel PereiraExemplos 591*4f98d97cSDaniel Pereira======== 592*4f98d97cSDaniel Pereira 593*4f98d97cSDaniel PereiraO texto acima mostra, de forma geral, o processo idealizado de backport de um 594*4f98d97cSDaniel Pereirapatch. Para um exemplo mais concreto, veja este tutorial em vídeo onde dois 595*4f98d97cSDaniel Pereirapatches são portados da linha principal (mainline) para a estável (stable): 596*4f98d97cSDaniel Pereira`Backporting Linux Kernel Patches`_. 597*4f98d97cSDaniel Pereira 598*4f98d97cSDaniel Pereira.. _Backporting Linux Kernel Patches: https://youtu.be/sBR7R1V2FeA