usados - Como faço para descartar as alterações não sincronizadas no Git?




renomear arquivo git (20)

A maneira mais fácil de fazer isso é usando este comando:

Este comando é usado para descartar as alterações no diretório de trabalho -

git checkout -- .

https://git-scm.com/docs/git-checkout

No comando git, o armazenamento de arquivos não rastreados é obtido usando:

git stash -u

http://git-scm.com/docs/git-stash

Como faço para descartar as alterações na minha cópia de trabalho que não estão no índice?


Apenas use:

git stash -u

Feito. Fácil.

Se você realmente se importa com o seu stash stack, então você pode seguir com git stash drop . Mas, nesse ponto, é melhor você usar (de Mariusz Nowak):

git checkout -- .
git clean -df

No entanto, eu gosto de git stash -u o melhor porque "descarta" todas as alterações controladas e não rastreadas em apenas um comando . Ainda git checkout -- . apenas descarta as alterações controladas, e git clean -df apenas descarta as alterações não controladas ... e digitar os dois comandos é muito trabalhoso :)


Conforme você digita o status git, (use "git checkout - ..." para descartar as alterações no diretório de trabalho) é mostrado.

por exemplo git checkout -- .


Em vez de descartar as alterações, redefino meu controle remoto para a origem. Nota - este método é restaurar completamente a sua pasta para a pasta do repo.

Então eu faço isso para ter certeza de que eles não fiquem lá quando eu for reiniciado (mais tarde - exclui gitignores no Origin / branchname)

NOTA: Se você quiser manter os arquivos ainda não rastreados, mas não em GITIGNORE, você pode pular esta etapa, pois isso limpará esses arquivos não-rastreados que não foram encontrados em seu repositório remoto (obrigado @XtrmJosh).

git add --all

Então eu

git fetch --all

Então eu redefinir a origem

git reset --hard origin/branchname

Isso vai colocá-lo de volta à estaca zero. Assim como RE-Clonando o ramo, ENQUANTO mantendo todos os meus arquivos gitignored localmente e no lugar.

Atualizado por comentário do usuário abaixo: Variação para redefinir a qualquer ramificação atual em que o usuário esteja.

git reset --hard @{u}

Eu tive uma situação estranha em que um arquivo é sempre desatualizado, isso me ajuda a resolver.

git rm .gitattributes
git add -A
git reset --hard


Isso funciona mesmo em diretórios que são; fora das permissões normais do git.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Aconteceu comigo recentemente


Meu favorito é

git checkout -p

Isso permite reverter seletivamente pedaços.

Veja também:

git add -p

Não importa em que estado está o repo, você pode redefinir para qualquer commit anterior:

git reset --hard <commit hash>

Isso descartará todas as alterações feitas após esse commit.


Nenhuma das soluções funciona se você acabou de alterar as permissões de um arquivo (isso é no DOS / Windoze)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

A única maneira de corrigir isso é redefinir manualmente as permissões nos arquivos alterados:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff


O que segue é realmente apenas uma solução se você estiver trabalhando com um fork de um repositório em que você sincroniza regularmente (por exemplo, pull request) com outro repo. Resposta curta: exclua fork e refork, mas leia os avisos no github .

Eu tive um problema semelhante, talvez não idêntico, e estou triste em dizer que a minha solução não é ideal, mas, no final das contas, é eficaz.

Eu costumava ter mensagens de status do git assim (envolvendo pelo menos 2/4 arquivos):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

Um olhar atento irá notar que esses arquivos têm dopplegangers que são uma única letra no caso de desligado. De alguma forma, e eu não tenho idéia do que me levou até este caminho para começar (como eu não estava trabalhando com esses arquivos eu mesmo a partir do repositório upstream), eu tinha trocado esses arquivos. Tente as muitas soluções listadas nesta página (e outras páginas) não parece ajudar.

Consegui corrigir o problema excluindo meu repositório bifurcado e todos os repositórios locais e reforking. Isso por si só não foi suficiente; upstream teve que renomear os arquivos em questão para novos nomes de arquivos. Contanto que você não tenha nenhum trabalho não consolidado, nenhum wiki e nenhum problema que diverja do repositório upstream, você deve estar bem. Upstream pode não ser muito feliz com você, para dizer o mínimo. Quanto ao meu problema, é sem dúvida um erro do usuário, já que não sou tão competente quanto o git, mas o fato de que ele está longe de ser fácil de corrigir aponta para um problema com o git também.


Outra maneira mais rápida é:

git stash save --keep-index --include-untracked

Você não precisa incluir --include-untracked se você não quiser ser minucioso sobre isso.

Depois disso, você pode soltar o stash com um comando git stash drop se quiser.


Para todos os arquivos não organizados, use:

git checkout -- .

Para um uso de arquivo específico:

git checkout path/to/file/to/revert

Certifique-se de incluir o período no final.


Quando você deseja transferir um esconderijo para outra pessoa:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[edit] como comentado, é possível nomear stashes. Bem, use isso se você quiser compartilhar seu stash;)


Se todos os arquivos preparados foram realmente confirmados, então o ramo pode simplesmente ser reposto, por exemplo, a partir da sua interface gráfica com cerca de três cliques do mouse: Branch , Reset , Yes !

Então, o que eu costumo fazer na prática para reverter alterações locais indesejadas é comprometer todas as coisas boas e, em seguida, redefinir a ramificação.

Se as coisas boas forem confirmadas em um único commit, então você pode usar "emendar último commit" para trazer de volta para o estágio ou para o estágio se você gostaria de cometer um pouco diferente.

Isso pode não ser a solução técnica que você está procurando para o seu problema, mas acho que é uma solução muito prática. Ele permite descartar seletivamente alterações não sincronizadas, redefinir as alterações que você não gosta e manter as que você faz.

Então, em resumo, eu simplesmente faço commit , reset de branch , e emito o último commit .


Se você estiver em caso de submódulo e nenhuma outra solução funcionar tente:

  • Para verificar qual é o problema (talvez um caso "sujo") use:

    git diff

  • Para remover o estoque

    git submodule update


Se você não estiver interessado em manter as alterações não sincronizadas (especialmente se as alterações em etapas forem arquivos novos), achei isso útil:

git diff | git apply --reverse

Você pode criar seu próprio alias, que descreve como fazê-lo de maneira descritiva.

Eu uso o próximo alias para descartar as alterações.

Descartar alterações em uma (lista de) arquivo (s) na árvore de trabalho

discard = checkout --

Então você pode usá-lo como próximo para descartar todas as alterações:

discard .

Ou apenas um arquivo:

discard filename

Caso contrário, se você quiser descartar todas as alterações e também os arquivos não acompanhados, use uma combinação de checkout e limpe:

Limpe e descarte as alterações e os arquivos não rastreados na árvore de trabalho

cleanout = !git clean -df && git checkout -- .

Então o uso é simples como o seguinte:

cleanout

Agora está disponível no próximo repositório do Github, que contém vários aliases:


Você pode usar git stash - se algo der errado, você ainda pode reverter a partir do stash. Semelhante a alguma outra resposta aqui, mas esta também remove todos os arquivos não organizados e também todas as exclusões não sincronizadas:

git add .
git stash

Se você verificar que está tudo bem, jogue fora o estoque:

git stash drop

A resposta de Bilal Maqsood com o git clean também funcionou para mim, mas com o stash eu tenho mais controle - se eu fizer isso acidentalmente, eu ainda posso ter minhas alterações de volta

ATUALIZAR

Eu acho que há mais 1 mudança (não sei porque isso funcionou para mim antes):

git add . -A git add . -A invés de git add .

sem o -A os arquivos removidos não serão encenados


git checkout -f

man git-checkout :

-f, --force

Ao alternar as ramificações, continue mesmo que o índice ou a árvore de trabalho seja diferente de HEAD. Isso é usado para jogar fora as alterações locais.

Ao verificar os caminhos do índice, não falhe nas entradas não mescladas; Em vez disso, as entradas não mescladas são ignoradas.


cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory






git