Como testar uma mesclagem sem realmente mesclar primeiro

166

Existe alguma maneira de simular um git mergeentre dois ramos, o ramo de trabalho atual e o mestre, mas sem fazer alterações?

Muitas vezes tenho conflitos quando preciso fazer um git merge. Existe alguma maneira de simular a mesclagem primeiro?

dole doug
fonte
2
veja também stackoverflow.com/questions/501407/…
Andre Holzner 26/11
1
Possível duplicata da Existe uma opção git-merge --dry-run?
the Tin Man

Respostas:

132

Acho que não há uma maneira de simular o que acontecerá até você tentar a mesclagem. No entanto, se você certificar-se de que a saída de git statusesteja vazia antes de fazer a mesclagem, é bastante seguro seguir em frente e testá-la. Se você tiver conflitos, poderá voltar imediatamente ao estado em que estava antes com:

git reset --merge

Desde o git 1.7.4, você também pode cancelar a mesclagem fazendo:

git merge --abort

(Como a mensagem de confirmação que adicionou essa opção explica , ela foi adicionada para consistência git rebase --aborte assim por diante.)

Mark Longair
fonte
4
A resposta de @ Amber está respondendo exatamente ao que está sendo perguntado 'como simular a mesclagem'. usando --no-commité muito mais fácil na minha opinião
samirahmed
14
@samirahmed: @Amber respondeu à pergunta mais literalmente, com certeza, embora --no-commitvocê ainda esteja alterando o índice e a árvore de trabalho, o que não é exatamente "sem fazer alterações" :) Meu argumento é que quando as pessoas perguntam esse tipo de pergunta, geralmente é porque eles não sabem que a melhor maneira de ver como seria uma mesclagem é apenas tentar a mesclagem , geralmente porque eles não sabem como é fácil voltar ao estado em que estavam antes se acabou por haver problemas.
precisa saber é o seguinte
2
Eu não sei se isso foi adicionado em uma versão mais recente do git, mas nos documentos (1.8.4) ele afirma " git merge --aborté equivalente a git reset --mergequando MERGE_HEADestá presente", então, o que for mais fácil de lembrar :)
Samuel Meacham
@ SamuelMeacham: obrigado por apontar isso - foi introduzido no 1.7.4. Eu atualizei a resposta com isso. Obrigado!
Mark Longair
Esta sugestão não fez nada para mim, no git 1.9.4.
djangofan
137

Você pode usar git merge --no-commitpara impedir que a mesclagem seja realmente confirmada e, se você não gostar de como a mesclagem funciona, basta redefinir a cabeça original.

Se você definitivamente não quiser finalizar a mesclagem, mesmo que seja um avanço rápido (e, portanto, sem conflitos, por definição), você pode adicionar --no-fftambém.

Âmbar
fonte
Eu não acho que git merge --abortexista - talvez você queira dizer git reset --merge?
precisa saber é o seguinte
Não, eu apenas esqueci que, ao contrário, rebasenão há um --abortpara git merge.
âmbar
7
Eu jogaria --no-fftambém. Para impedir que uma mesclagem ff ocorra.
Andy
1
O @ Andy --no-ffé praticamente obrigatório aqui, pois --no-commitnão impede as alterações de avanço rápido.
jackr
1
@Anant Anand Gupta - este é um truque bom, mas deve ser: git configuração --global alias.tm "merge --no-commit --no-ff"
pasx
109

Se eu quiser comparar as alterações em uma ramificação de tópico para dominar, acho mais fácil e seguro fazer o seguinte:

git checkout master
git checkout -b trial_merge
git merge topic_branch

Depois de concluir a mesclagem, é fácil ver a alteração consolidada do mestre

git diff master

Quando terminar, basta excluir o ramo trial_merge

git checkout master
git branch -D trial_merge

Dessa forma, o ramo mestre nunca muda.

Ian
fonte
4
Você também pode fazer git checkout --detache testar o que quiser. Mais tarde, se você quiser manter suas alterações, faça git checkout -b new_branch. E se você quiser jogar fora suas alterações, faça o checkout de qualquer ramo que desejar ( git checkout master).
Shayan Toqraee
Se topic_branchfor grande (como provavelmente é o caso se você estiver nessa questão em primeiro lugar), o diff masterresultado provavelmente será muito grande para você observar se uma mesclagem causará conflitos.
Crescent Fresh
Definitivamente gosto muito disso ... seguro e simples.
Leo
4

Eu uso :

git merge --ff-only

de acordo com a documentação :

Recuse-se a mesclar e sair com um status diferente de zero, a menos que o HEAD atual já esteja atualizado ou a mesclagem possa ser resolvida como um avanço rápido.

Não é realmente uma simulação, porque haverá uma mesclagem de avanço rápido no caso de não haver conflitos entre os dois ramos. Mas em caso de conflitos, você será informado e nada acontecerá.

Ortomala Lokni
fonte
4

Eu tenho sido capaz de usar git merge --abort, recentemente. No entanto, isso só pode ser usado se houver um conflito de mesclagem. Se você tiver certeza de que não deseja confirmar, use os outros métodos mencionados acima.

bean5
fonte
1
Quais outros métodos mencionados acima? Todos eles mencionam git merge --abort. Você deve revisar sua resposta no futuro, especificando quem escreveu a resposta a que você está se referindo.
Michael Fulton
3

Por que não criar um ramo descartável (git checkout -b) e fazer um teste mesclado?

Mohan S Nayaka
fonte
1
O que você sugere é realmente a resposta por Ian expressa sucintamente :)
tzot
0

Não sei exatamente se é o seu caso , mas sua pergunta lembra-se de que às vezes inicio um recurso, comprometo-me ao longo dos dias e mesclo o desenvolvimento nele muitas vezes.

Nesse ponto, perco o controle sobre os arquivos exatos que alterei e só o saberei quando meu recurso foi fechado e meu código foi desenvolvido.

Nesse caso, uma boa maneira de saber quais modificações você fez (e não outras das mesclagens) está usando o Sourcetree.

Você deve clicar com o botão direito no ramo base e selecionar Diff Against Current:

O recurso do Sourcetree para saber a diferença entre dois ramos

O sourcetree mostrará todas as modificações que serão mescladas se você mesclar sua ramificação na ramificação base.

Resultados

Obviamente, ele não mostrará os conflitos, mas é uma ferramenta útil nas mesclagens.

Lucas Amorim Silva
fonte