Como consertar um overcommit

Você já enviou acidentalmente mais arquivos do que pretendia? Você já usou acidentalmente git commit -aquando queria dizer git commit? Eu sei que tenho na ocasião.

Então, digamos que você estava tentando fazer um commit file1e file2, mas tem mudanças em file3que deseja fazer um commit separadamente. Observe que, neste caso, eu quero preservar as alterações em file3, só quero confirmá-las mais tarde. Se eu não me importasse com as mudanças, poderia usar git reset --hard HEAD^e começar de novo. Porém, então eu teria que refazer o trabalho nos vários arquivos, o que obviamente não é divertido. Mas se você mantiver o controle do SHA atual do HEAD, pelo qual você pode acessar git log --oneline -1, então você pode realmente cherry-pickmudar de volta com a --no-commitbandeira. Em seguida, você pode usar git resetpara redefinir os arquivos de que não se importa. Isso parece muito abstrato, então aqui estão as etapas uma por uma:

git add file1 file2
git commit
-a -m 'some message' # oops!
git log
--oneline -1 # keep the SHA reported from this command
git reset
--hard HEAD^
git cherry
-pick --no-commit 0b13436 # This is the kept SHA from earlier
git reset file3

git commit
# This recommits the earlier change, but without file3

Após esses comandos, file3estará em um estado modificado, mas não confirmado, que é exatamente o que eu queria. Você pode então enviar o arquivo3 separadamente com uma mensagem diferente ou continuar o desenvolvimento.