Welcome to Our Website

Git Interactive Rebase, Squash, Emend and Other Ways of Reescriting History

“Please rebase on top of master and we’ll merge your pull request”.pode, por favor, anular os seus commits para termos uma história limpa e reversível?”.

” pode reescrever a mensagem do seu commit para descrever melhor o problema que resolve e como o resolve?”.

perguntas como estas são comumente feitas em pedidos de puxão. Vamos ver por que eles existem, como realizá-los, e seus possíveis problemas.,

reformula a última mensagem de commit

uma das reescritas de história mais simples que podemos fazer com o git é Alterar a mensagem lastcommit. Digamos que logo após fazer um commit você encontra um erro tipográfico em sua descrição, ou você encontra uma maneira melhor de descrever o changeset. Para fazer a correcção que executa:

git commit --amend 

irá abrir um editor com a última mensagem de commit, para que possa modificá-la. Após a gravação, um novo commit será criado com as mesmas mudanças e a nova mensagem, substituindo o commit com a mensagem anterior.,

isto pode ser útil para incluir ficheiros que se esqueceu de seguir ou incluir alterações nos ficheiros que acabou de enviar. Para fazer isso, você pode adicionar o changesand, em seguida, executar a alterar:

git add README.md config/routes.rb git rm notes.txt git commit --amend 

Além de editar a mensagem de commit, o novo commit irá conter o changesspecified com git add e git rm. Você também pode editar o autor. Por exemplo:

git commit --amend --author="Tute Costa and Dan Croak <[email protected]>" 

realização desbloqueada!, Você pode agora alterar o último commit do seu repositório para incluir novas alterações nos arquivos, e/ou para melhorar a mensagem do commit. Mas não comece a alterar todas as coisas antes de entender a última seção deste post no blog intitulado “DANGER”.

reformular outras mensagens de commit

adoraria falar sobre isso agora, mas precisamos entender uma ferramenta mais geral antes. Fiquem atentos! Tudo o resto será mais fácil assim que lermos sobre…

Rebase interactiva

git rebase re-aplica commits, um byone, por ordem, do seu ramo actual para outro., Ele aceita várias opções e parâmetros, de modo que esta é uma ponta da explicação do iceberg, o suficiente para fazer a ponte entre os comentários do StackOverflow ou do GitHub e as páginas do git man.

uma opção interessante que aceita é--interactive (-i para abreviar), que irá abrir um editor com uma lista dos commits que estão prestes a ser alterados. O Thislist aceita comandos, permitindo ao utilizador editar a lista antes de iniciar a acção da base.vejamos um exemplo.,

reponha outras mensagens de commit, tome 2

digamos que quero reformular qualquer um dos últimos 4 commits deste blog. I then rungit rebase -i HEAD~4, and here is what I see:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend # Rebase 8db7e8b..fa20af3 onto 8db7e8b # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out 

we see the four last commits, from older to newer. Ver o comentário abaixo a lista de commits? Bom trabalho a explicar, Idiota! pick (p for short) is the defaultaction. Neste caso, ele iria reaplicar o commit como está, sem alterações nos seus conteúdos ou mensagem. Gravar (e executar) este ficheiro não faria alterações no repositório.,

Se eu digo reword (r para o short), em um commit eu quiser editar o:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls r 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

Quando eu salvar e sair do editor, o git vai seguir os comandos descritos, landingmyself para o editor novamente, como se eu tivesse alterado cometer 3e7ee36. Eu edito essa mensagem commit, grava e sai do editor, e aqui está o resultado:

Agora Caleb diz em sua mensagem de commit “pare todo o realce”, se você é um garoto ou não.realização desbloqueada! Você pode agora mudar a mensagem de qualquer comando que quiser., Pode fazê-lo, mas certifique-se que compreende a secção “perigo”.

Squash compromete-se juntos

Dois outros comandos rebase interativo nos oferece são:

  • squash (s para o short), que se funde a confirmação para o anterior (theone na linha antes)
  • fixup (f para o short), que atua como “squash”, mas descarta essa cometer’smessage

vamos continuar a trabalhar no dou de exemplo nós workedbefore., Tivemos quatro compromete-se, a minha própria para este blog post, andthree outros de Caleb, que foram relacionados para o seu post anterior sobre o PGP:

pick 07c5abd Introduce OpenPGP and teach basic usage pick de9b1eb Fix PostChecker::Post#urls pick 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

Vamos supor que eu queira combinar Calebe compromete-se juntos, porque eles pertencem a thesame lógica changeset, e para que possamos git revert facilmente se encontramos weprefer não ter essas alterações neste repositório. Vamos querer manter a primeira mensagem de commit, e esmagar os dois commits subseqüentes no anterior., Eu alterar pick squash onde apropriado:

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls s 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

Salvar, e eu terras para o editor a decidir a mensagem de commit do meldedthree compromete-se (ver como eles estão concatenadas uma após a outra):

# This is a combination of 3 commits. # The first commit's message is: Introduce OpenPGP and teach basic usage Besides demystifying a relatively complex tool, protocol, and etiquette, this post is intended to help with problems such as the one outlined in this tweet: > Emailed sensitive info to someone with PGP. They replied, with my > original email, all in clear text. They didn't realize it. # This is the 2nd commit message: Fix PostChecker::Post#urls # This is the 3rd commit message: Hey kids, stop all the highlighting # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # Author: Caleb Hearth # Date: Tue Sep 2 09:39:07 2014 -0500 # # rebase in progress; onto 71d4789 # You are currently editing a commit while rebasing branch 'tc-git-rebase' on '71d4789'. 

eu decidir remover a terceira mensagem de commit, e adicionar mais relevantes nota para a segunda mensagem de commit. Salve o editor, e os quatro commits foram transformados em dois: o de Caleb, e o meu depois. Óptimo!,

poderíamos ter usado o comandofixup, se tivéssemos visto anteriormente que queremos as mudanças, mas não a mensagem de commit, do terceiro commit. Nesse caso, thecommands teria olhado como:

pick 07c5abd Introduce OpenPGP and teach basic usage s de9b1eb Fix PostChecker::Post#urls f 3e7ee36 Hey kids, stop all the highlighting pick fa20af3 git interactive rebase, squash, amend 

Quando salvo, o editor teria incluído a terceira mensagem de commit alreadycommented para nós:

Salvar e saídas de:

o Resultado é o mesmo: 2 compromete-se, em vez de 4, cada uma com um único, diferente, blogpost.realização desbloqueada! Pode agora juntar os commits. Atenção à secção de perigo.,

Rebase on top of master

we fork an open source library, start working on a feature branch, and master in upstream project moves ahead. Nossa história se parece com:

 A---B---C feature / D---E---F---G upstream/master 

o mantenedor da biblioteca pede para “se ajustar em cima do mestre”, então corrigimos qualquer junção que possa surgir entre ambos os ramos, e mantemos a nossa changeset Unida.O mantenedor gostaria de ver um histórico como:

 A'--B'--C' feature / D---E---F---G upstream/master 

queremos reaplicar os nossos commits, um a um, por ordem, no mestre do upstream.,Parece a descrição do comando rebase! Vamos ver que comandos nos colocariam no cenário desejado:

# Point our `upstream` remote to the original fork git remote add upstream https://github.com/thoughtbot/factory_girl.git # Fetch latest commits from `upstream` (the original fork) git fetch upstream # Checkout our feature branch git checkout feature # Reapply it onto upstream's master git rebase upstream/master # Fix conflicts, then `git rebase --continue`, repeat until done # Push to our fork git push --force origin feature 

realização desbloqueada! O seu ramo de recurso será aplicado no topo do mais recente mestre do garfo original.

E assim chegamos a…

perigo: você está reescrevendo história

veja o comando --force na última id

? Isso significa que estamos a reescrever a história do repositório., Isto é sempre seguro para fazer em commits que não compartilhamos com outros membros da equipe, ou em ramos que nos pertencem (veja minhas iniciais no exemplo deste post no blog).

mas se você forçar edições push que já foram compartilhadas com a equipe (commits que existem fora do meu repositório, como as mudanças que eu fiz para os commits PGP que já foram compartilhados), então o ramo de todos fica fora de sincronia.

reescrever o histórico significa abandonar os commits existentes e criar novos, que podem ser muito semelhantes, mas são diferentes., Se outros se basearem nos seus compromissos anteriores, e depois reescrever e forçar os seus commits, os membros da sua equipa terão de voltar a fundir o seu trabalho (se notarem a perda potencial).

no thoughtbot nós prefixamos nossos ramos com nossas iniciais, sinalizando que esses comitês podem ser reescritos e outros não devem adicionar commits para o branch. Quando se compromete a aterrar em master ou num ramo partilhado, nunca mais os reescrevemos.

Por isso reescreva o histórico do git, desde que os commits reescritos existam apenas no seu relatório, ou você e a sua equipa saibam que mais ninguém deve basear-se neles.,realização desbloqueada! Você agora sabe como rebater enquanto é um bom cidadão.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *