A principal coisa que você vai querer aqui é git add -p
( -p
é um sinônimo --patch
). Isso fornece uma maneira interativa de fazer check-in de conteúdo, permitindo que você decida se cada pedaço deve entrar e até mesmo editando manualmente o patch, se necessário.
Para usá-lo em combinação com a seleção de cereja:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Obrigado a Tim Henigan por me lembrar que o git-cherry-pick tem uma opção --no-commit, e obrigado a Felix Rabe por apontar que você precisa redefinir! Se você quiser apenas deixar algumas coisas de fora do commit , você pode usar git reset <path>...
para desfazer apenas esses arquivos.)
Obviamente, você pode fornecer caminhos específicos para, add -p
se necessário. Se você estiver começando com um patch, poderá substituí-lo cherry-pick
por apply
.
Se você realmente deseja um git cherry-pick -p <commit>
(essa opção não existe), pode usar
git checkout -p <commit>
Isso diferenciará o commit atual em relação ao commit que você especificar e permitirá que você aplique pedaços desse diff individualmente. Essa opção pode ser mais útil se o commit que você está recebendo tiver conflitos de mesclagem em parte do commit que você não está interessado. (Observe, no entanto, que checkout
difere de cherry-pick
: checkout
tenta aplicar <commit>
completamente o conteúdo cherry-pick
de a confirmação especificada do pai. Isso significa que checkout
pode aplicar mais do que apenas essa confirmação, que pode ser mais do que você deseja.)
cherry-pick -n
aparentemente não tenha deixado as mudanças organizadas - a convenção é definitivamente que as--no-commit
opções param logo antes do commit, ou seja, com todas as mudanças organizadas. Vou adicionar a redefinição na resposta.git checkout -p <F>
que não apenas te as mudanças de F, você fica ABCDEF tudo purê juntos e permite classificar para fora o que parte do que você quer . Reduzir isso a apenas algumas das mudanças de F é uma dor. Por outro lado,git cherry-pick -n <F>
você obtém apenas as alterações de F - e se algumas dessas alterações entrarem em conflito, será útil informar para que você possa descobrir como mesclar corretamente.git reset
removeria os arquivos temporários eadd -p
apenas diria 'nada a acrescentar'.Sei que estou respondendo a uma pergunta antiga, mas parece que há uma nova maneira de fazer isso com check-out interativo:
Crédito para Posso interativamente escolher pedaços de outro commit do git?
fonte
Supondo que as alterações desejadas estejam na cabeça do ramo em que você deseja as alterações, use git checkout
para um único arquivo:
para vários arquivos apenas em cadeia:
fonte
Com base na resposta de Mike Monkiewicz, você também pode especificar um ou mais arquivos a serem retirados do sha1 / branch fornecido.
Isso permitirá que você escolha interativamente as alterações que deseja aplicar à sua versão atual do arquivo.
fonte
Se você deseja especificar uma lista de arquivos na linha de comando e executar tudo em um único comando atômico, tente:
git apply --3way <(git show -- list-of-files)
--3way
: Se um patch não se aplicar corretamente, o Git criará um conflito de mesclagem para que você possa executargit mergetool
. Omitir--3way
fará o Git desistir de patches que não se aplicam de maneira limpa.fonte
Se "selecionar parcialmente" significa "dentro dos arquivos, escolhendo algumas alterações, mas descartando outras", isso pode ser feito trazendo
git stash
:git reset HEAD^
para converter todo o commit escolhido em mudanças de trabalho sem etapas.git stash save --patch
: selecione interativamente o material indesejado a ser guardado.git commit
git stash drop
.Dica: se você der um nome ao stash de alterações indesejadas:
git stash save --patch junk
se você esquecer de fazer (6) agora, mais tarde reconhecerá o stash pelo que é.fonte
Use
git format-patch
para cortar a parte do commit que você gosta egit am
aplicá-lo a outro ramofonte