git - origin - Como posso desassociar meus arquivos novamente depois de fazer um commit local?



origin master git (4)

"Reset" é o caminho para desfazer as alterações localmente. Ao confirmar, você primeiro seleciona as alterações a serem incluídas no " git add " - chamado "staging". E uma vez que as mudanças são encenadas, você " git compromete " elas.

Para voltar do staging ou do commit, você "redefine" o HEAD. Em uma ramificação, HEAD é uma variável git que aponta para o commit mais recente. Então, se você encenou mas não se comprometeu, você " git reset HEAD ". Isso faz o backup do atual HEAD, tirando as mudanças do palco. É uma abreviação de " git reset --mixed HEAD ~ 0 ".

Se você já tiver confirmado, o HEAD já avançou, então você precisa fazer o backup para o commit anterior. Aqui você " redefine HEAD ~ 1 " ou " reset HEAD ^ 1 " ou " reset HEAD ~ " ou " reset HEAD ^ " - todos referência HEAD menos um.

Qual é o melhor símbolo, ~ ou ^? Pense no til como um único fluxo - quando cada commit tem um pai único e é apenas uma série de mudanças na sequência, então você pode fazer referência ao backup usando o til, como HEAD ~ 1, HEAD ~ 2, HEAD ~ 3, para pai, avô, bisavô, etc. (tecnicamente, é encontrar o primeiro pai nas gerações anteriores).

Quando há uma mesclagem, os commits têm mais de um pai. É quando o ^ caret entra em jogo - você pode lembrar porque mostra os galhos se juntando. Usando o cursor, HEAD ^ 1 seria o primeiro pai e HEAD ^ 2 seria o segundo pai de um único pai e mãe, por exemplo.

Então, se você está voltando apenas um hop em um single-parent commit, então HEAD ~ e HEAD ^ são equivalentes - você pode usar qualquer um deles.

Além disso, a reconfiguração pode ser --soft , --mixed ou --hard . Uma reinicialização por software apenas retira o commit - redefine o HEAD, mas ele não faz o check out dos arquivos do commit anterior, então todas as mudanças no diretório de trabalho são preservadas. E --soft reset nem limpa o estágio (também conhecido como o índice ), então todos os arquivos que foram testados ainda estarão no palco.

Uma reconfiguração --mixed (o padrão) também não faz o 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 " sairá do palco.

A --hard reset redefine o HEAD, e limpa o estágio, mas também verifica todos os arquivos do commit anterior e substitui quaisquer alterações.

Se você tiver enviado o commit para um repositório remoto, o reset não funcionará tão bem. Você pode redefinir localmente, mas quando você tentar empurrar para o controle remoto, o git verá que o seu HEAD local está atrás do HEAD na ramificação remota e se recusará a pressionar. Você pode ser capaz de forçar o push, mas o git realmente não gosta de fazer isso.

Como alternativa, você pode esconder as alterações se quiser mantê-las, verificar a confirmação anterior, desfazer as alterações, organizá-las, criar uma nova confirmação e, em seguida, enviá-las.

https://code.i-harness.com

Eu fiz o seguinte comando

git add <foo.java>
git commit -m "add the foo java"

Como posso deletar meu commit local agora e fazer foo.java em um estado sem estágio?

Se eu digitar git reset --hard , descobri que ele irá reverter minha modificação foo.java para a original.


Para desassociar todos os arquivos em seu último commit -

git reset HEAD~


Usar:

git reset HEAD^

Isso faz uma redefinição "mista" por padrão, que fará o que você pediu; Coloque foo.java no unstaged, removendo o commit mais recente.


git reset --soft HEAD~1 deve fazer o que você quiser. Depois disso, você terá as primeiras alterações no índice (visíveis com git diff --cached ) e suas alterações mais recentes não git diff --cached . 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 então fazer o git add foo.java e confirmar ambas as mudanças de uma só vez.





git