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.
- 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″>
449486aa
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:
- Modificar o arquivo
- o ficheiro de Fase (
git add <file>
- 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
3d4e82be
, a definição de seu pai para a nova identificação para o novo commit que você criouem Vez de editar 449486aa
neste momento, você pode adicionar um novo commit em vez disso, por exemplo:
- Fazer a alteração/s
- o arquivo Estágio/s (
git add <file>
- 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á:
- Redefinir o ramo para a base
- Adicione cometer
509de5ac
, a definição de seu pai para o dado da base de dados - Adicione cometer
3d4e82be
definição de seu pai para o novo id509de5ac
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á:
- Redefinir o ramo para a base
- Adicione cometer
509de5ac
, a definição de seu pai para o dado da base de dados - Adicione cometer
449486aa
definição de seu pai para o novo id509de5ac
- Aguarde para você editar/modificar este commit
- 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.
-
git add <file1>
entãogit commit -m <message 1>
-
git add <file2>
entãogit 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á:
- Redefinir o ramo para a base
- Adicione cometer
509de5ac
definição de seu pai para o dado da base de dados - Adicione cometer um commit o contém as alterações a partir de
449486aa
e3d4e82be
, a definição de seu pai para o novo id509de5ac
- 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”
- If you want to take the message from the first commit as-is then use the
fixup
command instead ofsquash
.
Você podesquash
oufixup
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á:
- Redefinir o ramo para a base
- Adicione cometer
449486aa
, a definição de seu pai para o dado da base de dados - Adicione cometer
3d4e82be
definição de seu pai para o novo id449486aa
- Adicione cometer
509de5ac
, a definição de seu pai para o novo id3d4e82be
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
- Redefinir o ramo para a base, que é o mesmo que o pai de
509de5ac
- Adicione cometer
509de5ac
, o pai é o mesmo, Nenhuma outra alteração é necessária para a confirmação pode ser usado como está - 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 - 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
Deixe uma resposta