Отменить определенный коммит в 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 и довольно распространенный вариант использования. Какой еще смысл атомных коммитов?
У нас есть поэтапное копирование и все для того, чтобы коммиты были абсолютно атомарными, разве вы не можете легко отменить один или несколько атомных коммитов?
3 ответа
Определите хеш коммита, используя 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
будет возвращать определенные изменения из коммита, используя новый коммит, чтобы не манипулировать историей коммитов.
Если фиксация, которую вы хотите вернуть, является объединенной фиксацией (уже была объединена), вам следует либо -m 1
или -m 2
вариант, как показано ниже. Это позволит git узнать, какой родительский коммит объединенного коммита использовать. Более подробную информацию можно найти ЗДЕСЬ.
git revert <commit> -m 1
git revert <commit> -m 2