Estou procurando dividir uma confirmação e não sei qual opção de redefinição usar.
Eu estava olhando a página Em inglês simples, o que "git reset" faz? , mas percebi que realmente não entendo qual é o índice git ou a área de preparação e, portanto, as explicações não ajudaram.
Além disso, os casos de uso --mixed
e --soft
a mesma aparência para mim nessa resposta (quando você deseja corrigir e reenviar). Alguém pode dividir ainda mais? Sei que --mixed
é provavelmente a opção a seguir, mas quero saber o porquê . Por fim, o que dizer --hard
?
Alguém pode me dar um exemplo de fluxo de trabalho de como a seleção das 3 opções aconteceria?
git
version-control
Michael Chinen
fonte
fonte
soft: stage everything
,mixed: unstage everything
,hard: ignore everything
até o commit estou redefinindo a partir.David Zych
com uma explicação clara - davidzych.com/difference-between-git-reset-soft-mixed-and-hardRespostas:
Quando você modifica um arquivo no seu repositório, a alteração é inicialmente sem etapas. Para confirmar, você deve prepará-lo - ou seja, adicioná-lo ao índice - usando
git add
. Quando você faz uma confirmação, as alterações confirmadas são aquelas que foram adicionadas ao índice.git reset
muda, no mínimo, para onde o ramo atual (HEAD
) está apontando. A diferença entre--mixed
e--soft
é se o seu índice também é modificado ou não. Portanto, se estamos no ramomaster
desta série de confirmações:HEAD
aponta paraC
e o índice correspondeC
.Quando executamos
git reset --soft B
,master
(e, portantoHEAD
) agora aponta paraB
, mas o índice ainda tem as alterações deC
;git status
irá mostrá-los como encenados. Portanto, se rodarmosgit commit
neste momento, obteremos um novo commit com as mesmas alterações queC
.Ok, então a partir daqui novamente:
Agora vamos fazer
git reset --mixed B
. (Nota:--mixed
é a opção padrão). Mais uma vez,master
eHEAD
apontam para B, mas desta vez o índice também é modificado para corresponderB
. Se rodarmosgit commit
neste momento, nada acontecerá desde que o índice correspondaHEAD
. Ainda temos as alterações no diretório de trabalho, mas como elas não estão no índice,git status
elas são mostradas como estágios. Para comprometê-los, você fariagit add
e, em seguida, cometeria normalmente.E, finalmente,
--hard
é o mesmo que--mixed
(altera seuHEAD
e índice), exceto que--hard
também modifica seu diretório de trabalho. Se estivermos emC
execuçãogit reset --hard B
, as alterações adicionadasC
e as alterações não confirmadas que você tiver serão removidas e os arquivos em sua cópia de trabalho corresponderão a confirmaçãoB
. Como você pode perder permanentemente as alterações dessa maneira, sempre deve executargit status
antes de fazer uma redefinição forçada para garantir que seu diretório de trabalho esteja limpo ou se você está perdendo suas alterações não confirmadas.E, finalmente, uma visualização:
fonte
reset --hard
desaparecem para sempre.--mixed
altera seu índice, mas não seu diretório de trabalho, portanto, quaisquer modificações locais não são afetadas.- A - B - C′
, onde C ′ contém as mesmas alterações que C (com carimbo de data e hora diferente e possivelmente confirmar mensagem). 2 e 4 vão deixá-lo com- A - D
, em que D contém as modificações combinadas de B e C.Nos termos mais simples:
--soft
: cancele as alterações, as alterações são mantidas em etapas ( índice ).--mixed
(padrão) : descomprimir + alterações no estágio , as alterações são deixadas na árvore de trabalho .--hard
: descomprimir + desestágio + excluir alterações, nada resta.fonte
Esteja ciente de que esta é uma explicação simplificada, pretendida como o primeiro passo na tentativa de entender essa funcionalidade complexa.
Pode ser útil para alunos visuais que desejam visualizar como é o estado do projeto após cada um destes comandos:
Para aqueles que usam o Terminal com a cor ativada (git config --global color.ui auto):
git reset --soft A
e você verá o material de B e C em verde (preparado e pronto para confirmar)git reset --mixed A
(ougit reset A
) e você verá o material de B e C em vermelho (sem estágio e pronto para ser encenado (verde) e depois confirmado)git reset --hard A
e você não verá mais as alterações de B e C em nenhum lugar (será como se elas nunca existissem)Ou para aqueles que usam um programa GUI como 'Tower' ou 'SourceTree'
git reset --soft A
e você verá as coisas de B e C na área 'arquivos preparados' prontas para confirmargit reset --mixed A
(ougit reset A
) e você verá as coisas de B e C na área 'arquivos não-estaduais', prontas para serem movidas para encenadas e depois confirmadasgit reset --hard A
e você não verá mais as alterações de B e C em nenhum lugar (será como se elas nunca existissem)fonte
git reset
apenas mudasse a aparência dosgit status
resultados da empresa.Todas as outras respostas são grandes, mas acho que é melhor para compreendê-los por quebrar arquivos em três categorias:
unstaged
,staged
,commit
:--hard
deve ser fácil de entender, restaura tudo--mixed
(padrão) :unstaged
arquivos: não mudestaged
arquivos: vá paraunstaged
commit
arquivos: vá paraunstaged
--soft
:unstaged
arquivos: não mudestaged
arquivos: não mudecommit
arquivos: vá parastaged
Em suma:
--soft
A opção moverá tudo (excetounstaged
arquivos) parastaging area
--mixed
opção moverá tudo paraunstaged area
fonte
Aqui está uma explicação básica para os usuários do TortoiseGit:
git reset --soft
e--mixed
deixe seus arquivos intocados.git reset --hard
realmente mudar seus arquivos para coincidir com a cometer repuser a.No TortoiseGit, o conceito do índice está muito oculto pela GUI. Ao modificar um arquivo, você não precisa executar
git add
para adicionar a alteração à área / índice de preparação. Ao simplesmente lidar com modificações nos arquivos existentes que não estão mudando os nomes dos arquivosgit reset --soft
e--mixed
são iguais! Você só notará uma diferença se tiver adicionado novos arquivos ou renomeados. Nesse caso, se você executar o git reset --mixed, terá que adicionar novamente seu (s) arquivo (s) da lista Arquivos sem versão .fonte
--mixed
e--soft
.Nesses casos, eu gosto de um visual que espero possa explicar isso:
git reset --[hard/mixed/soft]
:Então, cada efeito diferentes escopos
fonte
Três tipos de arrependimento
Muitas das respostas existentes parecem não responder à pergunta real. Eles são sobre o que os comandos fazem, não sobre o que você (o usuário) deseja - o caso de uso . Mas é sobre isso que o OP perguntou!
Pode ser mais útil descrever a descrição em termos do que é exatamente o que você se arrepende no momento em que dá um
git reset
comando. Digamos que temos o seguinte:Aqui estão alguns possíveis arrependimentos e o que fazer com eles:
1. Lamento que B, C e D não sejam um commit.
git reset --soft A
. Agora posso confirmar e presto imediatamente, todas as alterações desde A são uma confirmação.2. Lamento que B, C e D não sejam dez commits.
git reset --mixed A
. As confirmações desapareceram e o índice voltou a A, mas a área de trabalho ainda parece com a de D. Então agora eu posso adicionar e confirmar em um agrupamento totalmente diferente.3. Lamento que B, C e D tenham acontecido neste ramo ; Eu gostaria de ter ramificado depois de A e eles aconteceram naquele outro ramo.
Faça um novo ramo
otherbranch
e, em seguidagit reset --hard A
. A ramificação atual agora termina em A, com suaotherbranch
origem.(É claro que você também pode usar uma reinicialização completa, porque deseja que B, C e D nunca tenham acontecido.)
fonte
Você não precisa se forçar a lembrar as diferenças entre eles. Pense em como você realmente fez um commit.
1.Faça algumas alterações.
2.git add.
3.gc -m "Eu fiz algo"
Suave, Misto e Difícil é o caminho que permite que você desista das operações realizadas de 3 a 1.
Soft "fingiu" nunca ver que você fez "gc-m".
Misto "fingiu" nunca ver que você fez "git add".
Difícil "fingir" nunca ver que você fez alterações no arquivo.
fonte
Antes de entrar nessas três opções, é preciso entender três coisas.
1) História / CABEÇA
2) Estágio / índice
3) Diretório de trabalho
reset --soft: histórico alterado, HEAD alterado, diretório de trabalho não alterado.
reset --mixed: histórico alterado, HEAD alterado, diretório de trabalho alterado com dados não faseados.
reset --hard: Histórico alterado, HEAD alterado, Diretório de trabalho alterado com dados perdidos.
É sempre seguro usar o Git --soft. Deve-se usar outra opção em requisitos complexos.
fonte
Há várias respostas aqui com um equívoco sobre
git reset --soft
. Embora exista uma condição específica na qualgit reset --soft
apenas será alteradaHEAD
(a partir de um estado principal desanexado), normalmente (e para o uso pretendido), ela move a referência de ramificação que você efetuou check-out no momento. Obviamente, isso não pode ser feito se você não tiver uma ramificação com check-out (daí a condição específica emgit reset --soft
que apenas será alteradaHEAD
).Eu descobri que essa é a melhor maneira de pensar
git reset
. Você não está apenas se movendoHEAD
( tudo faz isso ), você também está se movendo no ramo ref , por exemplomaster
,. Isso é semelhante ao que acontece quando você executagit commit
(o ramo atual se move juntoHEAD
), exceto que, em vez de criar (e passar para) um novo commit, você passa para um commit anterior .Esse é o objetivo de
reset
alterar uma ramificação para algo diferente de um novo commit, não mudarHEAD
. Você pode ver isso no exemplo da documentação:Qual é o objetivo dessa série de comandos? Você deseja mover uma ramificação para cá
master
, enquanto faz omaster
check-out, executagit reset
.A resposta mais votada aqui geralmente é boa, mas pensei em acrescentar isso para corrigir as várias respostas com conceitos errôneos.
Mude sua filial
git reset --soft <ref>
: redefine o ponteiro da ramificação atualmente registrada para o commit na referência especificada<ref>
. Os arquivos no diretório e índice de trabalho não são alterados. A confirmação desse estágio o levará de volta para onde você estava antes dogit reset
comando.Mude também o seu índice
git reset --mixed <ref>
ou equivalente
git reset <ref>
:Faz o
--soft
que AND também redefine o índice para corresponder à confirmação na referência especificada. Enquantogit reset --soft HEAD
não faz nada (porque diz mover a ramificação com check-out para a ramificação com check-out),git reset --mixed HEAD
ou equivalentegit reset HEAD
, é um comando comum e útil, pois redefine o índice para o estado do seu último commit.Mude também o seu diretório de trabalho
git reset --hard <ref>
: faz o--mixed
que AND também substitui seu diretório de trabalho. Este comando é semelhante agit checkout <ref>
, exceto que (e este é o ponto crucial sobrereset
) todas as formas degit reset
movimento para as quais a referência do ramoHEAD
está apontando.Uma observação sobre "tal e tal comando move o HEAD":
Não é útil dizer que um comando move o
HEAD
. Qualquer comando que muda onde você está no seu histórico de consolidação move oHEAD
. Isso é o queHEAD
é , um ponteiro para onde você estiver.HEAD
é você , e assim se moverá sempre que você o fizer.fonte
Uma resposta curta em que contexto as três opções são usadas:
Para manter as alterações atuais no código, mas para reescrever o histórico de consolidação:
soft
: Você pode confirmar tudo de uma vez e criar um novo commit com uma nova descrição (se você usar o toritise git ou qualquer outra GUI, essa é a única a ser usada, pois você ainda pode marcar quais arquivos deseja no commit e criar vários confirma dessa maneira com arquivos diferentes. No Sourcetree, todos os arquivos seriam preparados para confirmação.)mixed
: Você precisará adicionar os arquivos individuais novamente ao índice antes de fazer as confirmações (no Sourcetree, todos os arquivos alterados ficariam sem estágio)Para realmente perder suas alterações no código também:
hard
: você não apenas reescreve o histórico, mas também perde todas as alterações até o ponto que redefiniufonte
A diferença básica entre as várias opções do comando git reset é a seguinte.
fonte
--soft
: Diz ao Git para redefinir HEAD para outra confirmação, para que o índice e o diretório de trabalho não sejam alterados de forma alguma. Todos os arquivos alterados entre o HEAD original e o commit serão preparados.--mixed
: Assim como o soft, isso redefinirá HEAD para outro commit. Ele também redefinirá o índice para corresponder a ele, enquanto o diretório de trabalho não será tocado. Todas as alterações permanecerão no diretório de trabalho e aparecerão como modificadas, mas não preparadas.--hard
: Isso redefine tudo - redefine HEAD de volta para outro commit, redefine o índice para corresponder a ele e redefine o diretório de trabalho para corresponder também.A principal diferença entre
--mixed
e--soft
é se o seu índice também é modificado. Confira mais sobre isso aqui .fonte
A resposta de mkarasek é ótima, em termos simples, podemos dizer ...
git reset --soft
: definaHEAD
como o commit pretendido, mas mantenha as alterações organizadas desde os últimos commitgit reset --mixed
: é o mesmo que,git reset --soft
mas a única diferença é que você não está realizando suas alterações desde os últimos commitsgit reset --hard
: defina suaHEAD
confirmação, especifique e redefina todas as alterações das últimas confirmações, incluindo alterações não confirmadas.fonte