Existem duas maneiras de lidar com isso. O que é mais fácil depende da sua situação
Redefinir
Se o commit do qual você deseja se livrar foi o último, e você não fez nenhum trabalho adicional, pode simplesmente usar git-reset
git reset HEAD^
Leva seu ramo de volta ao commit antes do seu HEAD atual. No entanto, ele realmente não altera os arquivos na sua árvore de trabalho. Como resultado, as alterações que ocorreram nesse commit aparecem como modificadas - é como um comando 'descomprometido'. Na verdade, eu tenho um apelido para fazer exatamente isso.
git config --global alias.uncommit 'reset HEAD^'
Depois, você pode apenas usar git uncommit
no futuro para fazer backup de uma confirmação.
Esmagar
Esmagar um commit significa combinar dois ou mais commit em um. Faço isso com bastante frequência. No seu caso, você tem um recurso concluído pela metade e, em seguida, finalizava e confirmava novamente com a mensagem de confirmação permanente e adequada.
git rebase -i <ref>
Digo acima, porque quero deixar claro que isso pode ser um número qualquer de confirmações. Execute git log
e encontre o commit do qual você deseja se livrar, copie o SHA1 e use-o no lugar de <ref>
. O Git o levará ao modo de rebase interativo. Ele mostrará todos os commits entre seu estado atual e o que você colocar no lugar <ref>
. Portanto, se <ref>
há 10 confirmações atrás, ele mostrará todos os 10 confirmações.
Na frente de cada commit, ele terá a palavra pick
. Encontre o commit do qual deseja se livrar e altere-o de pick
para fixup
ou squash
. O uso fixup
simples de descarte que confirma a mensagem e mescla as alterações em seu predecessor imediato na lista. A squash
palavra-chave faz a mesma coisa, mas permite editar a mensagem de confirmação do recém-combinado commit.
Observe que as confirmações serão confirmadas novamente na ordem em que aparecem na lista quando você sair do editor. Portanto, se você fez uma confirmação temporária, fez outro trabalho na mesma ramificação e concluiu o recurso em uma confirmação posterior, o uso de rebase permitirá reorganizar as confirmações e esmagá-las.
ATENÇÃO:
O rebasing modifica o histórico - NÃO faça isso em nenhum commit que você já tenha compartilhado com outros desenvolvedores.
Esconderijo
No futuro, para evitar esse problema, considere usar git stash
para armazenar temporariamente trabalho não confirmado.
git stash save 'some message'
Isso armazenará suas alterações atuais ao lado da sua lista de stash. Acima está a versão mais explícita do comando stash, permitindo um comentário para descrever o que você está ocultando. Você também pode simplesmente executar git stash
e nada mais, mas nenhuma mensagem será armazenada.
Você pode navegar na sua lista de stash com ...
git stash list
Isso mostrará todos os seus stashes, em quais ramos eles foram feitos, a mensagem e no início de cada linha e o identificador para o stash que se parece com este, stash@{#}
onde # é sua posição no conjunto de stashes.
Para restaurar um stash (que pode ser feito em qualquer ramificação, independentemente de onde o stash foi originalmente criado), basta executar ...
git stash apply stash@{#}
Novamente, há # a posição na matriz de esconderijos. Se o stash que você deseja restaurar estiver na 0
posição - isto é, se foi o stash mais recente. Depois, é só executar o comando sem especificar a posição stash, git irá assumir que você quer dizer a última: git stash apply
.
Por exemplo, se eu estiver trabalhando no ramo errado - posso executar a seguinte sequência de comandos.
git stash
git checkout <correct_branch>
git stash apply
No seu caso, você mudou um pouco mais os galhos, mas a mesma idéia ainda se aplica.
Espero que isto ajude.
git stash