Eu e minha equipe usamos ramos de recursos (com git). Gostaria de saber qual é a melhor estratégia para revisão de código antes de mesclar para dominar.
- Eu compro uma nova ramificação do master, vamos chamá-la fb_ # 1
- Eu cometo algumas vezes e do que quero mesclá-lo de volta ao master
- Antes de mesclar, alguém deve fazer uma revisão de código
Agora existem 2 possibilidades:
1º
- I fundir mestre para fb_ # 1 ( não fb_ # 1 a master) para torná-lo como up-to-date possível
- Um companheiro de equipe revisa as mudanças entre o chefe principal e o chefe fb_ # 1
- Se fb_ # 1 estiver ok, mesclamos fb_ # 1 para dominar
- Prós: nenhum código obsoleto em revisão
- Contras: se outra pessoa mesclar algo entre "1". e "2." as alterações dele aparecem na revisão, embora pertençam a outra revisão.
2º
- Um colega de equipe revisa as alterações entre o ponto de checkout (mestre da base de mesclagem git fb_ # 1) e fb_ # 1 head
- Prós: vemos exatamente o que foi alterado durante o trabalho no ramo de recursos
- Contras: algum código obsoleto pode aparecer na revisão.
Qual o caminho que você acha melhor e por quê ? Talvez haja outra abordagem mais adequada?
fonte
git show HEAD
. Como esse será o commit de mesclagem fm , ele listará os dois pais. Então, você tem o hash de mm . Alternativamente, você pode trivialmente ver o pai emgitk
ou qualquer outro navegador git3º
Você redefine a ramificação no mestre para atualizá-la e manter as alterações separadas.
Isso cria um novo histórico do ramo. Serão novas revisões com novos IDs que terão o mesmo conteúdo, mas serão derivadas do mestre mais recente e não serão vinculadas às revisões antigas. As revisões antigas ainda estão acessíveis no "reflog" se você precisar consultá-las, por exemplo, porque você descobriu que cometeu um erro na resolução de conflitos. Além disso, eles são inúteis. Por padrão, o Git remove o reflog após 3 meses e descarta as revisões antigas.
Você usa o rebase interativo (
git rebase -i
egit commit --amend
) para reordenar, editar e limpar as alterações, para que cada uma faça uma alteração logicamente fechada.Isso cria novamente um novo histórico, desta vez com o benefício adicional de que você pode reestruturar as alterações para fazer mais sentido durante a revisão.
Prós:
Normalmente, o trabalho extra significa que você deve revisar o código por conta própria primeiro e isso também trará muitos problemas.
É isso que o Linux e o Git fazem. E não é incomum ver séries de 20 a 25 patches sendo submetidas para revisão e reescritas várias vezes nesses projetos.
Na verdade, o Linux fez isso desde o início do projeto, quando o controle de versão escolhido era tarballs e patches. Quando muitos anos depois, Linus decidiu criar o git, foi o principal motivo para implementar o
rebase
comando e sua variante interativa. Também por causa disso, o git tem uma noção separada de autor e committer . Autor é quem criou a revisão pela primeira vez e o responsável pela última vez que a tocou. Como no Linux e no Git os patches ainda são enviados por email, os dois quase nunca são a mesma pessoa.fonte
merge --no-ff
que mostrará claramente essa ramificação no master em vez de o recurso desaparecer no restante dos commits--no-ff
tem suas vantagens e desvantagens. Pessoalmente, acho mais barulho do que qualquer coisa. YMMV.Na verdade, existe uma terceira possibilidade - e provavelmente muitas outras, uma vez que o GIT é mais uma implementação de uma estrutura de SCM do que uma implementação de uma metodologia de SCM. Essa terceira possibilidade é baseada
rebase
.O
rebase
subcomando GIT pega uma série de confirmações (normalmente do ponto de ramificação até a ponta do tópicotopic
) e as reproduz em outro lugar (normalmente na ponta do ramo de integração, por exemplomaster
). Orebase
subcomando produz novas confirmações, o que oferece a oportunidade de reorganizar as confirmações de uma forma que é mais fácil de revisar. Isso gera uma nova série de consolidação, semelhante ao quetopic
costumava ser, mas aparecendo enraizada na parte superior do ramo de integração. Esse novo ramo ainda é chamadotopic
pelo GIT, para que a referência antiga seja descartada. Rotulo informalmentetopic-0
o estado original do seu ramotopic-1
e assim por diante em várias refatorações.Aqui está a minha sugestão para o seu
topic
ramo:(Etapa opcional) Você reorganiza interativamente a ramificação do tópico
topic
em seu ponto de ramificação (consulte a--fixup
opção paracommit
e as opções-i
e ), o que lhe dá a oportunidade de reescrever seus commits de uma maneira que seja mais fácil de revisar. Isso resulta em uma ramificação .--autosquash
rebase
topic-1
Você rebase sua ramificação de tópico na parte superior de sua ramificação de integração, é semelhante a uma mesclagem, mas "não polui" o histórico com uma mesclagem que é meramente um artefato de engenharia de software. Isso resulta em uma ramificação
topic-2
.Mandar
topic-2
a um colega de equipe que o analise com a ponta domaster
.E se
topic-2
estiver tudo bem, mescle-o para dominar.NOTA As ramificações - nas quais ramificação se refere à árvore de confirmação - serão chamadas pelo GIT da mesma forma; portanto, no final do processo, apenas a ramificação terá
topic-2
um nome no GIT.Prós:
Contras:
topic-0
, há três ramos artefatostopic-0
,topic-1
etopic-2
que são criados na árvore de cometer. (Embora a qualquer momento, apenas um deles tenha um nome no GIT.)No seu 1º cenário «se alguém mesclar algo entre" 1 ". e "2." »refere-se ao tempo decorrido entre a criação do ponto de ramificação e o horário em que você decide mesclar. Nesse cenário «se alguém mesclar algo entre" 1 ". e "2." »refere-se ao tempo decorrido entre o rebase e a mesclagem, que geralmente é muito curto. Assim, no cenário que forneço, você pode «bloquear» o
master
ramificação pelo tempo da mesclagem sem perturbar significativamente o seu fluxo de trabalho, enquanto isso é impraticável no 1º cenário.Se você estiver fazendo revisões sistemáticas de código, provavelmente é uma boa idéia reorganizar as confirmações de maneira adequada (etapa opcional).
Gerenciar os artefatos de ramificação intermediária apenas apresenta uma dificuldade se você os compartilhar entre repositórios.
fonte
topic-0
,topic-1
etopic-2
ramos. No segundo em que a recuperação é concluída, a versão anterior é irrelevante. Então tudo que haveria étopic@{1}
,topic@{2}
,topic@{yesterday}
,topic@{3.days.ago}
etc. para salvar sua bunda no caso de você achar que você ferrou resolução de conflitos na rebase.topic
. Porque branch no git é apenas o nome.topic
no GIT, é sempre um dos ramos (um ramo como em cometer árvore, não como em referência GIT) I rotuladostopic-0
,topic-1
,topic-2
.