Git удаляет корневую фиксацию

#git #commit #root

#git #фиксация #root

Вопрос:

Я не могу многое сделать с помощью git, и я хочу удалить фиксацию из своего репозитория, потому что я загрузил неправильные материалы.

Я использовал git revert <the_commit> , но поскольку фиксация является корневой, я не могу ее удалить. фатальный: не удается отменить корневую фиксацию

Что делать в таком случае?

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

Ответ №1:

Вы можете сделать это с помощью git filter-branch. Сначала определите идентификатор фиксации в корне, который вы хотите удалить. Я представлю это с помощью <the_commit> . Затем запустите, git filter-branch используя --parent-filter и sed команду, которая отсекает этого родителя:

 git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
  

Вот расшифровка примера, который я только что попробовал:

 $ git log
commit 7e1ba37b51fc2cc6289cf66367c9aedc74c664a8
Author: Greg Hewgill <greg@example.com>
Date:   Fri May 27 20:54:27 2011  1200

    three

commit a8a410d2361824cbd518a48225e9402a691be93f
Author: Greg Hewgill <greg@example.com>
Date:   Fri May 27 20:54:17 2011  1200

    two

commit 3171d512d98f6bc5f3c2469312930c0d32d3aa07
Author: Greg Hewgill <greg@example.com>
Date:   Fri May 27 20:54:00 2011  1200

    one
$ git filter-branch --parent-filter "sed 's/-p 3171d512d98f6bc5f3c2469312930c0d32d3aa07//'" HEAD
Rewrite 7e1ba37b51fc2cc6289cf66367c9aedc74c664a8 (3/3)
Ref 'refs/heads/master' was rewritten
$ git log
commit 489ec1ee20e0dd20cd835ceebf157f628cd75a44
Author: Greg Hewgill <greg@example.com>
Date:   Fri May 27 20:54:27 2011  1200

    three

commit a6f5ee410c9ea4fca6fbff265149b7fc555241eb
Author: Greg Hewgill <greg@example.com>
Date:   Fri May 27 20:54:17 2011  1200

    two
$ 
  

Комментарии:

1. Это чрезвычайно полезный ответ, и я убедился, что он работает. Спасибо!

Ответ №2:

Для удаления корневой фиксации вам просто нужно удалить все ветви (и теги), из которых она доступна.

Это можно сделать с помощью git branch -D branch-name . (Вам придется сначала проверить другую ветку, которая не ссылается на эту корневую фиксацию, поскольку вы не можете удалить текущую ветку, я думаю.)

Если вы хотите сохранить другие коммиты в этой ветке и удалить только корневую, git filter-branch лучше, смотрите ответ от Greg .