2010-02-23 6 views
562

Что это самый простой способ, чтобы отменить конкретный коммит, который является:Отмена конкретной фиксации в 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 и довольно распространенный вариант использования. В чем еще смысл атомных коммитов?

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

ответ

877

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

+174

и использовать ключ -n, если вы хотите, чтобы код вернулся, но не был автоматически зафиксирован снова – jaygooby

+9

Что делает опция «m»? Я попробовал git revert 8213f7d, но получил это вместо: ошибка: Commit 8213f7dad1ed546b434a0d8a64cb783b530a5a30 - это слияние, но опция no -m не указана. fatal: revert failed – Malcolm

+1

'git help revert' говорит, что он позволяет вам выбрать, с каким родителем слияния вы хотите вернуться. Вы не можете вернуть слияние без выбора родителя. В документации указывается https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt –

32

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

266

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

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

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

который является таким же, как -n

% git revert -n <commit hash> 
+6

Вы также можете выполнить 'git reset HEAD ~ 1 --soft', если вы уже вернули без' -n' – Daniel

+1

Но 'git reset HEAD ~ n' не решит отмену любой фиксации, которая не всегда достижима из голова. Запрос состоит в том, чтобы вернуть какой-либо конкретный фиксатор. – sangeethkumarp

 Смежные вопросы

  • Нет связанных вопросов^_^