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




renomear arquivo git (20)

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