xref: /linux/Documentation/translations/pt_BR/process/backporting.rst (revision 72fdff1416e280e2baaa3cca69574defb998437e)
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