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.
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 asgit-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 MagitC-c C-a
.fonte
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.
fonte
i
me rendeCannot 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 emgit 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.
fonte