Em breve, dado:
Before rebase After rebase
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \ \
D---E---H---I (HEAD) \ E'---H' (HEAD)
\
D---E---H---I
git rebase --onto F D H
Qual é o mesmo que (porque --onto
leva um argumento):
git rebase D H --onto F
Significa rebase commit no intervalo (D, H] em cima de F. Observe que o range é exclusivo à esquerda. É exclusivo porque é mais fácil especificar o 1º commit digitando, por exemplo, branch
para deixar git
encontrar o 1º commit divergente, branch
ou seja, o D
que leva a H
.
Caso OP
o---o (A)
\
o (B)(HEAD)
git checkout B
git rebase --onto B A
Pode ser alterado para um único comando:
git rebase --onto B A B
O que parece erro aqui é o posicionamento, B
que significa "mover alguns commits que levam a ramificação B
por cima B
". A questão é o que "alguns commits" são. Se você adicionar -i
sinalizador, verá que é um único commit apontado por HEAD
. A confirmação foi ignorada porque já foi aplicada ao --onto
destino B
e, portanto, nada acontece.
O comando não faz sentido, em qualquer caso em que o nome do ramo seja repetido assim. Isso ocorre porque o intervalo de confirmações será de algumas confirmações que já estão nessa ramificação e, durante a reformulação, todas elas serão ignoradas.
Mais explicações e uso aplicável de git rebase <upstream> <branch> --onto <newbase>
.
git rebase
padrões.
git rebase master
Expande para:
git rebase --onto master master HEAD
git rebase --onto master master current_branch
Check-out automático após o rebase.
Quando usado de maneira padrão, como:
git checkout branch
git rebase master
Você não notará que, após o rebase, git
passar branch
para o commit rebased mais recente e o faz git checkout branch
(consulte o git reflog
histórico). O que é interessante quando o segundo argumento é o hash de confirmação, em vez disso, a rebase do nome da ramificação ainda funciona, mas como não há ramificação a ser movida, você acaba em "HEAD desanexado" em vez de fazer check-out na ramificação movida.
Omita confirmações divergentes primárias.
O master
in --onto
é retirado do 1º git rebase
argumento.
git rebase master
/ \
git rebase --onto master master
Tão prático que pode ser qualquer outro commit ou ramo. Dessa forma, você pode limitar o número de confirmações de rebase, pegando as mais recentes e deixando as confirmações divergentes primárias.
git rebase --onto master HEAD~
git rebase --onto master HEAD~ HEAD # Expanded.
Vai rebase única confirmação apontado por HEAD
que master
e acabam em "CABEÇA destacada".
Evite checkouts explícitos.
O padrão HEAD
ou current_branch
argumento é contextualmente retirado do local em que você está. É por isso que a maioria das pessoas faz checkout para ramificar as quais deseja refazer. Mas quando o segundo argumento de rebase é fornecido explicitamente, você não precisa fazer check-out antes de rebase para passá-lo de maneira implícita.
(branch) $ git rebase master
(branch) $ git rebase master branch # Expanded.
(branch) $ git rebase master $(git rev-parse --abbrev-ref HEAD) # Kind of what git does.
Isso significa que você pode recuperar as confirmações e ramificações de qualquer lugar. Então, juntamente com o checkout automático após o rebase.você não precisa fazer check-out separado da ramificação rebatida antes ou depois da rebase.
(master) $ git rebase master branch
(branch) $ # Rebased. Notice checkout.