Aplicando as mudanças do branch b para a, sem fundir ou adicionar commits

86

Meu cenário é que tenho um branch no qual fiz grandes melhorias no processo de construção (branch A) e em outro estou trabalhando em um recurso não relacionado (branch B). Então, agora, quando estou hackeando o branch B, quero extrair o que escrevi no branch A porque quero compilações mais rápidas e fáceis. No entanto, eu não quero "poluir" meu branch B, apenas adicionar alterações do branch A às alterações não planejadas.

O que eu tentei (quando estava no branch B):

git merge --no-commit branchA

Não funciona porque coloca você dentro de uma fusão. Do contrário, seria perfeito.

git checkout branchA -- .

Não funciona porque aplica alterações entre branchA..branchB e não as alterações master..branchA.

Algo mais?

Editar: Sim, as alterações na ramificação A são confirmadas. Neste exemplo, há apenas uma ramificação com melhorias de construção, mas pode haver até N ramificações com melhorias de construção que desejo aplicar enquanto trabalho em uma ramificação de recurso.

Björn Lindqvist
fonte
As mudanças em A já estão confirmadas?
Theolodis

Respostas:

152

Eu só tive que fazer algo semelhante e fui capaz de consertar adicionando --squashao comando merge

git merge --no-commit --squash branchA
git reset HEAD # to unstage the changes
guilffer
fonte
3
Isso também deve ter uma nota explicativa sobre o que está fazendo também. Ele organiza a diferença de mudanças do branchA para o seu branch atual
KareemElashmawy,
Digamos que acabei de mesclar o código do branchA no master, mas esqueci de algo e quero adicionar mais alguns códigos / alterações a esse commit de mesclagem sem aparecer como outro commit de mesclagem no histórico do git. este método funcionará?
Sushmit Sagar
@Sushmit Eu acho que você pode fazer um git commit —amende ele irá anexar as novas alterações ao último commit, só não tenho certeza se funciona em commits de mesclagem
guilffer
1
Eu não acho que --no-commit seja necessário aqui? Deve ser o padrão.
Petter
11

cherry-pick -n deve fazer o que você quer, mas eu não tenho certeza porque você quer as melhorias de compilação como mudanças não testadas - isso apenas torna várias coisas mais difíceis (por exemplo, mesclar outras mudanças aos arquivos modificados ou rebasing qualquer coisa).

Neste exemplo, há apenas uma ramificação com melhorias de construção, mas pode haver até N ramificações com melhorias de construção que desejo aplicar enquanto trabalho em uma ramificação de recurso.

Nesse caso, eu criaria um novo branch, C, que você mescla de A e B (e quaisquer outros branches com melhorias de construção). Faça commit das mudanças na ramificação do recurso, B, e então mescle-as na ramificação C, que agora contém as melhorias de construção e as mudanças na ramificação do recurso, para que você possa testá-las juntas. Se você precisar fazer mais alterações, faça-o no branch apropriado, não em C, então mescle para C. Portanto, nunca altere nada no branch C, apenas use-o para integrar as alterações de outros branches.

Isso significa que você pode usar todos os recursos do Git no branch C, em vez de fazer malabarismos com mudanças não consolidadas em uma árvore suja.

Jonathan Wakely
fonte
UseCase para cherry-pick -n: Criei uma cópia de trabalho do meu código adicionando muitas coisas a lugares aleatórios. Agora eu quero limpar meu código antes de me comprometer com o branch desse recurso. Então eu mudo para um branch temporário, confirmo todas as alterações. Volte para o branch de recursos, cherry-pickesse commit. Existe um jeito melhor de fazer isso?
Tejas Kale de
6

Você deve ser capaz de escolher os commits ( -npara evitar cometer imediatamente).

Lucero
fonte
-n não funcionou. Ele diz que nenhuma opção -m dada a confirmação de escolha certa falhou.
Alejandro Sanz Díaz
5

Não tenho 100% de certeza se entendi claramente, mas no meu caso acabei de criar um patch diff entre os branches e depois apliquei esse caminho no branch B.

No ramo A:

 git diff branchA..branchB > patch.diff
 git apply patch.diff
sobi3ch
fonte
4

Não tenho certeza se entendi seus requisitos.

Você pode executar uma fusão e, em seguida, chamar git reset HEAD~1.


A sequência a seguir deve repetir todos os commits entre mastere branchAapós branchB. As confirmações que já foram aplicadas em branchBserão ignoradas.

# start from branchA
git checkout branchA
# create a temporary branch wip
git checkout -b wip
# use rebase to replay each commit between master and wip on branchB
git rebase --onto branchB master wip

# if you want to remove all the commit history and only keep the resulting diffs,
# use git reset
git reset branchB

# change the active branch
git checkout branchB
# remove temp branch
git branch -d wip
LeGEC
fonte
Isso adiciona arquivos à área de teste do git que eu não quero. Além disso, só parece funcionar bem quando todos os branches são ramificados a partir do mesmo commit no branch master. Caso contrário, diffs fora do intervalo master..branchA são introduzidos.
Björn Lindqvist
@ BjörnLindqvist: remova a --softopção se você não quiser as mudanças na área de teste. Você poderia desenhar um gráfico de como seus ramos estão configurados?
LeGEC