I'm usando o git em um novo projeto que tem dois ramos de desenvolvimento paralelos -- mas atualmente experimentais --:
master
: importação de codebase existente mais alguns mods que I'geralmente tenho certeza deExp1' e Exp2' representam duas abordagens arquitetônicas muito diferentes. Até que eu avance mais, não tenho como saber qual delas (se alguma) vai funcionar. À medida que progrido num ramo, às vezes tenho edições que seriam úteis no outro ramo e gostaria de fundir apenas essas.
Qual é a melhor maneira de fundir mudanças seletivas de um ramo de desenvolvimento para outro, deixando para trás tudo o resto?
Abordagens I'considerei:
Cópia manual de arquivos comuns para um diretório temporário seguido de `git checkout' para mover para o outro ramo e depois mais cópia manual do diretório temporário para a árvore de trabalho.
Uma variação sobre o acima exposto. Abandonar as filiais exp
por enquanto e utilizar dois repositórios locais adicionais para a experimentação. Isto torna a cópia manual dos arquivos muito mais simples.
Todas estas três abordagens parecem enfadonhas e propensas a erros. I'm esperando que haja uma abordagem melhor; algo parecido com um parâmetro de caminho de filtro que tornaria a git-merge
mais seletiva.
Você usa o comando cherry-pick para obter commits individuais de um ramo.
Se a(s) alteração(ões) que você quer não está(ão) em commits individuais, então use o método mostrado aqui para dividir o commit em commits individuais. Grosso modo, você usa git rebase -i
para obter a commit original para editar, então git reset HEAD^
para reverter as mudanças seletivamente, então git commit
para submeter aquele bit como uma nova commit no histórico.
Há outro método legal aqui na Red Hat Magazine, onde eles utilizam git add --patch
ou possivelmente `git add --interactive' que permite que você adicione apenas partes de um hunk, se você quiser dividir diferentes alterações em um arquivo individual (procure nessa página por "split").
Tendo dividido as mudanças, você pode agora escolher apenas as que quiser.
Eu não'não gosto das abordagens acima. Usar o cherry-pick é ótimo para escolher uma única mudança, mas é uma dor se você quiser trazer todas as mudanças, exceto algumas ruins. Aqui está a minha abordagem.
Não há nenhum argumento "interativo" que você possa passar para a fusão.
Aqui está a alternativa:
Você tem algumas mudanças no ramo 'característica' e você quer trazer algumas mas não todas para 'master' de uma forma não descuidada (ou seja, você não'não quer escolher e comprometer cada uma delas)
git checkout feature
git checkout -b temp
git rebase -i master
# Above will drop you in an editor and pick the changes you want ala:
pick 7266df7 First change
pick 1b3f7df Another change
pick 5bbf56f Last change
# Rebase b44c147..5bbf56f onto b44c147
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
git checkout master
git pull . temp
git branch -d temp
Então embrulhe isso em um script de shell, mude o master para $to e mude o recurso para $from e você está pronto para ir:
#!/bin/bash
# git-interactive-merge
from=$1
to=$2
git checkout $from
git checkout -b ${from}_tmp
git rebase -i $to
# Above will drop you in an editor and pick the changes you want
git checkout $to
git pull . ${from}_tmp
git branch -d ${from}_tmp
1800 INFORMAÇÕES'A resposta da 1800 INFORMAÇÕES é completamente correta. Como um git noob, porém, "use git cherry-pick" era'não era o suficiente para eu descobrir isso sem um pouco mais de escavação na internet, então eu pensei que eu'publicaria um guia mais detalhado no caso de alguém mais estar em um barco similar.
Meu caso de uso estava querendo puxar seletivamente as mudanças de outra pessoa's github branch para o meu próprio. Se você já tem um ramo local com as mudanças você só precisa fazer os passos 2 e 5-7.
Criar (se não for criada) uma filial local com as modificações que você deseja trazer.
$ git branch mybranch <base branch>
Mude para ele.
$ git checkout mybranch
Puxe para baixo as alterações que quiser da conta da outra pessoa's. Se você tem't já você'vai querer adicioná-las como um controle remoto.
$ git remoto adicionar repos-w-changes <git url>
Puxa tudo do ramo deles para baixo.
"$$ git pull repos-w-changes branch-i-want
Veja os registros de commit para ver quais mudanças você quer:
$ git log
Volte para o ramo para o qual você quer puxar as mudanças.
"$$ checkout de caixa original do ramo
A cereja escolhe os teus compromissos, um a um, com os hashes.
$ git cherry-pick -x hash-of-commit
Ponta do chapéu: http://www.sourcemage.org/Git_Guide