Na minha empresa, todo o nosso desenvolvimento (correções de bugs e novos recursos) é realizado em filiais separadas. Quando está completo, enviamos para o controle de qualidade que o testa nesse ramo e, quando eles nos dão luz verde, o mesclamos em nosso ramo principal. Isso pode levar entre um dia e um ano.
Se tentarmos compactar qualquer refatoração em uma ramificação, não sabemos por quanto tempo ela ficará "fora", para que possa causar muitos conflitos quando ela for incorporada novamente.
Por exemplo, digamos que eu queira renomear uma função porque o recurso no qual estou trabalhando está fazendo muito uso dessa função e descobri que seu nome não se encaixa realmente em seu objetivo (novamente, este é apenas um exemplo). Então, procuro todos os usos dessa função e os renomeio para seu novo nome, e tudo funciona perfeitamente, então a envio para o controle de qualidade.
Enquanto isso, novos desenvolvimentos estão acontecendo, e minha função renomeada não existe em nenhum dos ramos que estão sendo extraídos do main. Quando meu problema for mesclado novamente, todos eles serão resolvidos.
Existe alguma maneira de lidar com isso?
Não é como se a gerência aprovasse uma questão apenas para refatorar, portanto ela precisa ser incluída em outros trabalhos. Ele não pode ser desenvolvido diretamente no main, porque todas as alterações precisam passar pelo controle de qualidade e ninguém quer ser o idiota que quebrou o main, para que ele possa fazer um pouco de refatoração não essencial.