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
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