O histórico de versões é realmente sagrado ou é melhor refazer a versão?


26

Sempre concordei com o mantra 1 do Mercurial , no entanto, agora que o Mercurial vem com a extensão rebase e é uma prática popular no git, estou me perguntando se poderia realmente ser considerado uma "má prática", ou pelo menos ruim o suficiente para evitar o uso. De qualquer forma, estou ciente de que rebasar é perigoso depois de empurrar.

OTOH, vejo o ponto de tentar empacotar 5 confirmações em uma única para torná-la mais interessante (especialmente em um ramo de produção); no entanto, pessoalmente acho que seria melhor poder ver confirmações parciais em um recurso em que alguns a experimentação é feita, mesmo que não seja tão bacana, mas ver algo como "Tentei fazer do jeito X, mas não é tão ótimo quanto Y, afinal, fazer Z tomando Y como base" IMHO teria um bom valor para aqueles que estudam a base de código e siga a linha de pensamento dos desenvolvedores.

Meu ponto de vista muito opinativo (como no idiota, visceral, tendencioso) é que os programadores gostam de rebase para esconder erros ... e eu não acho que isso seja bom para o projeto.

Então, minha pergunta é: você realmente achou valioso ter tais "commits orgânicos" (ou seja, história intacta) na prática? Ou, inversamente, você prefere ter compromissos bem organizados e desconsiderar o processo de experimentação dos programadores ?; o que você escolher, por que isso funciona para você? (ter outros membros da equipe para manter o histórico ou, alternativamente, refazê-lo).


1 por análise do Google DVCS , no Mercurial "History is Sacred".


você poderia fornecer referência a onde é indicado como "mantra de Mercurial"?
— mosquito

Agora que você mencionou, acho que realmente vem do código de análise DVCS do Google.google.com/p/support/wiki/DVCSAnalysis (mas o fato permanece)
— dukeofgaming

Respostas:


22

A história é sagrada, o presente não é. Você pode dividir sua "árvore" do DVCS em duas partes:

  • O passado / histórico que contém uma visão precisa de como você atingiu o estado atual do código. Esta parte da história cresce com o tempo

  • O presente em que parte você está trabalhando atualmente para fazer seu código evoluir. Essa dica na maior parte da história tem sempre o mesmo tamanho.

Todo código que você lançou ou usou de alguma forma faz parte do passado . O passado é sagrado, porque você precisa reproduzir uma configuração ou entender o que introduziu uma regressão. Você nunca deve reescrever o passado . No git, você nunca reescreve nada quando está no master: master é a parte do passado da história. No Mercurial, você tem esse conceito de fase pública que monitora a parte passada da sua "árvore" e reforça sua imutabilidade.

A parte atual do código é o conjunto de alterações em que você está trabalhando no momento. O ramo do recurso que você está tentando tornar utilizável, sem erros e adequadamente refatorado. É perfeitamente bom reescrevê- lo; é até uma boa ideia, porque torna a parte do passado mais bonita, simples e utilizável. Mercurial rastreie isso na fase de rascunho .

Então, sim, redefina se isso melhora seu histórico. O Mercurial impedirá que você atire no próprio pé se você estiver rebaseando coisas que não deveria.


Agora, gostei mais da sua resposta
— dukeofgaming

7

Nem todos os erros são do tipo que você precisa ocultar - por exemplo, uma vez acidentalmente cometi um arquivo binário no meu repositório. A adulteração do histórico só é ruim quando a falha não está exclusivamente no próprio histórico, como arquivos confirmados que não deveriam ser.


1
Então você nunca se recuperaria para tornar um commit mais "lógico"?
— Dukeofgaming

7

A revisão de código é muito mais fácil quando há uma grande mudança coesa em oposição a muitas pequenas e dependentes.

Quando trabalho em um novo recurso, gosto de fazer muitas pequenas alterações em minha ramificação. Quando estou pronto para enviar o patch, recolho esses pequenos commits em um grande commit que representa todo o novo código necessário para esse recurso. É aqui que a rebase é útil.

Por outro lado, rebase não é aconselhável se os commits não tiverem nada a ver um com o outro. Várias adições de recursos devem ser confirmações separadas (e, idealmente, vêm de ramificações separadas).


4
existem muitas ferramentas que tornam a revisão de código de várias alterações relacionadas bastante trivial; portanto, por si só, não compro isso como resposta
— jk.

4
Como há alguma diferença entre revisar a diferença entre a revisão base e a revisão completa do recurso e revisar o único commit desse conjunto re-baseado de commits? Vai parecer idêntico se a re-base fez seu trabalho corretamente!
— Mark Booth

3
O que você descreve aqui vai diretamente contra os conselhos do wiki Mercurial . Pequenos conjuntos de alterações "obviamente corretos" são preferidos para revisões. O recolhimento de uma ramificação de recurso em um único conjunto de alterações não é normal no Mercurial - já vi isso recomendado com mais frequência no Git, onde git rebase -ivocê pode fazer isso de maneira fácil e seletiva. O equivalente Mercurial mais próximo é histedit .
— Martin Geisler

9
Eu discordo completamente. Nos últimos dois anos, usamos uma ferramenta para revisões de código, e não havia nada que eu odiasse mais ao receber um grande conjunto de alterações de arquivos com mais de 30 arquivos enviados para revisão. É muito mais fácil obter muitas pequenas alterações. Por exemplo, renomeei essa classe para xyz porque reflete melhor a responsabilidade modificada. Eu adicionei o método nn porque vou precisar dele por blá. Muito mais fácil de lidar com revisões menores.
— Pete

3
Eu já ouvi essa ideia bastante na comunidade git de desmoronar muitos commits em um antes de avançar para o repo oficial, mas isso nunca foi útil para mim. Prefiro ter os pequenos commits com mensagens significativas. Como outros observaram, você pode fazer uma diferença entre vários conjuntos de alterações.
— Chris Sutton

4

Sua pergunta descreve o histórico como um conjunto de alterações ordenadas do código e pergunta se o orgânico compromete ou não a indicação de futuros leitores para o processo de desenvolvimento. No entanto, como engenheiro de liberação / integração, não costumo pensar na história como código. Estou mais envolvido com a história que minha história conta, o conhecimento institucional que ela retém e se ela me permite ou não depurar problemas rapidamente.

Eu não acho que os fluxos de trabalho orgânicos façam isso bem, até o meu. As qualidades que eu valorizo ​​no DVCS ao codificar - filiais baratas, confirmações rápidas, salva no controle remoto cedo e frequentemente - não são o que eu valorizo ​​como gerente de integração da minha empresa . I edição git rebase, git merge, git diff, e git applymuito mais freqüência nesse papel do que git addou git commit. Ferramentas como rebaseme permitem transformar o código que recebi de algo que funciona em algo que pode ser mantido.

Confirmações ilógicas ou vagas não são úteis, mas são pecaminosamente fáceis de escrever organicamente, quando a principal preocupação é fazer o código funcionar, não distribuí-lo para outras pessoas. Compromete-se Case 15: Fixed a problemou Refactored <cranky legacy feature>faz minha auto-manutenção se encolher, mesmo quando eu os autor. Nenhum, no entanto, induz a raiva do blecaute como confirmações "incrementais". Considere este ramo de tópico que um desenvolvedor me entregou outro dia:

$ git log production..topic --oneline
f9a1184 incremental update
156d299 incremental commits
e8d50b0 new incremental updates
511c18c incremental updates, refactor
1b46217 incremental upgrade
9e2b3b8 incremental update
fa68a87 incremental update

Essas coisas são más. É como o DVCS projetado para o Dr. Faustus. Eu darei a você controle de fonte rápido e fácil. Você me dá a alma do seu mantenedor de código. Todos os compromissos preguiçosos são atos egoístas. Muitos de nós os escrevemos, mas também devemos ao nosso futuro uma história lógica, replicável e depurável. Não podemos fazer isso sem uma maneira de fazê-lo rebase.

Quanto às experiências fracassadas, por que não descrevê-las em nossas mensagens de confirmação (recém-intocadas)? Daqui a um ano eu não preciso de um trecho pela metade. Eu só quero um registro da tentativa abortada, e talvez uma breve explicação, se me achar tolo o suficiente para tentar novamente. Existem muitos fluxos de trabalho bem-sucedidos no mundo, mas estou lutando para pensar em qualquer motivo para conscientemente comprometer o código quebrado em uma base de código de produção.


Very nice resposta, motivações cristalinas sobre o porquê de rebase
— dukeofgaming

2

Nada deve ser sagrado, mas verifique se você tem boas razões para o que está fazendo. O rebaseamento é extremamente poderoso quando usado adequadamente, mas, como em qualquer ferramenta poderosa, pode ser confuso e causar problemas se usado de forma descuidada.

Pessoalmente, acho muito útil refazer uma ramificação de recurso local contra o tronco (ou ramificação de desenvolvimento principal) antes de executar os testes finais e mesclar o recurso na ramificação principal. Dessa forma, eu consigo lidar com quaisquer conflitos de mesclagem etc. antes de realmente me fundir.


1

IMHO, experimentos geralmente pertencem a prateleiras ou filiais temporárias, não linhas de base. Se você seguir isso, não deverá haver um problema, pois todos os commit serão logicamente válidos e agregarão algum valor.


O que você está dizendo é que você prefere os ramos de trabalho em vez de editar um ramo da linha de base (por exemplo, mestre / padrão, produção / lançamento, vX.X, etc.)?
— Dukeofgaming
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.