minhas informações de contato
Correspondência[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
【tópico relacionado】
- Vai
commit
Rebase da versão para outro branch- Execute rebase em caso de conflito de versão
- Execute um rebase interativo em uma versão especificada
- Usando rebase interativo para agregar versões
- Alterando committers usando rebase interativo
- Versão de agregação automática
Rebase (Rebasing
) é um recurso extremamente poderoso do Git.Rebase é um tipo de operação: se umcommit
A O mais antigo foi baseadocommit
B de; entãoA Rebase paraC, isto é, vai A tornar-se baseado emC Operação.
No caso de demonstração a seguir, você descobrirá que o rebase muitas vezes não é tão fácil quanto parece.
commit
Rebase da versão para outro branch Vejamos primeiro o tipo mais simples de operação de rebase. Trabalho de preparação relacionado: introduzir um novo arquivo, enviar, alterar o conteúdo e enviar novamente.Desta forma, há o dobro da população localcommit
Versão.
Ainda com jgit
Biblioteca por exemplo:
# Clone jgit repo into chapter4
$ git clone https://git.eclipse.org/r/jgit/jgit chapter4
$ cd chapter4
# Checkout a new branch
$ git checkout -b rebaseExample --track origin/stable-3.1
# Create the 1st commit
$ echo "My Fishtank
Gravel, water, plants
Fish, pump, skeleton" > fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Create the 2nd commit
$ echo "mosquitos" >> fishtank.txt
$ git add fishtank.txt
$ git commit -m "Feeding my fish"
# Rabase to stable-3.2
$ git rebase origin/stable-3.2
Successfully rebased and updated refs/heads/rebaseExample.
Antes de rebasear:
Depois de rebasear:
git rebase
O processo de execução:
HEAD
A versão comum entre o branch de destino apontado pelo rebase (merge-base
);merge-base
, encontre todas as versões ausentes na ramificação de destino;Se um commit
versão ou umbranch
Rebase uma ramificação para uma diferenteHEAD
, é provável que ocorram conflitos de versão.Neste ponto o conflito deve ser resolvido e o comando executadogit rebase --continue
, o rebase poderá ser concluído.
Os exemplos nesta seção demonstram como realizar o rebase na presença de conflitos.Seguindo o resultado final demonstrado na Seção 4.1, desta vezrebaseExample
A filial foi rebaseada parastable-3.2
filial.O exemplo verificará novamente o novo branch do stable-3.1 e adicionará um erebaseExample
Arquivos de texto com o mesmo nome de branch, mas com conteúdo incompatívelfishtank.txt
:
# Checkout rebaseExample2
$ git checkout -b rebaseExample2 --track origin/stable-3.1
# Add a new commit
$ echo "My Fishtank
Pirateship, Oister shell
Coconut shell
">fishtank.txt
$ git add fishtank.txt
$ git commit -m "My brand new fishtank"
# Rebase conflicting branches
$ git rebase rebaseExample
Auto-merging fishtank.txt
CONFLICT (add/add): Merge conflict in fishtank.txt
error: could not apply 24f9bf1ef... My brand new fishtank2
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 24f9bf1ef... My brand new fishtank2
$ subl fishtank.txt
A situação de conflito é a seguinte:
Mude para o seguinte conteúdo, salve e feche:
Adicione os arquivos mesclados e continue o rebase:
$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
O editor que se abre é mostrado na figura:
Confirme, salve e feche, e você verá um aviso informando que o rebase foi bem-sucedido:
$ git rebase --continue
[detached HEAD 9911772b3] My brand new fishtank2
1 file changed, 2 insertions(+), 3 deletions(-)
Successfully rebased and updated refs/heads/rebaseExample2.
# Check new status via gitk
$ gitk
Detalhes a seguir:
Pode-se observar que neste rebase, apenas as versões que estão presentes no branch antigo, mas não no novo branch, serão rebaseadas (ou seja, novas versões serão adicionadas) commit
)。
Nas informações do prompt do git da primeira interrupção do rebase, você também pode ver duas alternativas:
git rebase --abort
: Como significado literal, interrompa o rebase
git rebase --skip
: Ignore conflitos e faça rebase diretamente, o que resultará em rebaseExample2
Descarte o novocommit
, diretamente incorporado em rebaseExample
, o pai apontou após o rebase, e rebaseExample
Consistente:
Neste exemplo, usamos o rebaseExample
Com base nas ramificações, demonstre como usar--interactive
Mark, rebase os dois em 4.1commit
Rebase para branch de rastreamento remotostable-3.1
superior:
$ git checkout rebaseExample
Switched to branch 'rebaseExample'
Your branch is ahead of 'origin/stable-3.1' by 109 commits.
(use "git push" to publish your local commits)
$ git rebase origin/stable-3.1
Neste momento, uma lista de commits será exibida no novo editor pop-up, com o intervalo rebaseExample
estable-3.1
entre, tudo pode ser rebaseado parastable-3.1
decommit
Registro.Mantenha os dois novos no exemplocommit
, exclua todo o resto (ou seja, o conteúdo da linha 89 e anteriores):
Após salvar, saia do editor e você verá a seguinte saída:
$ git rebase --interactive origin/stable-3.1
Successfully rebased and updated refs/heads/rebaseExample.
# Check in gitk view:
O resultado é o seguinte:
Extensão de exemplo
Neste exemplo, você também pode obter rapidamente o efeito desejado através de um comando:
$ git rebase --onto origin/stable-3.1 origin/stable-3.2 rebaseExample
Successfully rebased and updated refs/heads/rebaseExample.
O diagrama antes e depois do rebase é o seguinte: