Eu tenho 2 confirmações, A e B, prontas para serem enviadas. Percebo que esqueci de adicionar algo em A.
Como posso adicionar essa alteração a A usando o Magit? Eu nem sei qual parte da documentação do Git devo olhar.
Eu tenho 2 confirmações, A e B, prontas para serem enviadas. Percebo que esqueci de adicionar algo em A.
Como posso adicionar essa alteração a A usando o Magit? Eu nem sei qual parte da documentação do Git devo olhar.
Respostas:
Vamos fingir por um momento que você deseja adicionar algo ao HEADcommit, ou seja, "o segundo commit B" no seu exemplo.
O pop-up de confirmação capresenta uma ligação " aAlterar". Pressionar essa tecla "alterará" as alterações faseadas no HEADcommit. Como as confirmações não são mutáveis no Git, isso realmente substituirá a confirmação antiga por uma nova confirmação. Um buffer com a mensagem de confirmação antiga será exibida, para que você possa modificá-lo caso a alteração adicionada também exija que você ajuste a mensagem. Como sempre, pressione C-c C-cquando terminar de editar a mensagem. Isso é equivalente a executar git commit --amendna linha de comando.
HEADe edite sua mensagem de confirmaçãoComo geralmente acontece que você só precisa ajustar a alteração ou a mensagem, o Magit fornece duas variantes adicionais:
HEADsem editar a mensagem de confirmaçãoHEADsem adicionar as alterações faseadas a elaQuando você deseja editar um commit que não é HEAD, o procedimento acima não funcionará. Esses comandos sempre "modificam" (ou seja, substituem) a HEADconfirmação. O Git não fornece um único comando para modificar um commit que não seja, HEADportanto, isso é um pouco mais envolvido.
Magit não fornecer tal comando, mas porque há situações em que é preferível fazer isso em várias etapas, vamos discutir isso primeiro.
Modificar um commit diferente de HEADpode ser dividido em três etapas:
A) o HEAD.HEAD(como descrito acima), resultando em confirmação A'.A, mas ainda por cima A'.Isso pode ser feito usando um rebase interativo. Digite rpara mostrar o pop-up rebase. Em seguida, digite mpara chamar a variante de rebase "editar uma confirmação". Um buffer com confirmações recentes é exibido. Vá para o commit que você deseja modificar e digite C-c C-cpara selecioná-lo. O Git, em seguida, rebobina o histórico para esse commit e mostra informações sobre a rebase em andamento no buffer de status.
Modifique HEADcomo descrito acima. Em seguida, diga ao Git que você terminou digitando r r. Se A'e Bconflito, o rebase será interrompido Be você deverá resolvê-lo. Depois de fazer isso, pressione r rpara continuar.
Se você souber que suas alterações Aresultarão em conflito com B, prossiga como descrito acima, caso contrário, use a seguinte abordagem.
O Git permite criar "consertos de conserto" usando git commit --fixup A. Isso cria um novo commit, que registra alterações que "deveriam ter sido feitas em outro commit". Esse commit se torna o novo HEAD. Também existe uma --squashvariante. Para obter informações sobre as diferenças, consulte a git-commitpágina do manual.
Para realmente combinar o Acommit e o novo commit A'e, em seguida, reaplicar Bem cima disso, você deve usar rebase. O Magit fornece um comando conveniente para fazer isso r f.
A principal diferença para a abordagem acima é que aqui primeiro criamos um novo commit e, em seguida, fazemos uma nova reformulação para combiná-lo com o "target" e reaplicar B. Acima, começamos com rebasear em vez de cometer.
No Magit, --fixupas --squashvariantes e estão disponíveis no pop-up commit, on fe s. Mas o Magit também fornece variantes "instantâneas" dos comandos de correção e squash em Fe S. Essas variantes criam uma nova confirmação como as variantes "não instantâneas", mas combinam instantaneamente a confirmação de correção com a confirmação de destino usando rebase, sem que você precise chamar outro comando.
"Instant fixup" ( c F) é essencialmente a mesma coisa que "extend HEAD" ( c e), exceto que funciona para qualquer confirmação, não apenas HEAD.
Leitura adicional:
git-commit(1)git-rebase(1)git-commitA página de manual redireciona para as git-rebase(1)quais tem estas linhas: A mensagem de confirmação sugerida para a confirmação dobrada é a concatenação das mensagens de confirmação da primeira confirmação e daquelas com o comando "squash", mas omite as mensagens de confirmação de confirmações com a "correção" comando. IOW, use conserto se você quiser consertar o código no commit anterior, use squash se você também desejar consertar a mensagem de commit.
git commit --amend –C HEADé o comando Git que você deseja procurar e pode fazer as pazes com o Magit C-c C-a.
C-c C-aé de uma versão mais antiga (eu acho). Além disso, não vejo nenhum vestígio de "alterar" no buffer de ajuda ( ?).
Portanto, um fluxo de trabalho é:
Então
O autosquash moverá automaticamente todas as confirmações do! Fixup para o lugar certo e as definirá para serem esmagadas na base.
ime rende Cannot rebase: Your index contains uncommitted changes. Please commit or stash them.. Exceto que não tenho alterações não confirmadas. : /
Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort. Está tentando me dizer que minha correção pode fazer cocô na mesclagem futura?
merge in rebase:, veja erros em git help rebase. Sugiro fazer a correção antes de puxar a montante.
Para emendar o último commit, é "c a". A correção é para corrigir algumas confirmações mais antigas.