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 HEAD
commit, 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 HEAD
commit. 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 --amend
na linha de comando.
HEAD
e 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:
HEAD
sem editar a mensagem de confirmaçãoHEAD
sem 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 HEAD
confirmação. O Git não fornece um único comando para modificar um commit que não seja, HEAD
portanto, 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 HEAD
pode 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 HEAD
como descrito acima. Em seguida, diga ao Git que você terminou digitando r r. Se A'
e B
conflito, o rebase será interrompido B
e você deverá resolvê-lo. Depois de fazer isso, pressione r rpara continuar.
Se você souber que suas alterações A
resultarã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 --squash
variante. Para obter informações sobre as diferenças, consulte a git-commit
página do manual.
Para realmente combinar o A
commit e o novo commit A'
e, em seguida, reaplicar B
em 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, --fixup
as --squash
variantes 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-commit
A 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.
i
me 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.