Undo trabalhando modificações cópia de um arquivo no Git?
-
22-08-2019 - |
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?
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 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
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.