Incluir acidentalmente alterações não relacionadas em confirmações

8

Minha abordagem pessoal a um commit do git é que todo commit deve incluir uma unidade de mudança , em sua completude.

Quando desenvolvo, geralmente me concentro nessas unidades. Mas, às vezes, minha atenção se desvia para outro lugar e trabalho por um tempo em uma unidade diferente. Provavelmente não é o ideal, mas aprendi a me comprometer com cuidado ( git add --interactiveé um bom amigo meu).

No entanto, pode acontecer que eu esqueça de preparar seletivamente minhas alterações e, em vez disso, comprometa o arquivo inteiro, acreditando que todas as alterações que vejo no diff estão realmente relacionadas à mesma unidade, mesmo que possa haver uma ou duas alterações completamente independentes.

Então eu git push.

Isso é perigoso? Devo fazer um esforço para alterar o commit para que ele inclua apenas as alterações pretendidas? Minha principal preocupação é que quem quer que veja a história verá a mudança e provavelmente coçará a cabeça por vários minutos antes de perceber que é provavelmente um erro. Pior ainda, posso imaginar que a mudança pareça relacionada e o programador pode não reconhecer o erro.

O problema é que, como já enviei por push, não consigo reescrever com segurança o histórico do servidor, portanto, provavelmente eu teria que reverter a confirmação, dividi-la corretamente e confirmar novamente. Como alternativa, eu poderia simplesmente alterar o commit com uma mensagem de commit melhor, mas eu teria que ser realmente muito rápido, pois também requer reescrever o histórico. Como último recurso, eu poderia simplesmente confirmar a unidade em que estava trabalhando, deixando uma observação de que há uma alteração relacionada na confirmação anterior (mas isso parece errado).

Entendo que em configurações de vários desenvolvedores com fluxo de trabalho de revisão de código adequado, isso provavelmente não aconteceria. Também entendo que, se eu sou o único desenvolvedor de um projeto, a reescrita do histórico é a melhor solução para isso.

Robert Rossmann
fonte
Você está usando fluxo git? (prod, integração, ramificações de recursos?) Usando o fluxo git, não estou preocupado com confirmações para destacar ramificações. Mesclagens na integração são feitas na conclusão do recurso e mesclas no prod são feitas no lançamento.
precisa saber é o seguinte
argh sua tão irritante quando isso acontece, mas uma dor para revertê-lo e comprometer
Ewan
Posso ver como o uso do fluxo git pode atenuar isso (não pode funcionar em outra unidade, a menos que seja alterada / criada ramificação), mas acho que o fluxo de trabalho, no meu ambiente de trabalho atual, apenas me atrasaria. Talvez em um projeto maior / em um trabalho diferente.
Robert Rossmann

Respostas:

9

Confirmar histórico é de vital importância, mas por 3 razões:

  1. fundindo para outro lugar. Você precisa pegar as peças de um galho e colá-las em outros lugares, é importante ter todas as peças que você quer lá e nada que você não queira. Portanto, se o seu commit 'bagunçado' contiver alterações destinadas ao recurso em que você está trabalhando (e não, digamos um commit acidental de outra coisa), você estará bem.
  2. Auditar o que aconteceu algum tempo depois - geralmente para determinar quando um bug ou recurso específico foi introduzido. Nesse caso, não importa o que está nas confirmações, desde que você possa identificar a alteração na qual está interessado.
  3. Revisão de código. Boas revisões por pares são confirmadas e, em seguida, revisadas (não aguarde o processo de dev / commit aguardando um revisor!) E, nesses casos, o revisor desejará entender quais alterações foram feitas. No entanto, geralmente um revisor estará mais interessado nas alterações gerais - tentar revisar confirmações feitas, revertidas e refazidas é um exercício de perda de tempo em comparação com a revisão de todas as 3 confirmações de uma só vez.

Portanto, embora a unidade de trabalho comprometa o som ideal, eles não são algo para se insistir em termos práticos. Eu tentaria manter os commits sensatos, e a unidade de trabalho é uma boa maneira de manter os commits sãos, mas não se preocupe em tentar mexer no histórico de commit apenas para manter os commits organizados. É como atualizar um arquivo de código para alinhar todos os colchetes da maneira que você preferir - agradável, mas inútil.

Agora, se você comprometeu um pouco do trabalho destinado a uma ramificação diferente, reverta-a e comprometa-a corretamente na ramificação correta. Isso é importante, mas se você atualizou um pouco do código do servidor enquanto trabalha na GUI, não há necessidade de se preocupar com isso.

gbjbaanb
fonte
1

Quando isso acontece, não é grande coisa simplesmente reverter a alteração no próximo commit. Adicionar uma mensagem de confirmação adequada ( Removing the XYZ that I accidentally added in C92A891) será suficiente para outros desenvolvedores entenderem na revisão de código.

Em vez de se preocupar em corrigir qualquer incidente específico, tente evitar a situação em primeiro lugar.

Essa é a verdadeira questão:

No entanto, pode ser que eu esqueça de preparar seletivamente minhas alterações e, em vez disso, comprometa o arquivo inteiro

Você deve adquirir o hábito de nunca confirmar um arquivo inteiro (ou pior ainda, de todo o seu espaço de trabalho!). Sempre confirme linha por linha ou por um pedaço inteiro que você examinou.

Ao confirmar dessa maneira (o que parece que você faz na maioria das vezes), as alterações inadvertidas têm muito menos probabilidade de se infiltrar nos seus commits.

pkamb
fonte
"Sempre confirme linha por linha ou por um pedaço inteiro que você examinou." Por quê? Para mim, examinar e organizar linha por linha é a exceção, não a regra. Evito trabalhar em mais de um recurso / correção de cada vez (a troca de contexto mental é cara) e, mesmo quando preciso, oculto o trabalho e desinstalo-o conforme necessário. Por esse motivo, na maioria das vezes eu posso confirmar com confiança todas as alterações e arquivos inteiros (depois de revisar o diff, é claro) e raramente tenho que encenar tediosamente linha por linha ou examinar cada pedaço usando um complemento interativo.
ADTC
@ADTC Eu me pego criando diferenças em torno da correção real que eventualmente encontro: log, variáveis ​​de depuração, uma abordagem alternativa com falha etc. Acho que é mais fácil deixar a bagunça no lugar, confirmar apenas a correção de linha única e depois índice inteiro.
Pkamb #
0

Parece que você tem um repositório local no seu computador e um repositório compartilhado com seus colegas de trabalho em um servidor. Por que você possui apenas um repositório no seu computador local? Normalmente tenho pelo menos cinco, para poder trabalhar em uma coisa em um repositório, corrigir um bug em outra sem tocar no primeiro repositório, que pode estar em um estado incompleto, e assim por diante.

gnasher729
fonte