Eu preciso aplicar as mudanças introduzidas em um branch para outro branch. Posso usar o cherry pick para fazer isso. No entanto, no meu caso, quero aplicar alterações que são relevantes apenas para um arquivo, não preciso selecionar o commit inteiro. Como fazer isso?
108
Respostas:
Você tem opções diferentes com base no que deseja alcançar:
Se quiser que o conteúdo do arquivo seja o mesmo do branch de destino, você pode usar
git checkout <branch> -- <filename>
. No entanto, isso não “selecionará” as mudanças que aconteceram em um único commit, mas apenas tomará o estado resultante do referido arquivo. Então se você adicionou uma linha em um commit, mas os commits anteriores mudaram mais, e você só quer adicionar aquela linha sem aquelas outras mudanças, então um checkout não é o que você quer.Caso contrário, se você deseja aplicar o patch introduzido em um commit a apenas um único arquivo, você tem várias opções. Você pode executar
git cherry-pick -n
, ou seja, sem submetê-lo, editar o commit (por exemplo, redefinir todos os arquivos usandogit reset -- .
e apenas adicionar o arquivo que você realmente deseja alterar usandogit add <filename>
). Ou você pode criar o diff para o arquivo e aplicar o diff então:fonte
Crie um
patch file
e aplique-o.EDITAR:
Já que você precisa fazer as alterações de um commit, crie o patch assim:
fonte
git diff sha1
(ougit diff branch
- é o mesmo se a ramificação apontar para o mesmo hash) produzirá apenas uma diferença do diretório de trabalho atual em relação a esse hash, mas não o que muda um commit introduzido por si mesmo.git checkout
com um nome de arquivo é o martelo certo para este prego. Ambas as opções são desnecessariamente complexas.checkout
não funcionará, já que pode envolver outras alterações anteriores indesejadas e pode não conter alterações feitas no branch atual.Outra coisa útil a fazer é obter o patch localmente e usar:
Isso não é uma escolha seletiva.
fonte
Git tem tudo pronto :)
Apenas use
git checkout <sha> <path-to-file>
fonte
isto funciona se você quiser que um único arquivo de outro ramo seja copiado para o ramo de trabalho atual
fonte
Isso é o que você está procurando:
sha1 é opcional
fonte
O que costumo fazer é usar
git ls-tree
apenas faça:
Isso imprimirá todos os nomes de arquivo que correspondam ao seu grep e fornecerá as chaves SHA1 dos arquivos no commit.
O Git show também pode ser usado em arquivos fora do seu branch. usar
>
de seu shell para canalizar a saída para um arquivo fornece o resultado que você está procurando.fonte
Você pode tentar fazer isso:
Por exemplo:
fonte
move os arquivos para o estágio de pré-confirmação
remove da memória
Agora seu branch está bem limpo (revertido para o commit anterior)
fonte