Eu tenho uma árvore como esta:
(commit 1) - master
\-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
e eu tenho que mover o ramo PRO para dominar
(commit 1) - master
|-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
Eu tentei um git rebase master
ramo PRO, mas nada acontece.
Para esclarecer : eu estava trabalhando em master e então tive que fazer uma demonstração do produto ( git checkout -b demo
e algumas confirmações). Então, por engano, crio outro ramo a partir da demonstração ( git checkout -b PRO
e algumas confirmações) e agora preciso mover o ramo PRO para dominar e deixar a demonstração intacta. No final, tanto o demo quanto o PRO serão suspensos do master.
Respostas:
Use
--onto
para isso:Dado o seu caso:
Basicamente, você pega todas as confirmações de depois
demo
atéPRO
e as refaz para amaster
confirmação.fonte
git rebase --onto first-branch second-branch second-branch
, mas eu não entendo a sintaxegit rebase --onto first-branch master second-branch
--onto
, e como eles escreveram me ajudougit rebase --onto newBase oldBase feature/branch
origin/newBase
é o nome de um ramo, assim comonewBase
no meu exemplo. Depende apenas se você estiver reestruturando em um ramo que existe no seu repositório local (newBase
) ou em um que existe no controle remoto (origin/newBase
).newBase
é o nome de uma filial local eorigin/newBase
é o nome de uma filial remota. Qual deles você quer depende do que você está refazendo. Não é que se trabalhe e se não, é que eles se refazem em coisas diferentes. A pergunta original nunca menciona controles remotos, portanto, usar controles remotos no meu exemplo não corresponderia à pergunta que foi feita.Vou tentar ser o mais genérico possível. Primeiro, verifique se você está no ramo desejado:
Em seguida, use o seguinte comando (onde
new-base-branch
é o ramo que você deseja que seja sua nova base ecurrent-base-branch
é o ramo que é sua base atual.)Se você não tiver conflitos, então ótimo - está feito. Se sim (na maioria dos casos), continue lendo.
Podem surgir conflitos, e você terá que resolvê-los manualmente. O Git agora tenta fazer uma "fusão de três vias" entre você
current-branch
,current-base-branch
enew-base-branch
. Aproximadamente é assim que o git funcionará internamente:O Git primeiro rebase o
current-base-branch
em cima donew-base-branch
. Pode haver conflitos; que você terá que resolver manualmente. Depois disso, você costuma fazergit add .
egit rebase --continue
. Isso criará um novo commit temporáriotemp-commit-hash
para isso.Depois disso, o Git agora rebase o seu
current-branch
em cima detemp-commit-hash
. Pode haver mais conflitos e, novamente, você terá que resolvê-los manualmente. Uma vez feito isso, você continuar novamente com ogit add .
egit rebase --continue
, após o qual você rebased com sucesso o seucurrent-branch
no topo donew-base-branch
.Nota: Se você começar a estragar tudo, poderá fazer a
git rebase --abort
qualquer momento durante o processo de rebase e voltar ao ponto de partida.fonte
rebase
comando postado apenas me dá "fatal: upstream inválido 'current-base-branch'". Além disso, por que é necessário dizer ao GIT qual é o ramo pai atual do ramo atual - ele já não deveria saber disso?Faça o checkout para
PRO
ramificar, copie os hashes de confirmação mais antigos ( commit4 ) e mais recentes ( commit5 ) deste ramo e cole em outro lugar:Exclua a
PRO
ramificação (mantenha um backup apenas por segurança). Crie e efetue o checkout para uma novaPRO
filial emmaster
:Leve ( escolha de cereja ) o intervalo de confirmações da
PRO
ramificação anterior para a novaPRO
ramificação:Agora, se tudo estiver ok, force (-f) a pressionar para
remote PRO
ramificar e excluir aPRO.bac
ramificação local :fonte
Eu tive uma abordagem um pouco diferente usando redefinições e stashes que evitam excluir e recriar ramificações, além de eliminar a necessidade de alternar ramificações:
Ao redefinir a ramificação em uma base de consolidação por consolidação, você basicamente apenas retrocede o histórico de ramificação, uma consolidação por vez.
fonte