Git, отменить последний коммит, который является первым коммитом - PullRequest
2 голосов
/ 22 марта 2020

Я создал первый коммит моего проекта, но забыл игнорировать node_modules.

Я попытался это решение отменить коммит. Тем не менее, он возвращает мне это (извините, виртуальная машина без возможности копирования / вставки):

enter image description here

Как вы можете видеть на скриншоте выше, это не способен делать то, что я ожидал. (красные линии для выделения команд и помощи в чтении)

Как я могу отменить последний коммит, учитывая, что это самый первый коммит?

Ответы [ 2 ]

3 голосов
/ 22 марта 2020

Вам не нужно удалять коммит. Вы можете удалить модули узла, отредактировать .gitignore и внести изменения в последний коммит (который также является первым в вашем случае):

# changes
git commit --amend
git push -f

Если вы настаиваете на удалении коммита, вы можете пробег

git update-ref -d HEAD
git push -f
1 голос
/ 22 марта 2020

Причина сбоя вашей команды git reset в том, что git reset на самом деле не удаляет коммит. Вместо этого он перемещает вас из текущего коммита, идентифицируемого вашим текущим именем ветки, в предыдущий коммит в той же ветке. Но есть только один коммит! У него нет предыдущего коммита. Поэтому go.

некуда больше. Как сказал Марун , вы можете обновить свой индекс - в этом случае, запустив git rm --cached node_modules, удалите все файлы node_modules из Индекс, оставив их в своем рабочем дереве, а затем запустите git commit --amend. --amend изменяет операцию фиксации. Вместо добавления коммита к текущей ветви, он выталкивает текущий коммит с пути , так что новый коммит занимает его место.

Когда у вас есть более одного коммита, это имеет больше смысла наглядно. Например, если у вас было три коммита - с тремя разными идентификаторами ha sh, которые мы просто будем называть A, B и C здесь - вы можете нарисовать их так:

A--B--C   <-- master

Использование git commit --amend пушей C при создании D:

     C  [abandoned]
    /
A--B--D   <-- master

Обратите внимание, что существующий коммит C остается в вашем хранилище. Просто нет никакого очевидного способа найти это больше: git log не будет показывать это, потому что git log теперь начинается с D, который теперь является последним коммитом на ваш master, и работает обратно B, а затем A.

В этом случае, однако, нет никаких предыдущих коммитов. Ваш существующий набор коммитов будет нарисован больше как:

A   <-- master

Когда Git пушит A из-за способа поставить B, вы получите:

A

B   <-- master

Опять же, нет очевидного способа найти коммит, который вы только что "заменили". Он все еще существует, и по умолчанию останется на 30 дней, если вы решите, что хотите его вернуть, но в большинстве случаев его просто нет. В конце концов, ваш Git отбросит его, потому что у него нет имени, по которому кто-либо может найти его.

Однако, если вы отправили коммит A некоторым другие Git, используя, например, git push origin master, , что Git все еще имеет копию commit A. Вам нужно будет заставить их заменить A на ваши новые и улучшенные B. Для этого, как правило, вам нужно будет использовать git push --force origin master или git push --force-with-lease origin master.

Если вы не отправили коммит A в какой-либо другой репозиторий Git, ни один из это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...