i’ve talked before about how the history of a codebase is as important as the codebase itself. Rebase é a ferramenta que pode fazer o único maior impacto para alcançar isso. O conhecimento prévio dos conceitos fundamentais de controle de fonte é crucial para a compreensão deste post.,

Lembre-se, mesmo que você pode usar Rebase para a seguinte (e talvez mais) dos casos, continua a ser a melhor prática para cometer cedo e muitas vezes:

  • Editar/refazer um commit na história
  • Adicione uma confirmação da história de um conjunto de alteração (ou ramo)
  • Remover uma confirmação da história de um conjunto de alteração (ou ramo)
  • Dividir um commit em várias compromete-se
  • Combinar uma série de commits em um commit
  • reordenar compromete-se

o Que faz alterar a base de dizer?,

git rebase – Reaplicar compromete-se em cima de outro da base de dados de ponta

git rebase

Se você substituir a palavra ‘base’ com ‘ancestral’ significa a mesma coisa, então, em outras palavras:

Dar um novo ancestral de uma confirmação ou uma seqüência de commits.

‘base’ é usado na documentação para permitir que a base signifique um ramo, um commit, uma tag, ou qualquer outra coisa que possa ser referenciada dentro do git.,

Como discutido anteriormente, um commit contém-entre outras coisas-o id do(s) Seu (s) commit (s) pai (s). Como tal, o Rebase está efetivamente atualizando o commit pai para o conjunto de commits que você fornece.

também é importante lembrar que cada commit no Git é imutável, mesmo para refazer. Como tal Rebase irá recriar cada commit, acorrentando-os todos juntos, mas com o novo ancestral.

Rebase é um pouco como o Almanaque Esportivo Grays: ele pode mudar tudo!
From tenor.com as regras!,

ao usar Rebase existem certas regras que você precisa aderir – caso contrário, um mundo de dor pode se seguir.

  1. Nunca Rebase um ramo público – um que outras pessoas estão usando

lembre – se que Rebase tem que seguir as regras de um commit-que é imutável. Como tal, um novo commit será criado para cada passo do processo. Isso significa que você ‘puxaria o tapete debaixo dos pés’ de qualquer um usando o ‘velho’ commit.,

Git irá ver que o commit existe duas vezes – a primeira versão e a versão Rebaseada – e potencialmente ficar confuso quando você tentar juntar as alterações. Além disso, a história mostrará o commit duas vezes, embora com ids diferentes. Um pouco como ter dois Marty na mesma linha do tempo – confuso!

Leitura Adicional:

  • reajuste regras

e se correr mal

como no regresso ao futuro, há sempre uma saída para qualquer problema que possa surgir., Como Rebase cria novos commits, o branch pode ser reinicializado de volta para o commit antigo e você está de volta onde estava antes. Sugiro que empurres sempre o teu ramo para o controlo remoto antes de usares o Rebase, especialmente se estiveres menos familiarizado com ele. Só adiciona outro nível de segurança no caso de precisar.

Antes de usar Rebase, tome nota de onde você estava – Qual é o ID de commit, ou o nome do ramo se ele não mudou de remoto.,

Se alterar a base de falhar a meio e você deseja cancelar/anular e voltar para onde você estava antes, você pode executar: git rebase --abort

Se o seu ramo foi empurrado antes de-mão e você deseja redefinir para que o ramo se parece remotamente: git reset --hard origin/<branch name>

Se você tiver apenas a submissão prévia id: git reset --hard <commit SHA>

Cada um dos comandos descritos acima irá redefinir o atual ramo de volta para onde você estava antes de você começar a alterar a base de atividade.,

Futher reading:

  • git-rebase

Interactive Rebase

Rebase can be used in one of two different modes, interactive and non-interactive. Ambos fazem a mesma coisa, mas a edição interativa permite a manipulação do processo.

então nós descrevemos Rebase como uma ferramenta que pode fornecer um novo ancestral para um conjunto de commits. Rebase irá criar um ‘script’ (como uma lista de itens por-fazer) do qual os commits serão afetados. A versão não-interativa do Rebase produz este script, em seguida, executá-lo imediatamente.,

a versão interativa permite que este script seja editado antes de ser executado.

o programa é simplesmente um conjunto ordenado de comandos a executar. É um arquivo de texto que contém cada ID de commit e o que deve ser feito com ele. A mensagem para cada commit é incluída para maior clareza.

Um exemplo Rebase interativo script parecido com:

pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post

No exemplo acima, pick significa adicione a consolidação como uma criança na submissão anterior. Assim, a história, a partir da base dada será exatamente como a fornecida acima., O script funciona de cima para baixo, então o commit no fundo será o último commit adicionado ao branch.

Você pode escolher comandos diferentes em vez de pick, eles são:

em muitos casos você pode causar conflitos de junção à medida que o Rebase progride através do seu programa. Isto é normal e nada com que se preocupar. Terá de resolver os conflitos antes de poder prosseguir. Se este for o caso, use git mergetool para resolver os conflitos. Uma vez que todos eles estão resolvidos use git rebase --continue para continar o processo., Claro que, se quiser interromper o processo de ajuste de bases, use git rebase --abort.

vale a pena notar que o Rebase é inteligente o suficiente para apenas criar novos commits onde ele sabe que algo mudou. Se o pai de um commit é o mesmo que antes, ele vai manter o commit como-é e seguir em frente até que ele tem algum trabalho a fazer. Abaixo estão alguns exemplos para demonstrar usagens de Rebase para vários fins. Todos presumem que a “base” mudou, e como tal Rebase tem trabalho a fazer em cada etapa do processo.,

Editar / Refazer um commit no histórico

considere o cenário onde você precisa corrigir um tipo em um arquivo. Você quer editar o commit para que o commit seja limpo e apropriado – você não quer ter outro commit que corrige o erro de erro mais tarde.,=”5779374de0″>

  • Aguarde para você editar/modificar cometer 449486aa
  • Adicione cometer 3d4e82be definição de seu pai para o novo id 449486aa
  • No passo 4 você pode fazer as alterações que você precisa e alterar a comprometer-se, por exemplo:

    1. Modificar o arquivo
    2. o ficheiro de Fase (git add <file>
    3. Commit no arquivo, altera a consolidação (git commit --amend

    Quando terminar o altera você precisa executar git rebase --continue prossiga com o passo 5 e concluir o processo.,

    Corrigir um erro de digitação em uma mensagem de commit

    reword comando é o mesmo como o edit comando – exceto que ele só pede para que a mensagem seja alterado, ao invés de incluir a confirmação de conteúdo, por exemplo:

    pick 509de5ac New post - Building performant large scale web applications (#1344)reword 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post

    Não se esqueça, mudar a mensagem no script NÃO altera o conteúdo da mensagem de commit. Gravar e fechar o programa e esperar que o Rebase reabra o editor de mensagens para os commit/s escolhidos.,

    adicione um commit no histórico de um conjunto de alterações (ou ramo)

    considere o cenário onde você precisa fazer uma alteração adicional à base de código após um commit. Esqueceste – te de o fazer, e queres garantir que está no lugar certo na história-logo a seguir ao compromisso apropriado., 509de5ac

  • Esperar para que você faça as alterações que você precisa
  • Adicione cometer 3d4e82be, a definição de seu pai para a nova identificação para o novo commit que você criou
  • em Vez de editar 449486aa neste momento, você pode adicionar um novo commit em vez disso, por exemplo:

    1. Fazer a alteração/s
    2. o arquivo Estágio/s (git add <file>
    3. Confirmar a alteração/s (git commit)

    Quando terminar o altera você precisa executar git rebase --continue prossiga com o passo 5 e concluir o processo., No final do processo você terá 4 commits na história ao invés de 3.

    remova um commit do histórico de um conjunto de alterações (ou ramo)

    considere o cenário em que cometeu uma alteração que não deseja manter e deseja removê-la do histórico. Talvez você tenha cometido uma mudança temporária que você quer ejetar do branch antes que ele seja fundido.,

    Você pode editar o script para que ele mostre algo como o seguinte:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 3d4e82be Add fundamentals blog post

    Note que a linha 2 (449486aa) foi removido, então ele não será incluído no processo.,

    Quando você salvar, em seguida, feche o arquivo, alterar a base será:

    1. Redefinir o ramo para a base
    2. Adicione cometer 509de5ac, a definição de seu pai para o dado da base de dados
    3. Adicione cometer 3d4e82be definição de seu pai para o novo id 509de5ac

    No final do processo você terá 2 compromete-se na história, ao invés de 3.

    Divida um commit em vários commits

    considere o cenário em que você acidentalmente cometeu duas alterações no mesmo commit., Você quer dividi-los para que a história seja limpa; de modo que, se necessário no futuro, parte do commit pode ser revertida sem reverter tudo isso.,”>

    Quando você salvar, em seguida, feche o arquivo, alterar a base será:

    1. Redefinir o ramo para a base
    2. Adicione cometer 509de5ac, a definição de seu pai para o dado da base de dados
    3. Adicione cometer 449486aa definição de seu pai para o novo id 509de5ac
    4. Aguarde para você editar/modificar este commit
    5. Adicione cometer 3d4e82be, a definição de seu pai para a nova identificação para o último commit que você adicionou na etapa 4

    em Vez de editar a consolidação, a redefinição de fora, desfazendo o passo 2, mas mantendo as alterações no disco.,

    assim você pode executar git reset HEAD~1. Isto irá remover o commit e colocar todas as alterações na sua cópia de trabalho. De lá, você pode optar por adicionar os arquivos para o indivíduo comete, i.e.

    1. git add <file1> então git commit -m <message 1>
    2. git add <file2> então git commit -m <message 2>

    Quando terminar o altera o que você precisa, executar git rebase --continue prossiga com o passo 5 e concluir o processo. No final do processo você terá 5 (ou mais) commits na história em vez de 3.,

    Combine uma série de commits em um commit

    considere o cenário, você fez alguns commits e eles precisam ser unidos juntos: eles não fazem sentido por conta própria ou por alguma outra razão.,p>Você pode editar o script para que ele mostre algo como o seguinte:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)squash 3d4e82be Add fundamentals blog post

    Quando você salvar, em seguida, feche o arquivo, alterar a base será:

    1. Redefinir o ramo para a base
    2. Adicione cometer 509de5ac definição de seu pai para o dado da base de dados
    3. Adicione cometer um commit o contém as alterações a partir de 449486aa e 3d4e82be, a definição de seu pai para o novo id 509de5ac
      1. alterar a base de uma pausa e de linha de comandos para uma mensagem, que é preparado como uma combinação de ambas as mensagens de confirmação, eu.,E. “Source control-when blog post (#1345) Add fundamentals blog post”
      2. If you want to take the message from the first commit as-is then use the fixup command instead of squash.

    Você podesquashoufixup tantos commits quanto quiser – não se limita a 2 commits de cada vez. Quando o editor de mensagens é gravado e fechado (se você estiver usando squash) Rebase irá continar até o fim do script., No final do processo você terá 2 commits na história ao invés de 3. A última persistência terá a mensagem que introduziu no editor de mensagens durante o Passo 3. Git será o padrão concatenate as mensagens em conjunto, ao usar squash e usar a primeira mensagem ao usar fixup.

    re-ordena commits

    considere o cenário, você fez algumas mudanças, mas elas fazem mais sentido se estiverem em uma ordem diferente.,

    Você pode editar o script para que ele mostre algo como o seguinte:

    pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog postpick 509de5ac New post - Building performant large scale web applications (#1344)

    Note que a linha 1 foi movido para a linha 3., Quando você salvar, em seguida, feche o arquivo, alterar a base será:

    1. Redefinir o ramo para a base
    2. Adicione cometer 449486aa, a definição de seu pai para o dado da base de dados
    3. Adicione cometer 3d4e82be definição de seu pai para o novo id 449486aa
    4. Adicione cometer 509de5ac, a definição de seu pai para o novo id 3d4e82be

    No final do processo você terá o mesmo compromete-se, apenas em uma ordem diferente.,

    nenhum trabalho para fazer

    mencionei acima que o Rebase é inteligente o suficiente para não criar novos commits onde ele não precisa – isto é, quando a base/pai é o mesmo que antes., Isto é o que acontece se você não modificar o script inicial, portanto, ele ainda se parece com isso quando você fechar o editor:

    pick 509de5ac New post - Building performant large scale web applications (#1344)pick 449486aa Source control - when blog post (#1345)pick 3d4e82be Add fundamentals blog post
    1. Redefinir o ramo para a base, que é o mesmo que o pai de 509de5ac
    2. Adicione cometer 509de5ac, o pai é o mesmo, Nenhuma outra alteração é necessária para a confirmação pode ser usado como está
    3. Adicione cometer 449486aa, o pai é o mesmo: 509de5ac., Não são necessárias outras alterações para que o commit possa ser usado como-is
    4. adicionar commit 3d4e82be, o pai é o mesmo: 449486aa. Não são necessárias outras alterações para que o commit possa ser usado como-is

    no final do processo nada terá mudado no branch – todos os commits ainda existirão e na mesma ordem. Na verdade Rebase é ainda mais inteligente do que isso, mas eu estou usando esta simplificação para demonstrar que Rebase só vai recriar commits quando precisa.,

    Leitura Adicional

    • git rebase
    • reajustando regras