Отменить конкретный коммит в Git, который был отправлен в удаленные репозитории.
-
22-09-2019 - |
Вопрос
Каков самый простой способ отменить конкретную фиксацию:
- не в голове или ГОЛОВЕ
- Был переброшен на пульт.
Потому что, если это не последний коммит,
git reset HEAD
не работает.И поскольку его перенесли на пульт,
git rebase -i
и
git rebase --onto
вызовет некоторые проблемы с пультами.
Более того, я на самом деле не хочу изменять историю.Если был плохой код, он был в истории и его можно было увидеть.Я просто хочу, чтобы это было в рабочей копии, и я не против коммита обратного слияния.
Другими словами, что такое Гит эквивалент следующих команд svn:
svn merge -r 303:295 http://svn.example.com/repos/calc/trunk
который удаляет все изменения с 295 по 302 путем обратного слияния всех изменений в этих ревизиях в качестве новой фиксации.
svn merge -c -302 ^/trunk
который отменяет коммит 302, конечно, путем добавления другого коммита, который обратно объединяет изменения из этого соответствующего коммита.
Я думал, что это должна быть довольно простая операция в Git и довольно распространенный вариант использования.В чем еще смысл атомарных коммитов?
У нас есть постановка спрятать и все для того, чтобы гарантировать, что коммиты являются совершенно атомарными, разве вы не сможете легко отменить один или несколько из этих атомарных коммитов?
Решение
Определите хеш коммита, используя git log
, затем используйте git revert <commit>
чтобы создать новый коммит, который удаляет эти изменения.В некотором смысле, git revert
является обратным git cherry-pick
-- последний применяет патч к ветке, в которой он отсутствует, первый удаляет его из ветки, в которой он есть.
Другие советы
Мне не нравится автофиксация этого git revert
есть, так что это может быть полезно для некоторых.
Если вам просто нужны измененные файлы, а не автоматическая фиксация, вы можете использовать --no-commit
% git revert --no-commit <commit hash>
что то же самое, что и -n
% git revert -n <commit hash>
Поскольку оно уже было выдвинуто, вам не следует напрямую манипулировать историей. git revert
отменит определенные изменения из коммита, используя новый коммит, чтобы не манипулировать историей коммитов.