Compartilhamento de tecnologia

[Notas de estudo do Git] Capítulo 4 Operação git rebase rebase e exemplos relacionados (Parte 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Capítulo 4 Operações de rebase e casos relacionados

【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

4.0 Introdução ao rebase

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.

4.1 vontade 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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

Antes de rebasear:

Insira a descrição da imagem aqui

Depois de rebasear:

Insira a descrição da imagem aqui

git rebase O processo de execução:

  1. virar para cima HEAD A versão comum entre o branch de destino apontado pelo rebase (merge-base);
  2. baseado em merge-base, encontre todas as versões ausentes na ramificação de destino;
  3. Tente aplicar as versões ausentes, uma por uma, ao branch de destino.

4.2 Realizando rebase em caso de conflitos de versão

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

A situação de conflito é a seguinte:

Insira a descrição da imagem aqui

Mude para o seguinte conteúdo, salve e feche:

Insira a descrição da imagem aqui

Adicione os arquivos mesclados e continue o rebase:

$ git add fishtank.txt
$ git rebase --continue
hint: Waiting for your editor to close the file...
  • 1
  • 2
  • 3

O editor que se abre é mostrado na figura:

Insira a descrição da imagem aqui

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Detalhes a seguir:

Insira a descrição da imagem aqui

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:

  1. git rebase --abort: Como significado literal, interrompa o rebase

  2. 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:

    Insira a descrição da imagem aqui


4.3 Executar rebase interativo em uma versão especificada

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
  • 1
  • 2
  • 3
  • 4
  • 5

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):

Insira a descrição da imagem aqui

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:
  • 1
  • 2
  • 3

O resultado é o seguinte:

Insira a descrição da imagem aqui

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.
  • 1
  • 2

O diagrama antes e depois do rebase é o seguinte:

Insira a descrição da imagem aqui