É possível reverter apenas um único arquivo ou certas alterações em um arquivo na confirmação de vários arquivos?
História completa Eu cometi um monte de arquivos. Um número de confirmações posteriores alguém que permanecerá sem nome (JACK !!!) copiou um arquivo em seu repositório e comprometeu vários arquivos, substituindo algumas das alterações que fiz. Quero reverter o arquivo que foi derrotado ou melhor ainda, entrar e reverter duas alterações nesse arquivo. Isso terá que ser uma confirmação de reversão separada desde que foi puxada e enviada.
--3way
resultados resulta em conflitos de mesclagem em vez de falha na aplicação de patches.Respostas:
Você pode reverter o commit sem criar um novo adicionando a opção '--no-commit'. Isso deixa todos os arquivos revertidos na área de preparação. A partir daí, eu faria uma reinicialização suave e adicionaria as alterações que realmente queria. Para um exemplo de fluxo de trabalho:
fonte
git add -p
iniciar uma sessão interativa que permite adicionar seletivamente pedaços de arquivos, em vez de arquivos inteiros. (Há tambémgit reset -p
a mudanças seletivamente unstage É bom saber, mas provavelmente não o que você quer neste cenário..)revert
,reset
,stash -p
(esconderijo "cancela que eu não quero fazer actualy"),add
o resto,commit
Você pode aplicar interativamente a versão antiga de um arquivo usando o
checkout
comandoPor exemplo, se você souber
COMMIT
onde o código a ser adicionado foi removido, você pode executar o seguinte comando:O Git solicitará que você adicione novamente os pedaços ausentes da versão atual do arquivo. Você pode usar
e
para criar um patch da alteração antes de aplicá-la novamente.fonte
git checkout -p path/to/file
Você pode apenas verificar manualmente o conteúdo antigo e bom dos arquivos que deseja reverter usando
git checkout
. Por exemplo, se você deseja revertermy-important-file
para a versão em que estavaabc123
, pode fazerAgora você tem o conteúdo antigo de
my-important-file
volta e pode até editá-lo, se quiser, e confirmar como de costume fazer um commit que reverterá as alterações que ele fez. Se houver apenas algumas partes do commit dele que você deseja reverter, usegit add -p
para selecionar apenas alguns pedaços do patch que você está comprometendo.fonte
revert
, você está apenas recuperando uma versão antiga do arquivo. Um corretorevert
removerá as modificações incorretas de confirmação no arquivo, mesmo que tenham sido modificadas várias vezes desde a confirmação incorreta, e você não deseja perder essas modificações.git checkout -p
.Eu encontrei uma maneira de fazer isso na lista de discussão do Git:
Fonte: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
Variações
Esse comando falha (sem causar alterações) se o patch não for aplicado corretamente, mas com
--3way
você, em vez disso, você poderá obter conflitos que poderão ser resolvidos manualmente (nesse caso, a resposta de Casey pode ser mais prática):Você também pode usar isso para reverter parcialmente várias confirmações, por exemplo:
reverter arquivos com alterações correspondentes
<string>
em qualquer confirmação. Isso é exatamente o que eu precisava no meu caso de uso (algumas confirmações separadas introduziram alterações semelhantes em arquivos diferentes, juntamente com alterações em outros arquivos de maneiras não relacionadas que eu não queria reverter).Se você
diff.noprefix=true
configurou o seu~/.gitconfig
, precisará adicionar-p0
aogit apply
comando, por exemplofonte
git show ... > foo.txt
(2) editarfoo.txt
para remover os diffs. Queria não reverter (3)git apply --reverse foo.txt
para reverter os diffs ainda listados emfoo.txt
.