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

Какой самый простой способ отменить определенный коммит, это:

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

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

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 и довольно распространенный вариант использования. Какой еще смысл атомных коммитов?

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

вопрос задан 23.02.2010
Lakshman Prasad
42089 репутация

3 ответов


  • 978 рейтинг

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

    ответ дан Andrew Aylett, с репутацией 30080, 23.02.2010
  • 304 рейтинг

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

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

    % git revert --no-commit 
    

    , который совпадает с -n

    % git revert -n 
    
    ответ дан user633183, с репутацией 64483, 16.05.2013
  • 32 рейтинг

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

    ответ дан moatPylon, с репутацией 1328, 23.02.2010