Отменить определенный коммит в Git, который был передан в удаленные репозитории - PullRequest
710 голосов
/ 23 февраля 2010

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

  • не в голове или в голове
  • Был перенесен на пульт.

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

git reset HEAD

не работает. И поскольку он был перенесен на пульт,

git rebase -i

и

git rebase --onto

вызовет некоторые проблемы в пульте дистанционного управления.

Более того, я действительно не хочу изменять историю. Если был плохой код, он был в истории и его можно увидеть. Я просто хочу, чтобы это было в рабочей копии, и я не против обратной фиксации слияния.

Другими словами, что такое Git эквивалент следующих команд svn:

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

, который удаляет все изменения с 295 до 302 путем обратного объединения всех изменений в этих ревизиях в качестве нового коммита.

svn merge -c -302 ^/trunk

, который отменяет фиксацию 302, конечно, добавляя другую фиксацию, которая отменяет объединение изменений из этой соответствующей фиксации.

Я подумал, что это должна быть довольно простая операция в Git и довольно распространенный вариант использования. Какой еще смысл атомных коммитов?

У нас есть постановка хранения , и все это для того, чтобы коммиты были абсолютно атомарными, разве вы не можете легко отменить один или несколько атомных коммитов?

Ответы [ 3 ]

1100 голосов
/ 23 февраля 2010

Определите хеш коммита, используя git log, затем используйте git revert <commit>, чтобы создать новый коммит, который удаляет эти изменения.В некотором смысле, git revert является противоположностью git cherry-pick - последний применяет патч к ветке, в которой он отсутствует, а первый удаляет его из ветви, в которой он есть.

342 голосов
/ 17 мая 2013

Мне не нравится автоматическая фиксация, которую делает git revert, поэтому для некоторых это может быть полезно.

Если вы просто хотите, чтобы измененные файлы не были автоматически зафиксированы , вы можете использовать --no-commit

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

, что совпадает с -n

% git revert -n <commit hash>
35 голосов
/ 23 февраля 2010

Поскольку это уже было выдвинуто, вы не должны напрямую манипулировать историей. git revert будет возвращать определенные изменения из коммита, используя новый коммит, чтобы не манипулировать историей коммитов.

...