Eu tenho um ramo git (a linha principal, por exemplo) e quero mesclar em outro ramo de desenvolvimento. Ou eu?
Para decidir se realmente quero mesclar esse ramo, gostaria de ver algum tipo de visualização do que a mesclagem fará. De preferência com a capacidade de ver a lista de confirmações que estão sendo aplicadas.
Até agora, o melhor que posso fazer é merge --no-ff --no-commit
e então diff HEAD
.
git merge
egit reset --keep HEAD@{1}
se não gostar do resultado.git reset --keep HEAD@{1}
retornou afatal: Cannot do a keep reset in the middle of a merge.
Ajuda?--preview
opção no git-merge?Respostas:
Descobri que a solução que melhor funciona para mim é apenas executar a mesclagem e abortá-la se houver conflitos . Essa sintaxe específica parece limpa e simples para mim. Esta é a Estratégia 2 abaixo.
No entanto, se você deseja garantir que você não estrague sua ramificação atual ou simplesmente não está pronto para mesclar, independentemente da existência de conflitos, basta criar uma nova sub ramificação e mesclar isso:
Estratégia 1: A maneira segura - fundir um ramo temporário:
Dessa forma, você pode simplesmente jogar fora o ramo temporário se quiser apenas ver quais são os conflitos. Você não precisa se preocupar em "abortar" a mesclagem e pode voltar ao seu trabalho - basta fazer checkout de 'mybranch' novamente e você não terá nenhum código mesclado ou conflitos de mesclagem em sua ramificação.
Isso é basicamente um teste a seco.
Estratégia 2: quando você definitivamente deseja mesclar, mas apenas se não houver conflitos
Se o git relatar conflitos (e SOMENTE SE EXISTIR conflitos), você poderá:
Se a mesclagem for bem-sucedida, você não poderá abortá-la (somente redefinir).
Se você não estiver pronto para mesclar, use o caminho mais seguro acima.
[EDIT: 2016-Nov - Troquei a estratégia 1 por 2, porque parece que a maioria das pessoas está procurando "o caminho seguro". A estratégia 2 agora é mais uma observação de que você pode simplesmente interromper a mesclagem se a mesclagem tiver conflitos com os quais você não está pronto para lidar. Lembre-se de ler comentários!]
fonte
git merge --no-ff --no-commit
se não desejar confirmar as alterações diretamente. Isso elimina a "necessidade" de uma ramificação diferente, facilitando um pouco a revisão das alterações.git merge --no-ff --no-commit
? Eu acho que você ainda pode fazer umgit merge --abort
depois disso, se você não gosta do que vê? Mesmo que a mesclagem não produza conflitos?git reset --hard HEAD
e faça check-out em uma ramificação diferentegit checkout <different branch name>
e exclua a ramificação temporáriagit delete -b <name of temporary branch>
.git log ..otherbranch
git diff ...otherbranch
gitk ...otherbranch
String vazia implica
HEAD
, é por isso que apenas em..otherbranch
vez deHEAD..otherbranch
.Os dois vs. três pontos têm um significado ligeiramente diferente para diff do que para os comandos que listam revisões (log, gitk etc.). Para log e outros, dois pontos (
a..b
) significa tudo o que está dentro,b
mas nãoa
e três pontos (a...b
) significa tudo o que está em apenas um dea
oub
. Mas diff trabalha com duas revisões e, nesse caso, o caso mais simples representado por dois pontos (a..b
) é uma diferença simples dea
atéb
e três pontos (a...b
) diferença média entre o ancestral comum eb
(git diff $(git merge-base a b)..b
).fonte
git checkout master
antes de tentar isso. Eu queria saber por que ele estava dizendo todas as minhas alterações foram vai ser sobre-escrito ...git show ..otherbranch
mostrará uma lista de alterações e diferenças que serão mescladas na ramificação atual.Se você é como eu, está procurando o equivalente a
svn update -n
. A seguir, parece fazer o truque. Observe que não se esqueça de fazer ogit fetch
primeiro, para que seu repositório local tenha as atualizações apropriadas para comparação.ou se você quiser um diff da sua cabeça para o controle remoto:
Na IMO, esta solução é muito mais fácil e menos propensa a erros (e, portanto, muito menos arriscada) do que a solução principal que propõe "mesclar e abortar".
fonte
$ git checkout target-branch
e depois$ git diff --name-status ...branch-to-be-merged
(três pontos são essenciais para que digitá-los como é)A maioria das respostas aqui exige um diretório de trabalho limpo e várias etapas interativas (ruins para scripts), ou não funciona para todos os casos, por exemplo, mesclagens anteriores que já trazem algumas das alterações pendentes para o seu ramo de destino, ou escolhas mesmo.
Para realmente ver o que mudaria na
master
ramificação se você se unissedevelop
a ela, agora:- https://git.seveas.net/previewing-a-merge-result.html
(obrigado a David Normington pelo link)
PS:
Se você obter conflitos de mesclagem, eles aparecerão com os marcadores de conflito usuais na saída, por exemplo:
O usuário @dreftymac faz uma boa observação: isso não é adequado para scripts, porque você não pode capturar isso facilmente a partir do código de status. Os marcadores de conflito podem ser bem diferentes, dependendo da circunstância (excluídos x modificados etc.), o que também dificulta o grep. Cuidado.
fonte
true
se houver conflitos efalse
se não houver conflitos (por exemplo, um valor booleano que não exija o teste do "globo ocular" ou qualquer intervenção humana).git merge-tree ... | grep -q '^[a-z].*in both$' && echo conflict || echo safe to merge
mas é finnicky; Provavelmente estou esquecendo um caso. talvez você queira verificar os marcadores de conflito? por exemplo, isso provavelmente não pega conflitos de estilo "deles excluídos, nossos alterados". (Acabei de verificar e que nem sequer mostrar marcadores de conflito, então você precisa de um regex meticulosa para ser seguro aqui)less -R
para manipular saída colorida sem modificar sua configuração.Se você já buscou as alterações, o meu favorito é:
Isso precisa do git 1.7.x, no entanto, acredito. A
@{u}
notação é uma "abreviação" para o ramo upstream, por isso é um pouco mais versátil do quegit log ...origin/master
.Nota: Se você usar o zsh e o glog estendido, provavelmente precisará fazer algo como:
fonte
Adicionando às respostas existentes, um alias pode ser criado para mostrar o diff e / ou log antes de uma mesclagem. Muitas respostas omitem o que
fetch
deve ser feito antes de "visualizar" a mesclagem; este é um alias que combina essas duas etapas em uma (emulando algo semelhante ao mercurial'shg incoming
/outgoing
)Portanto, com base em "
git log ..otherbranch
", você pode adicionar o seguinte a~/.gitconfig
:Para simetria, o alias a seguir pode ser usado para mostrar o que foi confirmado e seria enviado antes de ser enviado:
E então você pode executar "
git incoming
" para mostrar muitas alterações ou "git incoming -p
" para mostrar o patch (ou seja, o "diff") "git incoming --pretty=oneline
", para obter um resumo conciso, etc. Você pode (opcionalmente) executar "git pull
" para realmente se fundem. (Embora você já tenha buscado, a mesclagem pode ser feita diretamente.)Da mesma forma, "
git outgoing
" mostra o que seria enviado se você executasse "git push
".fonte
git log currentbranch..otherbranch
fornecerá a lista de confirmações que entrarão na ramificação atual se você fizer uma mesclagem. Os argumentos usuais para registrar, que fornecem detalhes sobre as confirmações, fornecerão mais informações.git diff currentbranch otherbranch
lhe dará a diferença entre os dois commits que se tornarão um. Será um diff que fornece tudo o que será mesclado.Isso ajudaria?
fonte
git log otherbranch..currentbranch
fornece uma lista de confirmações no currentbranch . Agit diff otherbranch currentbranch
dá-lhe diff da versão a-ser-mesclado à ponta atual, que é quase tão inútil como pode ser, porque o que você quer é diff a partir da base de mesclagem para a cabeça de mesclagem.Solicitação de recebimento - usei a maioria das idéias já enviadas, mas uma que também uso com frequência é (especialmente se for de outro desenvolvedor) fazer uma solicitação de recebimento que fornece uma maneira útil de revisar todas as alterações em uma mesclagem antes que seja necessário Lugar, colocar. Eu sei que o GitHub não é o git, mas com certeza é útil.
fonte
A menos que efetue a mesclagem de maneira descartável (consulte a resposta da Kasapo), não parece haver uma maneira confiável de ver isso.
Dito isto, aqui está um método que se aproxima marginalmente:
Isso fornece uma indicação justa de quais confirmações entrarão na mesclagem. Para ver as diferenças, adicione
-p
. Para ver os nomes dos arquivos, adicionar qualquer um--raw
,--stat
,--name-only
,--name-status
.O problema com a
git diff TARGET_BRANCH...SOURCE_BRANCH
abordagem (consulte a resposta de Jan Hudec) é que você verá diferenças nas alterações já no seu ramo de destino se o ramo de origem contiver mesclagens cruzadas.fonte
Talvez isso possa te ajudar ? git-diff-tree - Compara o conteúdo e o modo dos blobs encontrados através de dois objetos em árvore
fonte
Não quero usar o comando git merge como precursor da revisão de arquivos conflitantes. Não quero fazer uma mesclagem, quero identificar problemas em potencial antes de mesclar - problemas que a mesclagem automática pode ocultar de mim. A solução que eu tenho procurado é como o git cospe uma lista de arquivos que foram alterados nos dois ramos que serão mesclados no futuro, em relação a algum ancestral comum. Depois de ter essa lista, posso usar outras ferramentas de comparação de arquivos para explorar ainda mais as coisas. Pesquisei várias vezes e ainda não encontrei o que desejo em um comando git nativo.
Aqui está minha solução alternativa, caso isso ajude outras pessoas por aí:
Nesse cenário, tenho um ramo chamado controle de qualidade que possui muitas alterações desde o último lançamento de produção. Nosso último lançamento de produção está marcado com "15.20.1". Eu tenho outro ramo de desenvolvimento chamado new_stuff que desejo mesclar no ramo de controle de qualidade. O controle de qualidade e o new_stuff apontam para confirmações que "seguem" (conforme relatado pelo gitk) a tag 15.20.1.
Aqui estão algumas discussões sobre o motivo pelo qual estou interessado em segmentar esses arquivos específicos:
Como posso confiar na mesclagem do Git?
/software/199780/how-far-do-you-trust-automerge
fonte