Eu peguei uma ramificação de um repositório no GitHub e cometi algo específico para mim. Agora eu achei que o repositório original tinha um bom recurso que estava em HEAD
.
Quero mesclá-lo apenas sem confirmações anteriores. O que devo fazer? Eu sei como mesclar todos os commits:
git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push
Respostas:
'
git cherry-pick
' deve ser sua resposta aqui.Não se esqueça de ler a resposta de bdonlan sobre as conseqüências da escolha da cereja neste post:
"Puxe todos os commits de um ramo, envie os commit especificados para outro" , onde:
torna-se:
fonte
Você pode usar o git cherry-pick para aplicar um único commit à sua ramificação atual.
Exemplo:
git cherry-pick d42c389f
fonte
git cherry-pick d42c
ougit cherry-pick d42c3
vai funcionar. Git é inteligente. ;)d42c389f
. Talvez o OP não tenha se preocupado em criar uma mesclagem em si, mas a diferença importa algumas vezes.Vamos tentar dar um exemplo e entender:
Eu tenho um ramo, digamos mestre , apontando para X <commit-id>, e eu tenho um novo ramo apontando para Y <sha1>.
Onde Y <commit-id> = <master> ramificação confirma - poucas confirmações
Agora digamos que para o ramo Y, preciso fechar o espaço entre as confirmações entre o ramo mestre e o novo ramo. Abaixo está o procedimento que podemos seguir:
Passo 1:
onde local é o nome da filial. Qualquer nome pode ser dado.
Passo 2:
Mesclar as confirmações da ramificação mestre para a nova ramificação e também criar uma confirmação de mesclagem da mensagem de log com descrições de uma linha de no máximo <n> confirmações reais que estão sendo mescladas.
Para mais informações e parâmetros sobre a fusão do Git, consulte:
Além disso, se você precisar mesclar um commit específico, poderá usar:
fonte
Y
na sua frase 3d? "Eu tenho um novo ramo apontando para Y" vs "Agora diga para o ramo Y", parece que Y costumava ser um commit e depois se tornou um branchNo meu caso de uso, tínhamos uma necessidade semelhante de CD de CI. Utilizamos o fluxo git com ramos de desenvolvimento e master. Os desenvolvedores são livres para mesclar as alterações diretamente para desenvolver ou por meio de uma solicitação pull de uma ramificação de recursos. No entanto, para dominar, mesclamos apenas o commit estável do ramo de desenvolvimento de maneira automatizada via Jenkins.
Nesse caso, escolher a cereja não é uma boa opção. Entretanto, criamos uma ramificação local a partir do commit-id e, em seguida, mesclamos essa ramificação local para dominar e executar a verificação limpa do mvn (usamos o maven). Se for bem-sucedido, libere o artefato da versão de produção para o nexus usando o plug-in maven release com a opção localCheckout = true e pushChanges = false. Finalmente, quando tudo der certo, empurre as alterações e a tag para a origem.
Um trecho de código de exemplo:
Supondo que você esteja no mestre se feito manualmente. No entanto, no jenkins, quando você faz o checkout do repo, você estará na ramificação padrão (mestre, se configurado).
Isso lhe dará um controle total com uma fusão sem medo ou um inferno de conflito.
Sinta-se livre para aconselhar caso haja alguma opção melhor.
fonte
As respostas principais descrevem como aplicar as alterações de uma confirmação específica na ramificação atual. Se é isso que você quer dizer com "como mesclar", basta usar a opção de seleção de cereja, conforme sugerido.
Mas se você realmente deseja uma mesclagem , ou seja, deseja um novo commit com dois pais - o commit existente na ramificação atual e o commit do qual você deseja aplicar as alterações -, então uma seleção de cereja não fará isso.
Ter um histórico de mesclagem verdadeiro pode ser desejável, por exemplo, se seu processo de construção tirar proveito da ancestralidade git para definir automaticamente as strings de versão com base na tag mais recente (using
git describe
).Em vez de escolher a cereja, você pode fazer um real
git merge --no-commit
e, em seguida, ajustar manualmente o índice para remover as alterações que você não deseja.Suponha que você esteja no branch
A
e deseje mesclar o commit na ponta do branchB
:Agora você está configurado para criar um commit com dois pais, a dica atual confirma
A
eB
. No entanto, você pode ter mais alterações aplicadas do que deseja, incluindo alterações de confirmações anteriores na ramificação B. Você precisa desfazer essas alterações indesejadas e confirmar.(Pode haver uma maneira fácil de definir o estado do diretório de trabalho e o índice antes da mesclagem, para que você tenha uma lista limpa sobre a qual escolher em primeira mão o commit que você queria em primeiro lugar. Eu não sei como alcançar esse slate limpo.
git checkout HEAD
Egit reset HEAD
ambos removerão o estado de mesclagem, derrotando o objetivo deste método.)Então, desfaça manualmente as alterações indesejadas. Por exemplo, você poderia
para cada confirmação indesejada
012ea56
.Quando terminar de ajustar as coisas, crie seu commit:
Agora você tem apenas a alteração que deseja, e a árvore de ascendência mostra que você se uniu tecnicamente de B.
fonte