Como desbloquear o commit local do git

Meu problema é que eu mudei o arquivo, por exemplo: README, adicionei uma nova linha “isto é para minha linha de teste” e salvei o arquivo, então liberei os seguintes comandos

  git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: README # no changes added to commit (use "git add" and/or "git commit -a") git add README git commit -a -m 'To add new line to readme' 

Eu não pressionei o código no github, agora eu quero cancelar este commit.

Para isso, eu usei

  git reset --hard HEAD~1 

Mas eu perdi a linha recém-adicionada "isto é para a minha linha de teste" do arquivo README. Isso não deveria ser. Eu preciso do conteúdo para estar lá. Existe uma maneira de salvar conteúdo e cancelar meu commit local?

560
31 янв. definido por Amal Kumar S em 31 de janeiro 2011-01-31 15:14 '11 às 15:14 2011-01-31 15:14
@ 7 respostas

Apenas use o git reset sem o flag --hard :

 git reset HEAD~1 

PS: Em sistemas baseados em Unix, você pode usar HEAD^ , que é HEAD~1 . No Windows, HEAD^ não funcionará, porque ^ sinaliza uma continuação da linha. Então, o seu prompt de comando está apenas lhe perguntando More? .

1085
31 янв. A resposta é dada Koraktor 31 de janeiro 2011-01-31 15:17 '11 às 15:17 2011-01-31 15:17

Use --soft vez de --hard flag:

border=0
 git reset --soft HEAD^ 
143
10 авг. A resposta é dada TpED 10 ago. 2012-08-10 11:02 '12 às 11:02 am 2012-08-10 11:02

Se você estiver no meio de um commit (isto é, já no editor), você pode cancelá-lo excluindo todas as linhas acima do primeiro # . Isso interromperá o commit.

Assim, você pode excluir todas as linhas para que a mensagem de confirmação fique vazia e, em seguida, salve o arquivo:

2019

Você pode dizer ao Git o que fazer com seu índice (o conjunto de arquivos que se tornará o próximo commit) e o diretório de trabalho ao executar o git reset usando um dos parâmetros:

--soft : somente os commits serão redefinidos e o índice e o diretório de trabalho não serão alterados.

--mixed : isso irá redefinir o índice de acordo com o cabeçalho, e o diretório de trabalho não será afetado. Todas as alterações permanecerão no diretório de trabalho e aparecerão como modificadas.

--hard : redefine tudo (commits, index, diretório de trabalho) de acordo com o cabeçalho.

No seu caso, eu usaria o git reset --soft para salvar suas alterações modificadas no índice e no diretório de trabalho. Certifique-se de verificar isso para uma explicação mais detalhada.

5
29 мая '18 в 13:22 2018-05-29 13:22 a resposta é dada por Nesha Zoric em 29 de maio '18 às 1:22 pm 2018-05-29 13:22

A primeira coisa que você precisa fazer é descobrir se deseja salvar as alterações locais antes de excluir a mensagem de confirmação.

Use git log para mostrar as mensagens de confirmação atuais e, em seguida, localize commit_id antes de você deseja excluir, não apenas o que você deseja excluir.

Se você deseja salvar arquivos modificados localmente, simplesmente exclua a mensagem de confirmação:

git reset --soft commit_id

Se você deseja excluir todos os arquivos modificados localmente e a mensagem de confirmação:

git reset --hard commit_id

Qual é a diferença é macia e dura

2
02 сент. a resposta é dada mistdon 02 set . 2018-09-02 06:43 '18 às 6:43 2018-09-02 06:43

Use o comando abaixo: $ git reset HEAD ~ 1 Depois disso, você também pode ver os arquivos que são retornados, como mostrado abaixo.

Alterações indefinidas após a reinicialização: M application / config / config.php M application / config / database.php

1
14 мая '18 в 16:25 2018-05-14 16:25 a resposta é dada Omkar May 14 '18 at 16:25 2018-05-14 16:25

Diferença entre git reset --mixed, --soft e --hard

Pré-requisito: quando uma alteração é feita em um arquivo existente em seu repositório, essa mudança é considerada inicialmente não especificada. Para confirmar as alterações, você precisa prepará-lo, o que significa adicioná-lo ao índice usando git add . Durante a operação de confirmação, os arquivos colocados são adicionados ao índice.

Vamos dar um exemplo:

 - A - B - C (master) 

HEAD indica C e o índice corresponde a C

--soft

  • Quando executamos uma git reset --soft B para excluir commit C e apontar o principal / HEAD para B.
  • Master / HEAD agora apontará para B, mas o índice ainda é alterado de C.
  • Ao executar o git status você poderia ver arquivos indexados no commit C como phased .
  • Executar git commit neste momento criará um novo commit com as mesmas mudanças que em C

--misturado

  • Executar git reset --mixed B
  • Ao executar, master / HEAD apontará para B e o índice também mudará para B devido ao sinalizador misto usado.
  • Se neste momento rodarmos git commit, nada acontecerá, já que o índice corresponde a HEAD .
  • Ainda temos mudanças no diretório de trabalho, mas como elas não estão no índice, o estado do git mostra-as como não detectadas .
  • Para corrigi-los, você precisa git add e, em seguida, corrigir como de costume.

- difícil

  • Executar git reset --hard B
  • Ao executar o master / HEAD apontará para B e alterará seu diretório de trabalho
  • Alterações adicionadas a C e todas as alterações não confirmadas serão excluídas .
  • Os arquivos na cópia de trabalho corresponderão ao commit B, o que levará à perda de todas as alterações feitas no commit C, bem como a alterações não confirmadas.

Espero que a comparação dos sinalizadores disponíveis para uso com o comando git reset ajude alguém a usá-los com sabedoria. Contate-os para mais informações link1 e link2

0
18 янв. A resposta é dada por Keshan Nageswaran 18 de janeiro 2019-01-18 19:48 19 às 19:48 2019-01-18 19:48

Outras questões sobre tags ou Ask a Question