Como esmagar o Git cometidos

Como esmagar o Git cometidos

Como squash começos no git para manter seu histórico limpo

Quando você está trabalhando com o Git, é uma boa ideia se comprometer com frequência, para que você sempre possa voltar ao estado do código se você estragar tudo. No entanto, cometer todas essas mini-mudanças no ramo principal nem sempre é uma boa ideia. Isso deixa a história bagunçada e difícil de seguir.

O Git fornece uma maneira de esmagar um monte de suas confirmações usando o comando rebase. Depois de fazer suas alterações localmente em um arquivo específico ou em um recurso específico, você sempre pode usar o método de abóbora para combinar as alterações antes de se comprometer com o ramo principal. Isso ajudará outros a entender melhor suas mudanças.

AVISO: Mesmo que você possa tirar de repositórios externos e squash se comprometerem, é uma má ideia. Pode criar conflitos e confusão. Evite mudar o histórico que já é público. Só se atenha aos commits esmagadores que são locais para o seu trabalho.

Vamos trabalhar com um exemplo de caso.

Suponha que tenhamos dois arquivos um.py e b.py. Vamos primeiro passar pelo processo de criar os arquivos e fazer as modificações:

$ mkdir myProject
$ CD MyProject/
$ git init
$ echo "print (" hello a ")"> a.py
$ git add -a && git commit -m "adicionou um.py "
$ echo "print (" hello b ")"> b.py
$ git add -a && git commit -m "adicionado b.py "
$ echo "print (" hello bb ")"> b.py
$ git add -a && git commit -m "b.modificação py 1 "
$ echo "print (" hello bbb ")"> b.py
$ git add -a && git commit -m "b.modificação py 2 "

Se verificarmos o histórico de começos, veremos o seguinte:

$ git log --oneeline --graph -decoratório
* DFC0295 (cabeça -> mestre) B.Modificação PY 2
* CE9E582 b.Modificação PY 1
* 7A62538 Adicionado B.py
* 952244A adicionou um.py

Depois que terminamos de nosso trabalho, decidimos colocar todas as mudanças no B.py em um único compromisso para clareza. Contamos que existem 3 compromissos em B.py da cabeça. Emitimos o seguinte comando:

git rebase -i cabeça ~ 3

A opção -i diz ao Git para usar o modo interativo.

Ele deve aparecer uma janela no seu editor de texto git:

Escolha 7A62538 Adicionado B.py
Escolha CE9E582 b.Modificação PY 1
Escolha DFC0295 b.Modificação PY 2
# Rebase 952244A… DFC0295 para 952244A (3 comando (s))
#
# Comandos:
# p, pick = use commit
# r, reword = use commit, mas edite a mensagem de confirmação
# e, editar = usar commit, mas pare para alterar
# s, squash = use commit, mas se misture com um compromisso anterior
# f, fixup = como "squash", mas descarte a mensagem de log desta confirmação
# x, EXEC = Run Comando (o restante da linha) usando shell
#
# Essas linhas podem ser reordenadas; Eles são executados de cima para baixo.
#
# Se você remover uma linha aqui, esse compromisso será perdido.
#
# No entanto, se você remover tudo, o rebase será abortado.
#
# Observe que os compromissos vazios são comentados
~

Os compromissos são listados cronologicamente no topo, desde o primeiro até o mais recente. Você pode escolher qual se compromete a "escolher" e qual se compromete a esmagar. Por simplicidade, escolheremos o primeiro compromisso e esmagaremos o resto. Então, vamos modificar o texto como este:

Escolha 7A62538 Adicionado B.py
Squash CE9E582 b.Modificação PY 1
Squash DFC0295 b.Modificação PY 2
# Rebase 952244A… DFC0295 para 952244A (3 comando (s))
#
# Comandos:
# p, pick = use commit
# r, reword = use commit, mas edite a mensagem de confirmação
# e, editar = usar commit, mas pare para alterar
# s, squash = use commit, mas se misture com um compromisso anterior
# f, fixup = como "squash", mas descarte a mensagem de log desta confirmação
# x, EXEC = Run Comando (o restante da linha) usando shell
#
# Essas linhas podem ser reordenadas; Eles são executados de cima para baixo.
#
# Se você remover uma linha aqui, esse compromisso será perdido.
#
# No entanto, se você remover tudo, o rebase será abortado.
#
# Observe que os compromissos vazios são comentados

Assim que você salvar e fechar o arquivo de texto, outra janela de texto deve aparecer que se parece com o seguinte:

# Esta é uma combinação de 3 compromissos.
# A mensagem da primeira confirmação é:
Adicionado b.py
# Esta é a segunda mensagem de confirmação:
b.Modificação PY 1
# Esta é a terceira mensagem de confirmação:
b.Modificação PY 2
# Por favor, insira a mensagem de confirmação para suas alterações. Linhas começando
# com '#' será ignorado, e uma mensagem vazia aborta a confirmação.
#
# Data: sexta -feira, 30 de março 21:09:43 2018 -0700
#
# rebase em andamento; em 952244a
# Você está atualmente editando um compromisso enquanto se rebate o ramo 'mestre' em '952244a'.
#
# Muda a ser comprometido:
# Novo arquivo: B.py
#

Salve e feche este arquivo também. Você deve ver algo assim:

$ git rebase -i cabeça ~ 3
[Cabeça isolada 0798991] Adicionado B.py
Data: sexta -feira, 30 de março 21:09:43 2018 -0700
1 arquivo alterado, 1 inserção (+)
Criar modo 100644 b.py
Rebededado e atualizado com êxito Refs/Chefes/Mestre.

Se você verificar o histórico de compromissos agora:

$ git log --oneeline --graph -decoratório
* 0798991 (cabeça -> mestre) adicionado B.py
* 952244A adicionou um.py

Todos os compromissos para B.py foram esmagados em um commit. Você pode verificar olhando para o B.arquivo py:

$ cat b.py
print ("Hello BBB")

Tem o conteúdo da modificação 2.

Conclusão

O rebase é um comando poderoso. Pode ajudá -lo a manter seu histórico limpo. Mas evite usá -lo para compromissos públicos, pois pode causar conflitos e confusão. Use -o apenas para seu próprio repositório local.

Um estudo mais aprofundado:

  • https: // git-scm.com/docs/git-reabase
  • https: // git-scm.com/book/en/v2/git-rannching-reabasing
  • https: // git-scm.com/book/en/v2/git-tools-rewriting-history