A situação:
- mestre está em X
- quickfix1 está em X + 2 confirma
De tal modo que:
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
Então comecei a trabalhar no quickfix2, mas, por acidente, tomei o quickfix1 como o ramo de origem para copiar, não o mestre. Agora o quickfix2 está em X + 2 confirma + 2 confirmações relevantes.
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
\
q2a--q2b (quickfix2 HEAD)
Agora eu quero ter uma ramificação com o quickfix2, mas sem os 2 commits que pertencem ao quickfix1.
q2a'--q2b' (quickfix2 HEAD)
/
o-o-X (master HEAD)
\
q1a--q1b (quickfix1 HEAD)
Tentei criar um patch a partir de uma determinada revisão no quickfix2, mas o patch não preserva o histórico de confirmação. Existe uma maneira de salvar meu histórico de consolidação, mas ter uma ramificação sem alterações no quickfix1?
quickfix1
. (Observe também a diferença nas respostas.) #Respostas:
Este é um caso clássico de
rebase --onto
:Então você deve ir de
para:
É melhor fazer isso em uma árvore de trabalho limpa.
Vejo
git config --global rebase.autostash true
, especialmente depois do Git 2.10 .fonte
q2a
OntoX
e selecione Rebase 2 commits a partir das opções do diálogo ocorrendo.git rebase --onto
.rebase.autostash
configuração: isso evitará qualquer perda de trabalho em andamento na árvore de trabalho ao fazer uma nova refazer.Você pode usar
git cherry-pick
apenas escolher o commit que deseja copiar.Provavelmente, a melhor maneira é criar a ramificação fora do mestre e, nessa ramificação, use
git cherry-pick
as 2 confirmações do quickfix2 que você deseja.fonte
A coisa mais simples que você pode fazer é escolher uma variedade. Faz o mesmo que o,
rebase --onto
mas é mais fácil para os olhos :)fonte
rebase --onto
também preserva as alterações originais?rebase
echerry-pick
fornecer novas chaves SHA. Isso ocorre porque cada confirmação é um instantâneo exclusivo do repositório.cherry-pick
um intervalo como nesta resposta e confundiu meu repo. Eu tive que fazercherry-pick
s individuais para cada confirmação. (E talvez ele vai sem dizer, mas no caso de alguém está lutando, você tem quecherry-pick
na ordem cronológica que seus commits foram aplicadas.)git checkout
é crucial aqui. qual é a sua cabeça :)?Eu acredito que é:
fonte
cherry-pick
funciona com hashes de commit, portanto, se você quiser pegar um commit de algum lugar e colocá-lo em outro lugar, este é o caminho a seguir. Apenas certifique-se de fazer ocheckout <branch>
ramo correto primeiro.Outros comandos mais úteis aqui com explicação: Guia Git
fonte