Git reverte apenas um arquivo específico de um commit (quando podem ocorrer conflitos …)

tl; dr – use git revert --no-commit SHA

Em minha contribuição para i18n gem, alguém apontou que meu teste é inútil,

Ele estava totalmente certo, então decidi removê-lo. Meu primeiro pensamento foi “Oh, eu posso apenas git reverteste commit”.

NOPE !

Percebi que esse commit também contém código que está bom e quero mantê-lo.

Portanto, a primeira lição importante aqui: mantenha seus commits pequenos

Eu era teimoso em usar, gitentão, depois de algumas consultas no Google, algumas soluções ruins / insatisfatórias * Eu finalmente encontrei isto: --no-commitflag

Como o nome sugere, ele simplesmente não confirma alterações. Portanto, provavelmente posso editá-los ou … dar uma olhada neles!

Para fazer meu trabalho funcionar, fiz o seguinte:

  • git revert --no-commit ee27f3d

PS você pode usar @ ~ 1 para reverter o último commit.

@ é o alias de HEAD e ~ 1 é uma série de commits antes dele

git revert ee23f3d ~ 2 também funcionaria e reverter dois commits antes de ee23 …)

  • git status que retornou conflitos e alterações indesejadas:
You are currently reverting commit ee27f3d.
(fix conflicts and run "git revert --continue")
(use "git revert --abort" to cancel the revert operation)

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified
: lib/i18n/tests/lookup.rb
modified
: lib/i18n/tests/unwanted.rb

Unmerged paths:
(use "git reset HEAD <file>..." to unstage)
(use "git add <file>..." to mark resolution)

both modified
: lib/i18n/backend/base.rb
both modified
: lib/i18n/tests/interpolation.rb

duas coisas ruins aconteceram aqui: há conflitos e arquivo que eu não quero reverter.

Em primeiro lugar, vamos lidar com o arquivo indesejado.
+git reset HEAD lib/i18n/tests/unwanted.rb

recebemos mensagem:

Unstaged changes after reset:
M lib
/i18n/tests/unwanted.rb

Vamos fazer git statuse rolar um pouco:

Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified
: lib/i18n/tests/unwanted.rb

o que significa que este arquivo será ignorado durante o commit (mas as mudanças permanecerão).

Próximos arquivos com conflitos. Como não queríamos alterá-los de qualquer maneira, podemos simplesmente colocá-los Changes not staged for commit(como fizemos antes com o arquivo indesejado).

  • git reset lib/i18n/backend/base.rb

e

  • git reset ib/i18n/tests/interpolation.rb

PS No caso de desejarmos reverter um arquivo com conflitos, teríamos que corrigi-los manualmente e então git add fixed/file.rb

agora git statusimprime:

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified
: lib/i18n/tests/lookup.rb

Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified
: lib/i18n/tests/unwanted.rb
modified
: lib/i18n/backend/base.rb
modified
: lib/i18n/tests/interpolation.rb

Agora podemos rejeitar todas as alterações em arquivos que não pretendíamos alterar:

  • git checkout .

(não se preocupe, não toca nos arquivos em changes to be commited)

e agora git statusimprime:

You are currently reverting commit ee27f3d.
(fix conflicts and run "git revert --continue")
(use "git revert --abort" to cancel the revert operation)

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified
: lib/i18n/tests/lookup.rb

só podemos ver modified: lib/i18n/tests/lookup.rblá, então agora podemos escrever:

  • git revert --continue

para comprometer tudo o que fizemos.

A última etapa é enviar mensagem. Por padrão:

1 Revert "Interpolate now works for array"
2
3 This reverts commit ee27f3d85ab275757b144aa216c1a282ef9bb345.
4

qual IMHO deve ser alterado porque não estamos revertendo um commit (usamos git revertapenas como uma ferramenta auxiliar).

Removi Reverter do título e adicionei uma nota à descrição:

1 Remove redundant test for lookup
2
3 This reverts PART of commit ee27f3d85ab275757b144aa216c1a282ef9bb345.
4 thanks @clemens
5 https://github.com/svenfuchs/i18n/pull/282/files#r37780129

e pronto!

* git reset --hardnão me satisfaz