git reset --soft HEAD~1
deve fazer o que quiser. Depois disso, você terá as primeiras alterações no índice (visíveis com git diff --cached
) e as alterações mais recentes não serão realizadas. git status
ficará assim:
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: foo.java
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: foo.java
#
Você pode fazer git add foo.java
e confirmar as duas alterações ao mesmo tempo.
git commit --amend
faz; mas com um fluxo de trabalho muito mais complicado. Isso não responde à pergunta do OP, apesar de dar uma boa direção (git reset
).git reset --soft HEAD~
Usar:
Isso faz uma redefinição "mista" por padrão, que fará o que você pediu; coloque foo.java no unstaged, removendo a confirmação mais recente.
fonte
git reset --soft
não funcionou, masgit reset HEAD^
fezPara mim, o seguinte é a maneira mais legível (portanto preferível) de fazer isso:
Em vez de
1
, pode haver qualquer número de confirmações que você deseja desestabilizar.fonte
git reset --soft
é justamente isso: é comogit reset --hard
, mas não toca nos arquivos.fonte
git reset
"é comogit reset --hard
mas não toca nos arquivos." Nãogit reset --soft
.git reset --soft
preparará as mudanças, para que você não precise adicioná-las à preparação no caso de desejá-las, mas precisarágit reset
delas (sim, uma segunda vez e sem a--soft
) caso contrário. Portanto, essa resposta é curta, mas incorreta.Para desagrupar todos os arquivos em seu último commit -
git reset HEAD~
fonte
"Redefinir" é a maneira de desfazer alterações localmente. Ao confirmar, você primeiro seleciona as alterações a serem incluídas no " git add " - isso é chamado de "teste". E uma vez que as mudanças são realizadas, você as " git confirma ".
Para voltar da preparação ou confirmação, você "redefine" o HEAD. Em uma ramificação, HEAD é uma variável git que aponta para o commit mais recente. Portanto, se você encenou, mas não se comprometeu, " git reset HEAD ". Isso faz o backup para o HEAD atual, retirando as alterações do palco. É uma abreviação de " git reset --misted HEAD ~ 0 ".
Se você já efetuou o commit, o HEAD já avançou; portanto, você precisa fazer o backup para o commit anterior. Aqui você " redefine HEAD ~ 1 " ou " redefine HEAD ^ 1 " ou " redefine HEAD ~ " ou " redefine HEAD ^ " - todas as referências HEAD menos um.
Qual é o melhor símbolo, ~ ou ^? Pense no ~ til como um fluxo único - quando cada confirmação tem um pai único e há apenas uma série de alterações em sequência, você pode fazer referência ao backup usando o til, como HEAD ~ 1, HEAD ~ 2, HEAD ~ 3, para pais, avós, bisavós etc. (tecnicamente, é encontrar o primeiro pai nas gerações anteriores).
Quando há uma mesclagem, as confirmações têm mais de um pai. É quando o cursor ^ entra em jogo - você pode se lembrar porque mostra os galhos se unindo. Usando o cursor, HEAD ^ 1 seria o primeiro pai e HEAD ^ 2 seria o segundo pai de um único commit - mãe e pai, por exemplo.
Portanto, se você está retornando apenas um salto em um commit de pai único, HEAD ~ e HEAD ^ são equivalentes - você pode usar qualquer um deles.
Além disso, a redefinição pode ser --soft , --mixed ou --hard . Uma reinicialização suave apenas faz o backup da confirmação - ela redefine o HEAD, mas não verifica os arquivos da confirmação anterior, portanto todas as alterações no diretório de trabalho são preservadas. E --soft reset nem limpa o cenário (também conhecido como índice ), portanto, todos os arquivos que foram testados ainda estarão no palco.
Uma redefinição --mixed (o padrão) também não faz check-out dos arquivos da confirmação anterior, portanto todas as alterações são preservadas, mas o estágio é limpo. É por isso que um simples " git reset HEAD " desaparecerá do palco.
Um --hard reset redefine o HEAD, e limpa o cenário, mas também verifica todos os arquivos do commit anterior e, portanto, substitui as alterações.
Se você enviou o commit para um repositório remoto, a redefinição não funciona tão bem. Você pode redefinir localmente, mas quando tentar enviar para o controle remoto, o git verá que o HEAD local está atrás do HEAD no ramo remoto e se recusará a enviar. Você pode forçar o empurrão, mas o git realmente não gosta de fazer isso.
Como alternativa, você pode ocultar suas alterações, se quiser mantê-las, confira o commit anterior , retire o stash das mudanças, prepare-as, crie um novo commit e faça o push.
fonte
Digamos que você queira desestabilizar as alterações até as confirmações,
Onde os hashes de confirmação são os seguintes:
Em seguida, execute o seguinte comando:
git reset hn
Agora o HEAD estará em hn + 1. As alterações de h1 para hn não terão etapas.
fonte