Eu tenho dois ramos devel
e next
. No desenvolvimento, tenho uma quantidade mais ou menos enorme de confirmações. Alguns dos commits são escolhidos a dedo next
. Também adicionei alguns commits para os próximos, que são mesclados devel
.
Agora eu gostaria de ver o que está faltando next
, para que eu possa testar as alterações em detalhes antes de trazê-las para next
. Minha pergunta é agora, como posso ver quais confirmações estão, devel
mas não as próximas?
Respostas:
O comando pouco usado
git cherry
mostra os commits que ainda não foram selecionados. A documentação paragit cherry
está aqui , mas, resumindo, você deve ser capaz de:... e veja a saída um pouco como esta:
Os commits que começam com
+
serão os que você ainda não escolheunext
. Nesse caso, eu tinha escolhido apenas um commit até o momento. Você pode adicionar o-v
parâmetro aogit cherry
comando, para que ele também produza a linha de assunto de cada confirmação.fonte
git checkout devel
, você pode simplesmente fazergit cherry next devel
.-v
" ? Cereja sem a-v
é comols
sem uma-la
. ; -Jcherry
marcar ou excluir confirmações equivalentes, não é?cherry
parece um comando de encanamento, mas não parece oferecer muitas opções. Pelo que estou atualmente no meio,git cherry
me dá falsos positivos, mas @ sehegit log --cherry-pick
exclui corretamente os commits escolhidos / reencaminhados anteriormente.Além disso, você pode usar
para obter uma boa lista de confirmações diferentes reais não compartilhadas entre as filiais.
A palavra operativa é
--cherry-pick
Atualização Como mencionado em um comentário, versões recentes do git adicionaram
--cherry-mark
:fonte
Você pode tentar fazer subconjuntos de log do git:
fonte
--left-only
seria melhor). No entanto, este pode ser melhorado um pouco, adicionando--no-merges
para omitir qualquer confirmação de mesclagem (por exemplo, se um recurso ou ramo de hotfix foi mesclado (separadamente) no devel e no próximo). A rigor, é claro, a resolução de conflitos em fusões pode criar outras diferenças, mas esse geralmente não é o caso. A--no-merges
opção também pode ser aplicada às outras respostas.E se
O resultado é semelhante à resposta de Byran (ordem diferente de confirmações), mas ambas as respostas produzirão confirmações diferentes entre as ramificações, mostrando apenas o que está em uma ramificação e não na outra.
fonte
git log next..
Para obter a lista de confirmações que não foram integradas ao ramo de lançamento (a seguir), você pode usar:
Verifique git-rev-list para mais informações.
fonte
next...devel
@ Mark Longair acertou em sua resposta aqui , mas gostaria de acrescentar algumas dicas adicionais.
Relacionado e responder à pergunta de como interromper uma solicitação pull grande (PR), especialmente ao esmagar seus commits, é impraticável devido a uma ou mais mesclagens de master em seu feature_branch
Minha situação:
fiz um grande
feature_branch
com 30 commits e abri um Pull Request (PR) no GitHub para mesclá-lomaster
. Branchmaster
mudou uma tonelada debaixo de mim e recebeu 200 commits que eufeature_branch
não tinha. Para resolver conflitos que fizgit checkout feature_branch
egit merge master
mesclarmaster
as alterações no meufeature_branch
. Eu escolhi,merge
e não porque isso pode acabar com o histórico de comentários da revisão do GitHub no PR. Portanto, mesclei o mestre na ramificação de recursos e resolvi conflitos uma única vez. Tudo foi bem. Meu PR, no entanto, era grande demais para meus colegas revisarem. Eu precisava dividir. Eu fui esmagar meus 30 commits e OH NÃO! ONDE ELES ESTÃO? Estão todos entrelaçados com os 200 commits recentes agora, porque eu me fundei no meurebase
entrar no mestre mais recente, ter que resolver os conflitos apenas uma vez, em vez de potencialmente 30 vezes (uma vez para cada um dos meus commits). Eu não queria esmagar meus 30 commits em 1 primeiro e depois me refazer nos últimosmaster
master
master
feature_branch
! O QUE EU FAÇO?git cherry
uso no caso de você querer tentargit cherry-pick
confirmações individuais:git cherry
para o resgate (mais ou menos)!Para ver todos os commits que estão,
feature_branch
mas NÃO estão,master
eu posso fazer:OR, posso verificar commits de qualquer ramo, sem garantir que eu estou no
feature_branch
primeiro, fazendogit cherry [upstream_branch] [feature_branch]
, assim. Novamente, isso verifica para ver quais confirmações estão,feature_branch
mas NÃO estãoupstream_branch
(master
neste caso):A adição
-v
também mostra as linhas de assunto da mensagem de confirmação:A canalização para "contagem de palavras" "-lines" (
wc -l
) conta quantas confirmações existem:Você pode comparar essa contagem com o número de confirmação mostrado no seu GithHub PR para se sentir melhor em saber se
git cherry
realmente está funcionando. Você também pode comparar os hashes do git um por um e ver se eles correspondem aogit cherry
GitHub. Note-se quegit cherry
não contará nenhum commit mesclagem onde se fundirammaster
emfeature_branch
, mas GitHub vontade. Portanto, se você encontrar uma pequena discrepância na contagem, pesquise na página de confirmação do GitHub PR a palavra "mesclar" e provavelmente verá que esse é o culpado que não está aparecendogit cherry
. Ex: um commit intitulado "Merge branch 'master' into feature_branch" será exibido no GitHub PR, mas não quando você executargit cherry master feature_branch
. Isso é bom e esperado.Portanto, agora eu tenho um meio de descobrir quais diferenças eu posso escolher em uma ramificação de recursos novos para dividir essa diferença: eu posso usar
git cherry master feature_branch
localmente ou examinar os commits no GitHub PR.Como o esmagamento poderia ajudar - se pudéssemos esmagar:
Uma alternativa, no entanto, para dividir meu grande diff é compactar todos os 30 dos meus commits em um, corrigir isso em um novo ramo de recurso, redefinir suavemente o commit do patch e usar
git gui
para adicionar pedaços arquivo por arquivo, pedaço por pedaço ou linha por linha. Depois de obter um sub-recurso, posso confirmar o que adicionei e verificar um novo ramo, adicionar um pouco mais, confirmar, verificar um novo ramo, etc., até que meu grande recurso seja dividido em vários sub-recursos . O problema é que meus 30 commits são misturados com os outros 200 commits de outras pessoas devido a minhagit merge master
no meufeature_branch
, então rebasing é, portanto, impraticável, pois eu teria que peneirar 230 commits para re-ordem e esmagar meus 30 commits.Como usar um arquivo de correção como um substituto muito mais fácil para esmagar:
Uma solução alternativa é simplesmente obter um arquivo de correção contendo um "equivalente a squash" de todos os meus 30 commits, corrigi-lo em uma nova bifurcação de
master
(uma nova ramificação de sub-recurso) e trabalhar a partir daí, da seguinte maneira:Agora eu tenho meu patch de 30 confirmações aplicado localmente, mas sem estágio e sem confirmação.
Agora use
git gui
para adicionar arquivos, pedaços e / ou linhas e interromper seu grande PR ou "diff":Note que se você não possui
git gui
, você pode instalá-lo facilmente no Ubuntu comsudo apt install git-gui
.Agora posso executar
git gui
e começar a adicionar arquivos, pedaços e / ou linhas (clicando com o botão direito do mouse no programa GUI git) e dividir o ramo do recurso de confirmação 30 em sub branches como descrito acima, adicionando, confirmando e bifurcando repetidamente uma nova ramificação de recurso e repetindo esse ciclo até que todas as alterações tenham sido adicionadas a uma ramificação de subfuncionalidade e meu recurso de consolidação 30 seja dividido com êxito em 3 ou 4 subfuncionalidades. Agora, posso abrir um PR separado para cada um desses sub-recursos, e será mais fácil para minha equipe revisar.Referências:
fonte