Tenho duas ramificações (A e B) e quero mesclar um único arquivo da ramificação A com um arquivo único correspondente da ramificação B.
git
merge
git-branch
Isuru
fonte
fonte
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853Respostas:
Me deparei com o mesmo problema. Para ser mais preciso, tenho duas ramificações
A
eB
os mesmos arquivos, mas uma interface de programação diferente em alguns arquivos. Agora, os métodos de arquivof
, que são independentes das diferenças de interface nos dois ramos, foram alterados no ramoB
, mas a alteração é importante para os dois ramos. Assim, eu preciso mesclar apenas arquivof
de ramificaçãoB
em arquivof
de ramificaçãoA
.Um comando simples já resolveu o problema para mim se eu assumir que todas as alterações foram confirmadas nos dois ramos
A
eB
:O primeiro comando muda para ramificação
A
, para onde eu quero mesclarB
a versão do arquivof
. O segundo comando corrige o arquivof
comf
deHEAD
deB
. Você pode até aceitar / descartar partes únicas do patch. Em vez deB
você pode especificar qualquer confirmação aqui, não precisa serHEAD
.Edição na comunidade : se o arquivo
f
ativadoB
ainda não existirA
, omita a--patch
opção. Caso contrário, você receberá uma "Sem alteração". mensagem.fonte
git checkout --patch B -- f
para fazer isso funcionar.a
durante a fase interativa, em vez de pressionary
todas as vezes. Ou use ogit checkout B -- f
comando.Aqui está o que eu faço nessas situações. É uma confusão, mas funciona muito bem para mim.
Tentei aplicar patches e minha situação era muito feia para isso. Então, resumindo, ficaria assim:
Filial de Trabalho: Uma Filial Experimental: B (contém file.txt que possui as alterações que eu quero incluir.)
Crie uma nova ramificação com base em A:
Mesclar B no tempAB
Copie o hash sha1 da mesclagem:
Faça o checkout do seu ramo de trabalho:
Faça o checkout do seu arquivo corrigido:
E aí você deve tê-lo. Confirme seu resultado.
fonte
A
desviou-se deB
outras maneiras. A cópia substituirá essas diferenças.Isso usa o difftool interno do git. Talvez um pouco de trabalho para fazer, mas para a frente.
fonte
--
(rótulo de argumento vazio), git checkout docs: ARGUMENT DISAMBIGUATION diga: "usegit checkout -- <pathspec>
se você quiser fazer checkout desses caminhos fora do índice". Isso ocorre porque você pode ter uma ramificação e um arquivo / caminho com o mesmo nome. Nesses casos, em vez de pedir para você desambiguar se o ramo ou o caminho deve ser retirado quando ambos existirem, o git optará por fazer o checkout do ramo por padrão. No entanto, se--
preceder, o git fará o checkout do arquivo / caminho.Achei essa abordagem simples e útil: Como "mesclar" arquivos específicos de outro ramo
Por favor, leia o artigo inteiro para mais compreensão
fonte
-p
opção nesse comando. Que, então, substitui todas as partes do arquivo da sua árvore de trabalho que anteriormente foram desviadas da ramificação da qual você efetuou o check-out, antes das alterações do patch, infelizmente.Você poderia usar:
Dica: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
fonte
git merge-file
O comando a seguir irá (1) comparar o arquivo da ramificação correta, para dominar (2) interativamente, perguntar quais modificações aplicar.
git checkout - mestre de patches
fonte
Minha edição foi rejeitada, por isso estou anexando como lidar com a fusão de alterações de uma ramificação remota aqui.
Se você precisar fazer isso após uma mesclagem incorreta, poderá fazer algo assim:
fonte
Supondo que B é o ramo atual:
Observe que isso aplica apenas alterações ao arquivo local. Você precisará confirmar depois.
fonte
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Você pode fazer o check-out da versão antiga do arquivo para mesclar, salvando-o com um nome diferente e executar a ferramenta de mesclagem nos dois arquivos.
por exemplo.
git show B:src/common/store.ts > /tmp/store.ts
(onde B é o nome da filial / confirmação / tag)meld src/common/store.ts /tmp/store.ts
fonte
Vou fazer isso como
git format-patch branch_old..branch_new file
isso produzirá um patch para o arquivo.
Aplicar patch no alvo branch_old
git am blahblah.patch
fonte