Отменить конкретный коммит в Git, который был отправлен в удаленные репозитории.

StackOverflow https://stackoverflow.com/questions/2318777

Вопрос

Каков самый простой способ отменить конкретную фиксацию:

  • не в голове или ГОЛОВЕ
  • Был переброшен на пульт.

Потому что, если это не последний коммит,

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 отменит определенные изменения из коммита, используя новый коммит, чтобы не манипулировать историей коммитов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top