Pergunta

Após a última confirmação, modifiquei um monte de arquivos na minha cópia de trabalho, mas eu quero desfazer as alterações a um desses arquivos, como em redefini-lo para o mesmo estado em cometer o mais recente.

No entanto, eu só quero desfazer a cópia de trabalho mudanças de apenas que um arquivo só, mais nada com ele.

Como posso fazer isso?

Foi útil?

Solução

Você pode usar

git checkout -- file

Você pode fazê-lo sem a -- (como sugerido por nimrodm), mas se os olhares nome de arquivo como um ramo ou etiqueta (ou outro identificador de revisão), pode ficar confuso, portanto, usando -- é melhor.

Você também pode verificar uma versão específica de um arquivo:

git checkout v1.2.3 -- file         # tag v1.2.3
git checkout stable -- file         # stable branch
git checkout origin/master -- file  # upstream master
git checkout HEAD -- file           # the version from the most recent commit
git checkout HEAD^ -- file          # the version before the most recent commit

Outras dicas

Apenas uso

git checkout filename

Isto irá substituir nome do arquivo com a versão mais recente do ramo atual.

AVISO:. Suas alterações serão descartadas - nenhum backup é mantida

git checkout <commit> <filename>

Eu usei isso hoje, porque eu percebi que o meu favicon tinha sido substituído alguns commits atrás, quando eu upgrated para o Drupal 6,10, então eu tinha que recuperá-lo. Aqui está o que eu fiz:

git checkout 088ecd favicon.ico

Se o arquivo já é encenado (acontece quando você faz um git add etc após o arquivo é editado) para unstage suas alterações.

Use

git reset HEAD <file>

Em seguida

git checkout <file>

Se ainda não estiver encenado, basta usar

git checkout <file>

Se você quiser apenas desfazer a submissão anterior das alterações para que um arquivo, você pode tentar o seguinte:

git checkout branchname^ filename

Isto irá fazer o checkout o arquivo como era antes do último commit. Se você quiser ir mais alguns commits volta, use a notação branchname~n.

eu tenho feito através do bash git:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. git status. [Então vimos um maço arquivo modificado.]
  2. git checkout - index.html [i mudaram no arquivo index.html:
  3. git status de [agora essas mudanças foi removido]

 enter descrição da imagem aqui

Eu sempre ficar confuso com isso, então aqui está um caso de teste lembrete; Vamos dizer que nós temos esse script bash para git teste:

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt

Neste ponto, a mudança não é encenado no cache, então git status é:

$ git status
On branch master
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:   b.txt

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

Se a partir deste ponto, fazemos git checkout, o resultado é o seguinte:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Se em vez disso, fazer git reset, o resultado é:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
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:   b.txt

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

Assim, neste caso -. Se as alterações não são encenadas, git reset não faz nenhuma diferença, enquanto git checkout substitui as alterações


Agora, vamos dizer que a última alteração do script acima é encenado / cache, que é dizer que nós também fizemos git add b.txt no final.

Neste caso, git status neste momento é:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

Se a partir deste ponto, fazemos git checkout, o resultado é o seguinte:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

Se em vez disso, fazer git reset, o resultado é:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
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:   b.txt

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

Assim, neste caso - se as mudanças são encenadas, git reset vai basicamente fazer encenado mudanças em mudanças unstaged -. Enquanto git checkout irá substituir as alterações completamente

Este respostas é para o comando necessário para desfazer as alterações locais que estão em vários arquivos específicos em pastas mesmas ou múltiplas (ou diretórios). Isto responde aborda especificamente pergunta onde um usuário tem mais de um arquivo, mas o usuário não quer desfazer todas as alterações locais:

Se você tem um ou mais arquivos que você poderia aplicar o mesmo comando (git checkout -- file) para cada um desses arquivos, listando cada um de sua localização separadas por espaço como em:

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

mente o espaço acima entre name1 / name2 / fileOne.ext NAMEA / subpasta / fileTwo.ext

Para vários arquivos na mesma pasta:

Se acontecer de você necessidade de mudanças de descarte de todos os arquivos em uma determinado diretório, use o git checkout da seguinte forma:

git checkout -- name1/name2/*

O asterisco na acima faz o truque de desfazer todos os arquivos naquele local sob name1 / name2.

E, semelhante a seguinte pode desfazer as alterações em todos os arquivos para várias pastas:

git checkout -- name1/name2/* nameA/subFolder/*

novamente mente o espaço entre name1 / name2 / * NAMEA / subpasta / * na acima.

Nota: name1, name2, NAMEA, subpasta - todos esses nomes exemplo de pasta indicam a pasta ou o pacote de onde o arquivo (s) em questão pode ser residente

.

Eu restaurar meus arquivos usando o ID de SHA, o que faço é git checkout <sha hash id> <file name>

Se você ainda não se empurrou ou de outra forma compartilhada o seu commit:

git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend

Para mim só que este trabalhou

git checkout -p filename

enter descrição da imagem aqui

Se ele já está comprometido, você pode reverter a alteração para o arquivo e se comprometer novamente, depois de squash novo commit com o último cometer.

Eu não sei porquê, mas quando tento entrar no meu código, ele surge como uma imagem.

enter descrição da imagem aqui

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top