Pergunta

Eu tenho dois ramos do meu mestre:

  • v2.1: (versão 2) Eu trabalho há vários meses
  • WSS: que criei ontem para adicionar um recurso específico ao meu mestre (em produção)

Existe uma maneira de copiar os compromissos de ontem do WSS para a v2.1?

Foi útil?

Solução

Você realmente deve ter um fluxo de trabalho que permite fazer tudo isso, mesclando:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

Então, tudo que você precisa fazer é git checkout v2.1 e git merge wss. Se por algum motivo você realmente não pode fazer isso, e você não pode usar Git Rebase Para mover sua filial WSS para o lugar certo, o comando para pegar um único compromisso de algum lugar e aplicá -lo em outro lugar é Git Cherry-Pick. Basta conferir o ramo em que deseja aplicá -lo e execute git cherry-pick <SHA of commit to cherry-pick>.

Algumas das maneiras pelas quais Rebase pode salvá -lo:

Se sua história se parece com isto:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

Você poderia usar git rebase --onto v2 v2-only wss Para mover o WSS diretamente para V2:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

Então você pode se fundir! Se você realmente, realmente, verdade Não posso chegar ao ponto em que você pode se fundir, você ainda pode usar o Rebase para efetivamente fazer vários picados de cereja de uma só vez:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

NOTA: O motivo pelo qual é preciso algum trabalho extra para fazer isso é que está criando compromissos duplicados em seu repositório. Isso não é realmente uma coisa boa - o ponto principal de ramificação e fusão fáceis é poder fazer tudo, fazendo cometê um (s) um lugar e fundindo -os onde quer que sejam necessários. Os compromissos duplicados significam uma intenção de nunca mesclar essas duas filiais (se você decidir que deseja mais tarde, receberá conflitos).

Outras dicas

Usar

git cherry-pick <commit>

aplicar <commit> para o seu ramo atual.

Eu mesmo provavelmente verificaria os compromissos que escolhi gitk E coloque-os com o botão direito do mouse na entrada de comprometimento lá em vez disso.


Se você quiser se tornar mais automático (com todos os seus perigos) e assumindo que todos os compromissos desde que aconteceu ontem no WSS, você poderia gerar a lista de começos usando git log com (--pretty sugerido por jefromi)

git log --reverse --since=yesterday --pretty=%H

Então tudo juntos assumindo que você usa bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

Se algo der errado aqui (há muito potencial), você está com problemas, pois isso funciona no check-out ao vivo, para que faça picks manuais de cereja ou use rebase como sugerido por Jefromi.

git cherry-pick : Aplique as alterações introduzidas por algumas confirmações existentes

Presuma que temos ramo UMA com (x, y, z) comete. Precisamos adicionar essas confirmações a ramificar B. Nós vamos usar o cherry-pick operações.

Quando usamos cherry-pick, devemos adicionar compromissos na filial B na mesma ordem cronológica que os compromissos aparecem no ramo UMA.

Cherry-Pick suporta uma série de commits, mas se você tiver uma mescla

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

Exemplo de fluxo de trabalho:

enter image description here

Podemos usar cherry-pick com opções

-e ou --edit : Com esta opção, o Git Cherry-Pick permitirá que você edite a mensagem de confirmação antes de se comprometer.

-n ou--não-comprometido : Geralmente, o comando cria automaticamente uma sequência de começos. Esse sinalizador aplica as alterações necessárias para escolher cada um nome nomeado com sua árvore de trabalho e o índice, sem cometer. Além disso, quando essa opção é usada, seu índice não precisa corresponder à confirmação da cabeça. A escolha da cereja é feita contra o estado inicial do seu índice.

Aqui um interessante artigo relativo cherry-pick.

Você poderia Crie um patch Dos compromissos que você deseja copiar e Aplique o patch para a filial de destino.

Ou se você é um pouco menos do lado do evangelista, pode fazer um pouco feio de maneira que estou usando. Em implantação_template, há compromissos que quero copiar no meu mestre como ramo implantando

git branch deploy deploy_template
git checkout deploy
git rebase master

Isso criará uma nova ramificação implantada (eu uso -f para substituir o ramo de implantação existente) no implantar_template e depois rebocar esta nova filial ao Master, deixando o implantação intocada.

Para o caso simples de apenas copiar o último compromisso do ramo WSS para a v2.1, você pode simplesmente pegar o ID do Commit (git log --oneline | head -n 1) e fazer:

git checkout v2.1
git merge <commit>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top