Cofa konkretny commit w Git, który został wypchnięty do zdalnych reposów

Jaki jest najprostszy sposób na cofnięcie określonego commita, czyli:

  • nie w głowie ani głowie
  • został zepchnięty do pilota.

Ponieważ jeśli nie jest to najnowszy commit,

git reset HEAD
Nie działa. A ponieważ został on zepchnięty do pilota,
git rebase -i

I

git rebase --onto

Spowoduje jakiś problem w pilotach.

Bardziej, nie chcę modyfikować historii naprawdę. Jeśli był zły kod, to był w historii i widać. Chcę tylko, żeby to było w wersji roboczej, i nie mam nic przeciwko wstecznemu mergowaniu.

Innymi słowy, jaki jest Git odpowiednik następujących komend svn:

svn merge -r 303:295 http://svn.example.com/repos/calc/trunk

Który usuwa wszystkie zmiany z 295 do 302 poprzez odwrócenie scalenia wszystkich zmian w tych zmianach, jako nowy commit.

svn merge -c -302 ^/trunk

Który wycofuje commit 302, oczywiście dodając inny commit, który odwraca scalanie zmian z danego commita.

Myślałem, że powinno być dość prostą operacją w Git i dość powszechnym przypadkiem użycia. Jaki jest jeszcze cel atomowych zobowiązań?

Mamy staging stashing i wszystko po to, aby upewnić się, że commity są całkowicie atomowe, czy nie powinieneś być w stanie łatwo cofnąć jednego lub więcej z tych commitów atomowych?

Author: Lakshman Prasad, 2010-02-23

4 answers

Zidentyfikuj hash zatwierdzenia, używając git log, a następnie użyj git revert <commit>, aby utworzyć nowy commit, który usunie te zmiany. W pewnym sensie, {[2] } jest konwersją git cherry-pick - ta ostatnia nakłada łatkę na gałąź, która jej brakuje, ta pierwsza usuwa ją z gałęzi, która ją posiada.

 1298
Author: Andrew Aylett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-30 16:55:13

Nie podoba mi się auto-commit, który robi git revert, więc może to być pomocne dla niektórych.

Jeśli chcesz, aby zmodyfikowane pliki nie były automatycznie zatwierdzane , możesz użyć --no-commit

% git revert --no-commit <commit hash>

Który jest taki sam jak -n

% git revert -n <commit hash>
 392
Author: Thank you,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-07 23:14:26

Ponieważ została już wypchnięta, nie powinieneś bezpośrednio manipulować historią. git revert przywróci określone zmiany z commita używając nowego commita, aby nie manipulować historią zmian.

 42
Author: moatPylon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-23 14:28:46

Jeśli commit, który chcesz przywrócić jest scalonym commitem( został już scalony), powinieneś wybrać opcję -m 1 LUB -m 2, Jak pokazano poniżej. Dzięki temu git będzie wiedział, który commit nadrzędny scalonego commita ma użyć. Więcej szczegółów można znaleźć tutaj .

  • git revert <commit> -m 1
  • git revert <commit> -m 2
 4
Author: Meysam Sadeghi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-27 06:34:52