Questão Como alterar o último commit para adicionar um arquivo?


Eu modifiquei dois arquivos a, b no último commit. Mas arquivo b não deve ser confirmado, qual é o fluxo de trabalho para corrigir isso?


86


origem




Respostas:


Atualização (alguns anos depois)

Jan Hudec 

É trivial removê-lo apenas do índice.

Verdadeiro: você pode redefinir um arquivo para seu conteúdo de índice com bastante facilidade, resposta mais recente (escrito por Matt Connolly) sugere:

git reset HEAD^ path/to/file/to/revert

HEAD^ permite que o arquivo acesse seu conteúdo no commit anterior antes o último.

Então você pode git commit --amend, como escrevi originalmente abaixo.


Resposta original (janeiro de 2011)

Se este é seu último commit (e você não o colocou em qualquer lugar), você pode emendar isto:
(primeiro esconderijo ou salvar b)

 git commit --amend

Em seguida, exclua b, re-commit. Restaurar b e pronto.

--amend

Usado para corrigir a ponta do ramo atual.
  Prepare o objeto da árvore que você deseja substituir a última confirmação como de costume (isso inclui os caminhos -i / -o e explícitos usuais), e o editor de log de confirmação é propagado com a mensagem de confirmação da ponta da ramificação atual.
  O commit criado por você substitui a dica atual - se for uma mesclagem, ele terá os pais da dica atual como pais - então o commit top atual é descartado.


88



... Then stash/delete b, re-commit.., aqui não deveria a palavra Then estar after? - --amend depois stach / delete b, ... - Xiè Jìléi
@ 谢 继 雷: em outras palavras, salve b primeiro, depois confirme --endend e, em seguida, restaure? Verdade. Eu atualizei a resposta. - VonC
Com o poder do índice git, dizer a alguém para esconder / salvar o arquivo é simplesmente idiota (-1). É trivial removê-lo apenas do índice. - Jan Hudec
@JanHudec Verdade, editei a resposta de acordo. Eu não segui essa antiga resposta tão de perto quanto no Stack Overflow. 99% das perguntas do git sobre SU devem ser migradas no SO de qualquer maneira. - VonC


  1. git diff --name-only HEAD^ - (opcional) use para listar os arquivos que foram alterados o último commit.
  2. git reset HEAD^ path/to/file/to/revert - para redefinir o índice para essa última versão, deixando a cópia de trabalho intocado.
  3. git commit --amend - alterar o último compromisso para incluir o índice alterar

53



Por isso é uma resposta muito melhor do que a aceita. - mik01aj
Note que você não deve usar git commit -a --amend (por exemplo, não adicionar arquivos) para a etapa 3, ou você confirmará suas alterações na cópia de trabalho, que são as edições que você está tentando remover. Um passo opcional 2.5 pode ser git checkout path/to/file/to/revertpara limpar sua cópia de trabalho também. - dmnd
alternativamente git rm --cached path/to/file/to/revert para un-adicionar arquivo sem excluí-lo da árvore. - Jan Hudec


Alternativamente, se você estiver usando git gui, basta selecionar a opção "Amend last commit", o arquivo adicionado aparece na lista "Staged", clique no seu ícone para movê-lo para a lista "Unstaged" e confirmar.


13



@VonC: Editar e dividir correções é uma operação bastante comum para usuários pesados ​​do git, então o GUI foi projetado para facilitar e é a melhor ferramenta da IMO para isso. - Jan Hudec
Aquele funciona! Eu não tive sucesso com outras opções para essa tarefa específica. Obrigado pela dica! - Serguzest


Se você quiser excluir b do seu último commit

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

Se você quiser remover todas as alterações para b em seu último commit

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

8



git rm --cached e acabar com a dança de backup / restauração (-1). - Jan Hudec
Obrigado por apontar isso. Eu queria compartilhar como fiz isso, porque essa foi a abordagem com a qual me senti mais confortável, mesmo depois de ler o tópico inteiro. - pingo


Uma alternativa que não requer hackery de índice, mas preserva a velha mensagem de commit:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

Eu gosto disso porque (a) usa comandos que eu uso regularmente, e (b) eu posso fazer git add -p para descobrir exatamente o que é que eu quero cometer.


3