Как мне отменить последние локальные коммиты в Git?

Я случайно зафиксировал не те файлы в Git, но не отправил фиксации на сервере еще нет.

Как я могу отменить эти коммиты из локального репозитория?

Кажется, единственный способ - скопировать изменения в каком-то текстовом редакторе GUI, затем стереть весь локальный клон, затем повторно клонировать репозиторий, а затем повторно применить изменения. Тем не мение,

  • Это может вызвать потерю данных.
  • Это очень сложно сделать, когда был запущен только случайный git commit.

Есть ли способ лучше?


person Community    schedule 29.05.2009    source источник
comment
См. Это руководство по отмене коммитов Git в локальных, общедоступных и ветвях Git. Как отменить коммиты Git как pro   -  person Luzan Baral    schedule 27.02.2017
comment
Вы знаете, что нужно git? git undo, вот и все. Затем пропадает репутация git в отношении ошибок, допущенных нами, простыми смертными. Реализуйте, поместив текущее состояние в стек git перед выполнением любой команды git. Это повлияет на производительность, поэтому было бы лучше добавить флаг конфигурации, указывающий, следует ли его включать.   -  person Yimin Rong    schedule 20.03.2018
comment
@YiminRong Это можно сделать с помощью функции Git alias: git-scm .com / book / en / v2 / Git-Basics-Git-Aliases   -  person Edric    schedule 05.10.2018
comment
Для пользователей VsCode просто введите ctrl + shift + G, а затем нажмите на три точки, то есть дополнительные параметры, а затем нажмите Отменить последнюю фиксацию.   -  person ashad    schedule 08.04.2019
comment
@YiminRong Отменить что именно? Есть десятки самых разных функциональных случаев, когда отмена означает что-то совершенно. Готов поспорить, добавление новой причудливой волшебной палочки только еще больше запутает ситуацию.   -  person RomainValeri    schedule 24.03.2020
comment
@YiminRong Не покупаю. Люди по-прежнему будут возиться и отменять вещи, чтобы их нельзя было отменить. Но что еще более важно, git reflog уже близок к тому, что вы описываете, но дает пользователю больше контроля над тем, что нужно (не) делать. Но, пожалуйста, нет, отмена не работает везде одинаково, и люди ожидают множества разных вещей, которые она даст. Отменить последнюю фиксацию? Отменить последнее действие? Если последним действием было нажатие, как именно отменить (сбросить и нажать) или (вернуться и нажать)?   -  person RomainValeri    schedule 25.03.2020
comment
См. Эту диаграмму из Git. Он показывает все возможные способы испортить код и способы их устранения.   -  person Honey    schedule 28.03.2020
comment
@RomainValeri Правильная критика. Но у x есть проблемы, это не достаточный аргумент для оправдания не делайте x   -  person Nathan    schedule 02.05.2020
comment
Чтобы сделать что-то простое в git, выполните либо невероятно сложную задачу A, либо невероятно сложную задачу B. Затем немного испортите ее и попробуйте вернуться, выполнив невероятно сложную задачу C или невероятно сложную задачу D.   -  person Snowcrash    schedule 19.10.2020


Ответы (64)


Отменить фиксацию и повторить

$ git commit -m "Something terribly misguided" # (0: Your Accident)
$ git reset HEAD~                              # (1)
[ edit files as necessary ]                    # (2)
$ git add .                                    # (3)
$ git commit -c ORIG_HEAD                      # (4)
  1. Эта команда отвечает за отмену. Он отменит вашу последнюю фиксацию, оставив ваше рабочее дерево (состояние файлов на диске) нетронутым. Вам нужно будет добавить их снова, прежде чем вы сможете снова зафиксировать их).

  2. Внесите исправления в рабочие файлы дерева.

  3. git add все, что вы хотите включить в свой новый коммит.

  4. Зафиксируйте изменения, повторно используя старое сообщение фиксации. reset скопировал старую голову в .git/ORIG_HEAD; commit с -c ORIG_HEAD откроет редактор, который изначально содержит сообщение журнала из старого коммита и позволяет вам его редактировать. Если вам не нужно редактировать сообщение, вы можете использовать опцию -C.

В качестве альтернативы, чтобы отредактировать предыдущую фиксацию (или только ее сообщение о фиксации), commit --amend добавит изменения в текущем индексе к предыдущей фиксации.

Чтобы удалить (не возвращать) фиксацию, отправленную на сервер, необходимо перезаписать историю с помощью git push origin master --force.


Дальнейшее чтение

Как переместить HEAD назад в предыдущее место? (Отдельная голова) и отменить фиксацию

Приведенный выше ответ покажет вам git reflog, который вы можете использовать для определения SHA-1 для фиксации, к которой вы хотите вернуться. Получив это значение, используйте последовательность команд, как описано выше.


HEAD~ совпадает с HEAD~1. Статья Что такое HEAD в git? полезна, если вы хотите отменить фиксацию нескольких коммитов.

person Community    schedule 29.05.2009
comment
И если фиксация была сделана не в той ветке, вы можете git checkout theRightBranch со всеми этапами изменения. Как я только что должен был сделать. - person Frank Shearar; 05.10.2010
comment
Если вы работаете в DOS, вместо git reset --soft HEAD^ вам нужно использовать git reset --soft HEAD~1. ^ - это символ продолжения в DOS, поэтому он не будет работать должным образом. Кроме того, по умолчанию используется --soft, поэтому вы можете опустить его, если хотите, и просто произнесите git reset HEAD~1. - person Ryan Lundy; 13.04.2011
comment
Пользователи zsh могут получить: zsh: no matches found: HEAD^ - вам нужно выйти ^ т.е. git reset --soft HEAD\^ - person tnajdek; 21.02.2013
comment
Ответ неверен, если, скажем, случайно git commit -a было выдано, тогда как -a нужно было не указывать. В этом случае лучше не опускать --soft (что приведет к --mixed, которое является значением по умолчанию), а затем вы можете повторно внести изменения, которые вы хотели зафиксировать. - person dmansfield; 03.07.2014
comment
В более поздних версиях git HEAD~ можно заменить на @~. - person ThomasW; 16.09.2016
comment
Это действительно не способ отменить набор изменений? Это больше, если нужно внести изменения? - person jterm; 15.03.2017
comment
Если вы уже отправили свои изменения в удаленную ветку и выполняете git reset, как показано выше, вы будете за удаленной веткой. В такой ситуации предпочтительнее использовать git revert ‹хеш фиксации›, который добавит еще одну фиксацию, которая отменяет предыдущие изменения. Дополнительная информация здесь - person user3613932; 13.04.2017
comment
@Green Я думаю, это произойдет, если у вас есть только 1 коммит ... нет более раннего коммита, на который нужно выполнить сброс. - person Mr5o1; 14.09.2017
comment
Это почти исчерпывающий ответ. В случае, если ваша «последняя фиксация» === «ваша первая фиксация» - сброс ничего не сделает, кроме выдачи приятного фатального сообщения. В этом случае используйте git update-ref -d HEAD. - person daGo; 06.10.2017
comment
Также, если у вас слишком большие файлы, которые вам не принадлежат, и вы не можете завершить начальные коммиты. вы можете удалить .git, удалить слишком большие файлы. git init и commit -m 'начальная фиксация', а затем нажмите -u origin master - person microsaurus_dex; 20.03.2018
comment
Пользователи zsh должны выключить подстановку с помощью noglob git, чтобы избавиться от это постоянное раздражение с символом каретки ^. - person Mr. Tao; 06.05.2018
comment
- git reset --hard HEAD ~ 1, вернется к одной фиксации и удалит все файлы, о которых знает git, но не неотслеживаемые файлы, поскольку git не имеет о них представления. - git reset HEAD ~ 1, сохранит все изменения текущего коммита, но сделает их неотслеживаемыми - git reset --soft HEAD ~ 1, сохранит ваши коммитированные файлы в постановке, а неотслеживаемые файлы останутся неотслеживаемыми - person briefy; 07.11.2018
comment
Я случайно зафиксировал целую папку. поэтому я затем запустил git reset HEAD core /, который дал мне этот список «Неустановленные изменения после сброса:» (показывая все мои файлы основных папок / подпапок). Затем, когда я запустил «git status», весь мой corecontent оказался под заголовком списка «Изменения, не предназначенные для фиксации»: звучит хорошо. Затем я добавил ядро ​​в свой .gitignore. и снова запустил «git status», но файлы продолжали появляться в списке, не предназначенном для фиксации. Я бы предпочел, чтобы git их даже не видел, но я не могу понять, как это сделать? - person Auxiliary Joel; 29.07.2019
comment
Я погуглил и попал на эту страницу около 50 раз, и я всегда посмеивался над первой строчкой кода git commit -m "Something terribly misguided" - person 100pic; 21.08.2019
comment
Выполнение первой команды дает fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree. - person kaleidawave; 08.11.2019
comment
Случайно я сделал git commit -m '...' files, предварительно не выполнив git add files, и заметил, что эти фиксация и push работают нормально. Думаю, git теперь достаточно умен, чтобы автоматически добавлять, когда вы используете git commit. - person thdoan; 11.12.2019

Отменить фиксацию немного страшно, если вы не знаете, как это работает. Но на самом деле это удивительно просто, если вы понимаете. Я покажу вам 4 различных способа отменить фиксацию.

вариант 1: git reset --hard

Скажем, у вас есть это, где C - ваша ГОЛОВКА, а (F) - состояние ваших файлов.

   (F)
A-B-C
    ↑
  master

Вы хотите удалить коммит C и никогда больше его не увидеть и потерять все изменения в локально измененных файлах. Ты делаешь это:

git reset --hard HEAD~1

Результат:

 (F)
A-B
  ↑
master

Теперь B - ГОЛОВА. Поскольку вы использовали --hard, ваши файлы сбрасываются в свое состояние при фиксации B.

вариант 2: git reset

Ах, но предположим, что фиксация C не была катастрофой, а просто немного ошиблась. Вы хотите отменить фиксацию, но сохранить свои изменения для небольшого редактирования, прежде чем вы сделаете более точную фиксацию. Начнем снова с C в качестве ГОЛОВКИ:

   (F)
A-B-C
    ↑
  master

Вы можете сделать это, оставив --hard:

git reset HEAD~1

В этом случае результат:

   (F)
A-B-C
  ↑
master

В обоих случаях HEAD - это просто указатель на последнюю фиксацию. Когда вы делаете git reset HEAD~1, вы говорите Git переместить указатель HEAD назад на одну фиксацию. Но (если вы не используете --hard) вы оставляете свои файлы такими, какими они были. Итак, теперь git status показывает изменения, которые вы отметили в C. Вы ничего не потеряли!

вариант 3: git reset --soft

Для легкого прикосновения вы можете даже отменить фиксацию, но оставить свои файлы и свой index:

git reset --soft HEAD~1

Это не только оставляет ваши файлы в покое, но и оставляет в покое ваш индекс. Когда вы сделаете git status, вы увидите, что в индексе находятся те же файлы, что и раньше. Фактически, сразу после этой команды вы можете выполнить git commit и повторить только что сделанную фиксацию.

вариант 4: вы сделали git reset --hard и вам нужно вернуть этот код

Еще кое-что: Предположим, вы уничтожили фиксацию, как в первом примере, но потом обнаружили, что она вам все-таки нужна? Не повезло, правда?

Нет, есть все еще способ вернуть его. Введите git reflog, и вы увидите список (частичных) фиксаций shas (которые есть, хэши), в котором вы переместились. Найдите уничтоженный коммит и сделайте следующее:

git checkout -b someNewBranchName shaYouDestroyed

Теперь вы воскресили этот коммит. На самом деле коммиты не уничтожаются в Git в течение примерно 90 дней, поэтому вы обычно можете вернуться и спасти тот, от которого не собирались избавляться.

person Ryan Lundy    schedule 28.07.2011
comment
@Kyralessa: Если я сделаю git reset --hard HEAD^ дважды, изменится ли состояние на (A)? - person dma_k; 25.02.2012
comment
Не работает с OS x. - Я получаю неоднозначный аргумент «HEAD ^» ... Неизвестная версия или путь не в рабочем дереве. Использование версии с тильдой не имеет значения. Но git log и git status, похоже, показывают, что на месте есть действительная фиксация. - person Adam; 22.06.2012
comment
@Kyralessa - да, я думаю, это может быть проблемой. В этом случае я совершил что-то, что считал небольшим - и когда я попытался нажать, я обнаружил, что это 400 МБ данных (!) (Глубоко вложенная папка ресурсов, содержащая видео и музыкальные файлы). Итак, мне нужно отменить фиксацию, но сохранить исходные файлы, и я зафиксирую их позже, когда у меня будет лучшее сетевое соединение - или в другое репо. - person Adam; 22.06.2012
comment
Спасибо также за объяснение. Вопрос по поводу этого утверждения (re --hard): ваши файлы сбрасываются в свое состояние при фиксации B. Скажем, я зафиксировал только некоторые из моих изменений, другие файлы предназначены для будущих фиксаций. На сколько я сбрасываю? Только зафиксированные файлы? Или мне сбросить весь рабочий набор? - person TwainJ; 30.10.2012
comment
Поскольку так много людей поддерживают ответ, я предлагаю такой отзыв: напишите легко читаемый и легко выполняемый набор инструкций, которые я могу выполнить, чтобы решить свою проблему. Другой ответ таков; этот не делает. - person Danny; 01.02.2013
comment
ОСТЕРЕГАТЬСЯ! Это могло бы не сработать, если бы ваша ошибочная фиксация была слиянием (перемоткой вперед)! Если ваша голова находится в фиксации слияния (например, функция объединенной ветки в главную), git reset --hard~1 будет указывать главную ветвь на последнюю фиксацию внутри ветки функции. В этом случае вместо относительной команды следует использовать конкретный идентификатор фиксации. - person Chris Kerekes; 20.02.2013
comment
Если подумать, такое поведение может быть результатом слияния сначала основной ветки с функциональной ветвью, тестирования, а затем (перемотка вперед) слияния функциональной ветки с основной. - person Chris Kerekes; 21.02.2013
comment
Обратите внимание на то, что число в HEAD~1 можно заменить на любое положительное целое число, например HEAD~3. Это может показаться очевидным, но новички (такие как я) очень осторожны при запуске команд git, поэтому они могут не захотеть рискнуть что-то испортить, тестируя эти вещи самостоятельно. - person Šime Vidas; 13.08.2013
comment
Может ли кто-нибудь прокомментировать, что, если вы уже нажали фиксацию? Этот ответ по-прежнему актуален или от этого все еще сложнее? - person GreenAsJade; 05.09.2013
comment
Отличный совет. Просто использовал его, хотя я думаю, уместно отметить, что любые теги, связанные с удаленной фиксацией, будут продолжать существовать, даже если они не появятся в gitk. Удалите его с помощью git tag -d XXXXX, где XXXXX - имя тега. - person Phlucious; 25.10.2013
comment
Отсутствует важный момент: если упомянутая фиксация была ранее «отправлена» на удаленный компьютер, любая операция «отмены», какой бы простой она ни была, вызовет огромную боль и страдания для остальных пользователей, у которых есть эта фиксация в их локальной копии, когда они сделают «git pull» в будущем. Итак, если фиксация уже была отправлена, сделайте это вместо этого: git revert ‹bad-commit-sha1-id› git push origin: - person FractalSpace; 09.11.2013
comment
@FractalSpace, это не причинит огромной боли и страданий. Я сделал несколько принудительных толчков при использовании Git в команде. Все, что нужно, - это общение. - person Ryan Lundy; 09.11.2013
comment
@Kyralessa На моем рабочем месте испорченный рабочий процесс всей команды, а затем рассказ им, как исправить дерьмо, не называется «общением». git history re-write - это деструктивная операция, которая приводит к удалению частей репо. Настаивать на его использовании при наличии ясных и безопасных альтернатив просто безответственно. - person FractalSpace; 09.11.2013
comment
@ Киралесса, у меня вопрос по поводу твоего ответа. Вы говорите, что git reset --soft не только оставляет ваши файлы в покое, но и оставляет в покое ваш индекс. Когда вы выполните команду git status, вы увидите, что в индексе находятся те же файлы, что и раньше. Фактически, сразу после этой команды вы можете выполнить git commit и повторить только что сделанную фиксацию. Но если git reset --soft не изменяет индекс, git commit ничего не сделает. Вы имеете в виду git commit -a (при условии, что заранее не было изменений в рабочем каталоге) или мне что-то не хватает (что более вероятно)? - person Ellen Spertus; 20.02.2014
comment
@espertus, возможно, один из способов взглянуть на это заключается в том, что здесь работают три вещи: ваши файлы, ваш индекс и ваша история (то есть указатель вашей ветки). Допустим, вы находитесь на фиксации C (как указано выше). Ваши файлы, индекс и указатель ветки совпадают. Если вы используете git reset --soft HEAD ~ 1, указатель вашей ветки переместится обратно в B, но ваши файлы и индекс останутся в своих версиях в C. Если вы используете git reset --mixed HEAD ~ 1, ваш указатель ветки и индекс переместятся обратно в B, но ваши файлы остаются в своем состоянии в C. Затем ваши файлы показывают изменения, а ваш индекс - нет. git reset --hard HEAD ~ 1 перемещает все три назад. - person Ryan Lundy; 20.02.2014
comment
@Kyralessa, большое спасибо за быстрый ответ. Проснувшись, я понял, чего мне не хватает. Я предполагал, что индекс пуст, когда все зафиксировано, но теперь я понимаю, что это копия. - person Ellen Spertus; 20.02.2014
comment
Сброс демистифицировано, Скотт Чакон (ИТ-директор GitHub, Автор Pro Git) объясняет и иллюстрирует команду git reset и то, как переместить HEAD (--soft), обновить индекс (--mixed, по умолчанию) и обновить рабочий каталог (--hard) из вверх дном. Я всегда использовал ответ Киралессы в качестве шпаргалки, но сообщение в блоге Скотта, наконец, заставило его щелкнуть и прижиться! - person fspinnenhirn; 19.08.2014
comment
Приняты ваши иллюстрации с некоторыми улучшениями. ru.stackoverflow.com/a/431521/181472 - person Nick Volynkin; 06.07.2015
comment
ссылка на index, добавленная в контексте, плюс комментарий о резервном копировании всего проекта в качестве меры предосторожности @Kidburla. - person matanster; 15.10.2015
comment
Помимо иллюстраций здесь есть несколько интуитивно понятных графических изображений в этом сообщении - person joelostblom; 07.01.2017
comment
@ Киралесса, ясно. Но что лучше говорить о шашах, чем о хешах? На странице руководства git упоминаются только хеши и хеши SHA-1. Вопрос скорее в следующем: что лучше всего улучшает ответ? - person Alfe; 13.09.2017
comment
В чем разница между git reset --hard HEAD~1 и git reset --hard, если вам нужно просто избавиться от всех изменений, внесенных вами после последнего коммита? Я всегда использую git reset --hard, и это возвращает меня к моей последней фиксации. По аналогии, я чувствую, что это своего рода закрытие приложения без сохранения изменений, так что все, что было в памяти RAM, было потеряно, но то, что у вас было в памяти ROM, сохраняется, используя ваш последний коммит в качестве памяти ROM в этой аналогии, и ваши изменения, которые не были зафиксированы как материал в оперативной памяти, который еще не был сохранен. - person Jaime Montoya; 28.09.2017
comment
Ссылаясь на @poorva из комментариев в других сообщениях ниже: «Чтобы отменить последние изменения, вы можете использовать git reset --hard, но если вам нужно жестко удалить последние n коммитов, вы указываете SHA». - person Jaime Montoya; 28.09.2017
comment
Можете ли вы изменить порядок публикации, чтобы --soft было первым показанным предложением? Один из наших инженеров не прочитал всю статью и использовал --hard для общего рабочего каталога, что, к счастью, стоило нам всего одного дня работы. - Спасибо. P.S. Да, мы знаем, что использование общих рабочих каталогов - плохая практика, но это не хранение кода, а конфигурация марионетки. - person ruckc; 24.10.2017
comment
Я пытаюсь выполнить git reset --soft HEAD ~ 1 и получаю следующее: почему ?: fatal: неоднозначный аргумент «HEAD ~ 1»: неизвестная версия или путь не в рабочем дереве. Используйте '-', чтобы отделить пути от ревизий, например: 'git ‹command› [‹revision› ...] - [‹file› ...]' - person gangelo; 19.12.2017
comment
@gangelo, сколько коммитов у вас в репозитории? Больше одного? Трудно выполнить сброс до любой фиксации, поэтому я обычно запускаю репо с фиктивной фиксацией (например, с пустым файлом .gitignore), чтобы обойти этот тип проблемы. - person Ryan Lundy; 20.12.2017
comment
@Kyralessa У меня есть только 1 коммит, но он не выдвинут, потому что, как ни странно, мне нужно вытащить мой файл .gitignore из моего репозитория. Думаю, я могу зафиксировать и применить .gitignore постфактум, но я не помню, как это сделать, и помню, что это было проблемой. Я хочу только отменить фиксацию, которая у меня есть, до такой степени, что, если я сделаю «git status», я увижу, что все мои файлы отслеживаются и готовы к фиксации, как будто этого никогда не было. - person gangelo; 20.12.2017
comment
@gangelo, посмотрите здесь несколько идей о том, как отменить эту первую фиксацию: stackoverflow.com/questions/6632191/ - person Ryan Lundy; 20.12.2017
comment
- git reset --hard HEAD ~ 1, вернется к одной фиксации и удалит все файлы, о которых знает git, но не неотслеживаемые файлы, поскольку git не имеет о них представления. - git reset HEAD ~ 1, сохранит все изменения текущего коммита, но сделает их неотслеживаемыми - git reset --soft HEAD ~ 1, сохранит ваши зафиксированные файлы в постановке, а неотслеживаемые файлы останутся неотслеживаемыми - person briefy; 07.11.2018
comment
Отлично. Очень полезно, если ваша последняя фиксация была пустой, но вы хотите реорганизовать ее в более значимые коммиты, и в этом случае используйте. git reset --soft HEAD~1 - person Pztar; 09.01.2019
comment
Как упоминал @Kidburla, при использовании git reset --hard HEAD~1 удаляются текущие изменения, которые не были зафиксированы. Это немного сбивает с толку, потому что кажется, что (F) представляет эти изменения, а вы оставляете (F) после reset --hard. Должно быть предупреждение или что-то еще, чтобы люди не могли удалить свои изменения. Или вы также можете представить незафиксированные изменения в примерах. - person Murilo; 13.05.2019
comment
Учитывая, сколько раз я гуглил, думаю, мне нужно сделать татуировку git reset --soft HEAD~1 на тыльной стороне руки. - person rinogo; 13.08.2020
comment
@ChrisKerekes Это на самом деле нужно отредактировать и включить в ответ. - person Farid; 17.03.2021

Есть два способа отменить вашу последнюю фиксацию, в зависимости от того, сделали ли вы свою фиксацию общедоступной (отправленной в удаленный репозиторий):

Как отменить локальную фиксацию

Допустим, я совершил локальную фиксацию, но теперь я хочу удалить эту фиксацию.

git log
    commit 101: bad commit    # Latest commit. This would be called 'HEAD'.
    commit 100: good commit   # Second to last commit. This is the one we want.

Чтобы восстановить все, как было до последней фиксации, нам нужно reset выполнить фиксацию перед HEAD:

git reset --soft HEAD^     # Use --soft if you want to keep your changes
git reset --hard HEAD^     # Use --hard if you don't care about keeping the changes you made

Теперь git log покажет, что наша последняя фиксация была удалена.

Как отменить публичную фиксацию

Если вы уже сделали свои коммиты общедоступными, вы захотите создать новый коммит, который отменит изменения, сделанные вами в предыдущем коммите (текущая HEAD).

git revert HEAD

Теперь ваши изменения будут отменены и готовы к фиксации:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Для получения дополнительной информации ознакомьтесь с Основы Git - Отмена действий < / а>.

person Andrew    schedule 16.06.2011

Добавляйте / удаляйте файлы, чтобы все было так, как вы хотите:

git rm classdir
git add sourcedir

Затем измените фиксацию:

git commit --amend

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

Обратите внимание, что вы должны делать это только в том случае, если вы еще не нажали. Если вы нажали, вам просто нужно будет зафиксировать исправление в обычном режиме.

person bdonlan    schedule 29.05.2009
comment
К вашему сведению: это удалит все мои файлы, и я потерял изменения. - person egorlitvinenko; 15.05.2020
comment
UPD: Однако я восстановил его с помощью reflog. Но квитанция не сработала для первоначального коммита. - person egorlitvinenko; 15.05.2020
comment
Используйте git rm --cached, чтобы хранить файлы в файловой системе и удалять их только из индекса git! - person xuiqzy; 19.05.2020

git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

or

git reset --hard HEAD~1

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

От hard reset до HEAD-1 ваша рабочая копия перейдет в состояние фиксации перед ошибкой фиксации.

person Lennart Koopmann    schedule 29.05.2009
comment
git commit -a -m "" или git commit -am "" естественно! :] - person trejder; 21.06.2014
comment
Еще одно «сокращенное» использование тайника; если вы хотите все отключить (отменить git add), просто git stash, затем git stash pop - person seanriordan08; 09.12.2015

Чтобы изменить последнюю фиксацию

Заменить файлы в индексе:

git rm --cached *.class
git add *.java

Затем, если это частная ветка, измените фиксацию:

git commit --amend

Или, если это общая ветка, сделайте новую фиксацию:

git commit -m 'Replace .class files with .java files'


(Чтобы изменить предыдущую фиксацию, используйте замечательную интерактивную перебазировку.)


ProTip ™: добавьте *.class в gitignore, чтобы это больше не повторялось.


Чтобы отменить фиксацию

Изменение фиксации - идеальное решение, если вам нужно изменить последнюю фиксацию, но более общее решение - reset.

Вы можете сбросить Git до любого коммита с помощью:

git reset @~N

Где N - количество коммитов до HEAD, а @~ сбрасывается до предыдущей фиксации.

Итак, вместо изменения фиксации вы можете использовать:

git reset @~
git add *.java
git commit -m "Add .java files"

Ознакомьтесь с git help reset, особенно с разделами о --soft --mixed и --hard, чтобы лучше понять, что это делает.

Reflog

Если вы ошиблись, вы всегда можете использовать журнал ссылок, чтобы найти упавшие коммиты:

$ git reset @~
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~
2c52489 HEAD@{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


person Zaz    schedule 31.07.2010
comment
Для тех, кто читает в будущем - обратите внимание, что git revert - это отдельная команда, которая в основном «сбрасывает» один коммит. - person BKSpurgeon; 08.08.2018

Используйте 1_.

Чтобы получить идентификатор фиксации, просто используйте git log.

person Jaco Pretorius    schedule 25.05.2012
comment
Что это значит, вишня выбирает коммит? В моем случае я был не на той ветке, когда редактировал файл. Я совершил это, а затем понял, что попал не в ту ветку. Использование git reset --soft HEAD ~ 1 вернуло меня к состоянию непосредственно перед фиксацией, но теперь, если я проверю правильную ветку, как мне отменить изменения в файле в неправильной ветке, а вместо этого сделать их (в файле с тем же именем) в правильной ветке? - person astronomerdave; 14.01.2015
comment
Я просто использовал git revert commit-id работу как шарм. Конечно, тогда вам нужно будет продвигать свои изменения. - person Casey Robinson; 26.01.2016
comment
Думаю, это будет git cherry-pick <<erroneous-commit-sha>> @astronomerdave. От, г. Почти-2-летнего-опоздания-к-вечеринке. - person Tom Howard; 20.10.2016
comment
@Kris: Вместо вишневого выбора используйте rebase. Потому что это продвинутый сбор вишни - person Eugen Konkov; 10.11.2018
comment
Я бы использовал возврат только в том случае, если я уже отправил свою фиксацию. В противном случае сброс - лучший вариант. Не забывайте, что откат создает новую фиксацию, и обычно это не цель. - person Hola Soy Edu Feliz Navidad; 06.02.2020

Если вы планируете полностью отменить локальную фиксацию, все, что вы изменили, вы сделали в фиксации, и если вас это не беспокоит, просто выполните следующую команду.

git reset --hard HEAD^1

(Эта команда проигнорирует всю вашу фиксацию, и ваши изменения будут полностью потеряны из вашего локального рабочего дерева). Если вы хотите отменить фиксацию, но хотите внести изменения в промежуточную область (перед фиксацией, как и после git add), выполните следующую команду.

git reset --soft HEAD^1

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

git reset HEAD

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

Еще (ссылка не работает) (Архивная версия)

person Madhan Ayyasamy    schedule 31.01.2013
comment
@SMR, в вашем примере все указывают только на текущую HEAD. ГОЛОВА ^ = ГОЛОВА ^ 1. А также HEAD ^ 1 = HEAD ~ 1. Когда вы используете HEAD ~ 2, есть разница между символами ~ и ^. Если вы используете ~ 2, это означает «первый родитель первого родителя» или «дедушка или бабушка». - person Madhan Ayyasamy; 14.12.2015
comment
git reset --hard HEAD ^ 1 дает мне эту фатальную ошибку: неоднозначный аргумент 'HEAD1': неизвестная ревизия или путь не в рабочем дереве. - person Rob Mosher; 20.12.2020
comment
Как насчет удаления некоторых файлов из фиксации и сохранения других? - person Maf; 11.03.2021

Если у вас установлен Git Extras, вы можете запустить git undo, чтобы отменить последнюю фиксацию. git undo 3 отменит последние три фиксации.

person nickf    schedule 13.12.2011

Я хотел отменить последние пять коммитов в нашем общем репозитории. Я нашел идентификатор ревизии, к которой хотел откатиться. Затем я ввел следующее.

prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
prompt> git push origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
prompt>
person neoneye    schedule 06.04.2012
comment
Как правило, перезапись истории в общем репозитории - очень плохая идея. Я предполагаю, что вы знаете, что делаете, я просто надеюсь, что будущие читатели тоже. - person Brad Koch; 07.12.2012
comment
Да откат опасен. Перед отправкой убедитесь, что ваша рабочая копия находится в желаемом состоянии. При нажатии нежелательные коммиты удаляются безвозвратно. - person neoneye; 08.12.2012
comment
Как и в реальном мире, если вы хотите переписать историю, вам нужен заговор: все должны участвовать в заговоре (по крайней мере, все, кто знает историю, то есть все, кто когда-либо выходил из ветки). Источник: stackoverflow.com/a/2046748/334451 - person Mikko Rantalainen; 07.08.2013

Я предпочитаю использовать git rebase -i для этой работы, потому что появляется красивый список, в котором я могу выбрать коммиты, от которых нужно избавиться. Возможно, это не так прямо, как некоторые другие ответы здесь, но это просто кажется правильным.

Выберите, сколько коммитов вы хотите перечислить, затем вызовите так (чтобы зарегистрировать последние три)

git rebase -i HEAD~3

Список образцов

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Затем Git удалит коммиты для любой удаляемой строки.

person Steven Penny    schedule 25.10.2012
comment
Я нахожу это действительно полезным для отмены слияния / выбора вишни, например, нестабильная функциональная ветка - person FredL; 24.07.2020

Как исправить предыдущую локальную фиксацию

Используйте git-gui (или аналогичный), чтобы выполнить git commit --amend. Из графического интерфейса вы можете добавлять или удалять отдельные файлы из фиксации. Вы также можете изменить сообщение фиксации.

Как отменить предыдущую локальную фиксацию

Просто верните ветку в предыдущее место (например, используя gitk или git rebase). Затем повторно примените изменения из сохраненной копии. После сборки мусора в вашем локальном репозитории это будет похоже на то, что нежелательной фиксации никогда не было. Чтобы сделать все это одной командой, используйте git reset HEAD~1.

Предупреждение: Небрежное использование git reset - хороший способ привести вашу рабочую копию в запутанное состояние. Я рекомендую новичкам в Git избегать этого, если они могут.

Как отменить публичную фиксацию

Выполните обратный выбор вишни (git-revert), чтобы отменить изменения.

Если вы еще не перенесли другие изменения в свою ветку, вы можете просто сделать ...

git revert --no-edit HEAD

Затем отправьте обновленную ветку в общий репозиторий.

История фиксации покажет обе фиксации по отдельности.


Дополнительно: исправление частной ветки в публичном репозитории.

Это может быть опасно - убедитесь, что у вас есть локальная копия ветки, которую нужно повторно отправить.

Также обратите внимание: вы не хотите этого делать, если над веткой может работать кто-то другой.

git push --delete (branch_name) ## remove public version of branch

Очистите ветку локально, а затем заново ...

git push origin (branch_name)

В нормальном случае вам, вероятно, не нужно беспокоиться о том, что история коммитов вашей частной ветки останется нетронутой. Просто нажмите последующую фиксацию (см. «Как отменить общедоступную фиксацию» выше), а затем выполните сквош-слияние чтобы скрыть историю.

person Community    schedule 23.04.2013
comment
gitk --all $(git reflog | cut -c1-7)& может быть полезным для поиска предыдущей ревизии, если вы хотите отменить фиксацию '--amend'. - person Brent Bradburn; 19.10.2014
comment
Следует отметить, что если вы пытаетесь удалить секретную информацию перед отправкой в ​​общий репозиторий, выполнение отката вам не поможет, потому что информация все еще будет в истории в предыдущем коммите. Если вы хотите, чтобы изменения никогда не были видны другим, вам нужно использовать git reset - person Jherico; 04.09.2015
comment
Я думаю, что «частный» / «общедоступный» правильнее было бы быть «локальным» / «удаленным». - person Brent Bradburn; 28.03.2018
comment
Исправить частную ветку в удаленном репозитории также можно простым git push origin (branch_name) --force - person Brent Bradburn; 07.09.2018

Если вы хотите отменить его навсегда и клонировали какой-то репозиторий.

Идентификатор фиксации можно увидеть:

git log 

Тогда вы можете сделать что-то вроде:

git reset --hard <commit_id>

git push origin <branch_name> -f
person Community    schedule 17.05.2013
comment
Что делать, если вы не используете ‹commit_id›, а просто используете git reset --hard? Обычно я просто хочу избавиться от своих последних обновлений, которые я еще не зафиксировал, и вернулся к последней сделанной мной фиксации, и я всегда использую git reset --hard. - person Jaime Montoya; 28.09.2017
comment
@JaimeMontoya Чтобы отменить последние изменения, вы можете использовать git reset --hard, но если вам нужно жестко удалить последние n коммитов, вы указываете SHA - person poorva; 28.09.2017

Если вы совершили мусор, но не подтолкнули,

git reset --soft HEAD~1

HEAD ~ 1 - это сокращение от коммита перед заголовком. В качестве альтернативы вы можете обратиться к SHA-1 хэша, если хотите выполнить сброс. Параметр --soft удалит фиксацию, но оставит все ваши измененные файлы «Изменения, подлежащие фиксации», как выразился бы git status.

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

OR

Если вы уже нажали, а кто-то вытащил, что обычно бывает в моем случае, вы не можете использовать git reset. Однако вы можете выполнить git revert,

git revert HEAD

Это создаст новую фиксацию, которая отменяет все, что было внесено случайной фиксацией.

person Community    schedule 03.09.2014
comment
У меня второй случай, но когда я делаю git revert HEAD, появляется сообщение об ошибке: Commit [ID] - это слияние, но опция -m не указана. фатальный: возврат не выполнен. Какие-либо предложения? - person metaforge; 12.11.2014
comment
Вероятно, стоит упомянуть, что вместо HEAD~1 вы можете использовать фактический хеш, отображаемый git log --stat или git reflog - полезно, когда вам нужно «отменить» более одной фиксации. - person ccpizza; 07.12.2014

В SourceTree (графический интерфейс для GitHub) вы можете щелкнуть фиксацию правой кнопкой мыши и выполнить «Обратную фиксацию». Это должно отменить ваши изменения.

На терминале:

В качестве альтернативы вы можете использовать:

git revert

Or:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
person Community    schedule 28.06.2013

Одна команда:

git reset --soft 'HEAD^' 

Отлично работает, чтобы отменить последнюю локальную фиксацию!

person Community    schedule 05.03.2014
comment
Мне нужно было написать git reset --soft HEAD ^ в двойных кавычках, потому что я пишу его из командной строки Windows. - person Ena; 23.04.2014

Просто сбросьте его, выполнив команду ниже, используя git:

git reset --soft HEAD~1

Объясните: что делает git reset, это в основном reset для любого коммита, к которому вы хотите вернуться, а затем, если вы объедините его с ключом --soft, он вернется, но сохраните изменения в вашем файле ( s), поэтому вы вернетесь к этапу, на котором только что был добавлен файл, HEAD - это глава ветки, и если вы объедините с ~1 (в этом случае вы также используете HEAD^), он вернет только один коммит, который вы хотеть...

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

«Как

person Community    schedule 21.06.2017

Как отменить последнюю фиксацию Git?

Чтобы восстановить все, как было до последней фиксации, нам нужно выполнить сброс до фиксации перед HEAD.

  1. Если вы не хотите сохранять внесенные вами изменения:

    git reset --hard HEAD^
    
  2. Если вы хотите сохранить свои изменения:

    git reset --soft HEAD^
    

Теперь проверьте свой журнал git. Это покажет, что наша последняя фиксация была удалена.

person Community    schedule 23.04.2014

"Сбросить рабочее дерево до последней фиксации"

git reset --hard HEAD^ 

«Очистить неизвестные файлы из рабочего дерева»

git clean    

см. - Краткое руководство по Git

ПРИМЕЧАНИЕ. Эта команда удалит вашу предыдущую фиксацию, поэтому используйте ее с осторожностью! git reset --hard безопаснее.

person Community    schedule 03.10.2013

Используйте reflog, чтобы найти правильное состояние

git reflog

reflog beforeПЕРЕЗАГРУЗИТЬ ПЕРЕД СБРОСОМ

Выберите правильный журнал ссылок (в моем случае - f3cb6e2) и введите

git reset --hard f3cb6e2

После этого HEAD репо будет сброшен до этого HEADid reset effectЖУРНАЛ ПОСЛЕ СБРОСА

Наконец, рефлог выглядит как на картинке ниже

reflog afterREFLOG FINAL

person Community    schedule 06.01.2014

Первый забег:

git reflog

Он покажет вам все возможные действия, которые вы выполнили в своем репозитории, например, фиксацию, слияние, извлечение и т. Д.

Затем сделайте:

git reset --hard ActionIdFromRefLog
person Community    schedule 11.10.2013

Отменить последнюю фиксацию:

git reset --soft HEAD^ or git reset --soft HEAD~

Это отменит последнюю фиксацию.

Здесь --soft означает возврат в промежуточную стадию.

HEAD~ или HEAD^ означает перейти к фиксации перед HEAD.


Заменить последнюю фиксацию на новую:

git commit --amend -m "message"

Он заменит последний коммит новым.

person Community    schedule 06.03.2016

Другой путь:

Проверьте ветку, которую вы хотите вернуть, затем сбросьте локальную рабочую копию обратно на фиксацию, которую вы хотите сделать последней на удаленном сервере (все, что будет после нее, будет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал «Reset BRANCHNAME to this commit».

Затем перейдите в локальный каталог вашего репозитория и выполните эту команду:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Это удалит все коммиты после текущего в вашем локальном репозитории, но только для этой одной ветки.

person Community    schedule 13.05.2013

Введите git log и найдите последний хэш-код фиксации, а затем введите:

git reset <the previous co>
person Community    schedule 15.05.2013

В моем случае я случайно зафиксировал некоторые файлы, которые не хотел. Итак, я сделал следующее, и это сработало:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

Проверьте результаты с помощью gitk или git log --stat

person Community    schedule 18.07.2013

Просто запустите это в командной строке:

git reset --soft HEAD~ 
person Community    schedule 06.01.2016

Есть два основных сценария

Вы еще не отправили коммит

Если проблема заключалась в добавленных вами дополнительных файлах (и они не нужны вам в репозитории), вы можете удалить их с помощью git rm, а затем выполнить фиксацию с помощью --amend

git rm <pathToFile>

Вы также можете удалить целые каталоги с помощью -r или даже объединить их с другими командами Bash

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

После удаления файлов вы можете зафиксировать с помощью параметра --amend

git commit --amend -C HEAD # the -C option is to use the same commit message

Это перепишет вашу недавнюю локальную фиксацию, удалив лишние файлы, поэтому эти файлы никогда не будут отправлены на push, а также будут удалены GC из вашего локального репозитория .git.

Вы уже нажали фиксацию

Вы можете применить то же решение из другого сценария, а затем выполнить git push с параметром -f, но это не рекомендуется, так как оно перезаписывает удаленную историю с другим изменением (это может испортить ваш репозиторий).

Вместо этого вы должны выполнить фиксацию без --amend (помните об -amend`: эта опция перезаписывает историю последней фиксации).

person Community    schedule 12.09.2014

Для локального коммита

git reset --soft HEAD~1

или если вы точно не помните, в какой это фиксации, вы можете использовать

git rm --cached <file>

Для принудительной фиксации

Правильный способ удаления файлов из истории репозитория - использовать git filter-branch. То есть,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Но я рекомендую вам использовать эту команду с осторожностью. Дополнительные сведения см. На странице руководства git-filter-branch (1).

person Community    schedule 04.03.2014

Чтобы вернуться к предыдущей версии, навсегда удалив все незафиксированные изменения:

git reset --hard HEAD~1
person Community    schedule 28.08.2014
comment
Возможно, вы могли бы сделать заметку / предупреждение, что его команда отбросит фиксацию и изменения в рабочем каталоге, не спрашивая больше. - person cr7pt0gr4ph7; 25.11.2014
comment
Однако, если вы сделаете это случайно, не все потеряно. См. stackoverflow.com/questions/10099258/, stackoverflow.com/questions/15479501/ и stackoverflow.com/questions/7374069/undo-git-reset-hard/7376959. - person cr7pt0gr4ph7; 25.11.2014
comment
Используйте --soft, чтобы сохранить ваши изменения как uncommitted changes, --hard, чтобы полностью уничтожить фиксацию и вернуться на единицу. Не забывайте делать такие операции только с изменениями, которые еще не внесены. - person Yunus Nedim Mehel; 09.03.2015
comment
@Zaz: Вы правы; возможно, мне следовало это прояснить. Восстановить можно только файлы / изменения, которые были либо добавлены в индекс (/ staged), либо зафиксированы. Незавершенные, неустановленные изменения , как вы сказали, полностью отбрасываются git reset --hard. - person cr7pt0gr4ph7; 14.09.2016
comment
В качестве примечания: каждый раз, когда файл размещается, git сохраняет его содержимое в своей объектной базе данных. Сохраненное содержимое удаляется только при выполнении сборки мусора. Таким образом, можно восстановить последнюю поэтапную версию файла, которая в данный момент не была подготовлена ​​при выполнении git reset --hard (дополнительную информацию см. В сообщениях, указанных выше). - person cr7pt0gr4ph7; 14.09.2016
comment
Это ужасный совет. Это не просто сбрасывает ваш пульт, это удаляет фактические файлы из папки, которую вы делаете. Для меня это было совершенно непонятно, и я подумал, что вы говорили, что просто сбрасываете git head, а не сбрасываете текущие файлы на то, что находится в репозитории. Если бы моих вчерашних ноутбуков не было в моей оперативной памяти, я бы потерял все, что делал вчера. - person stidmatt; 26.01.2019

Есть много способов сделать это:

Команда Git для отмены последней / предыдущей фиксации:

Предупреждение. Не используйте --hard, если вы не знаете, что делаете. --hard слишком опасен и может удалить ваши файлы.

Базовая команда для отмены фиксации в Git:

$ git reset --hard <COMMIT -ID>

or

$ git reset --hard HEAD~<n>

COMMIT-ID: идентификатор фиксации.

n: - количество последних коммитов, которые нужно отменить.

Вы можете получить идентификатор фиксации, как показано ниже:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

где d81d3f1 и be20eb8 - идентификатор фиксации.

Теперь давайте посмотрим на некоторые случаи:

Предположим, вы хотите отменить последнюю фиксацию 'd81d3f1'. Вот два варианта:

$ git reset --hard d81d3f1

or

$ git reset --hard HEAD~1

Предположим, вы хотите отменить фиксацию be20eb8:

$ git reset --hard be20eb8

Для получения более подробной информации вы можете обратиться и попробовать некоторые другие команды для сброса головы в указанное состояние:

$ git reset --help
person Community    schedule 18.02.2016
comment
git reset --hard HEAD~1 слишком опасно! Это не просто «отменит последнюю фиксацию», но полностью вернет репо к предыдущей фиксации. Таким образом, вы ПОТЕРЯЕТЕ все изменения, сделанные в последней фиксации! - person Arnis Juraga; 21.03.2017
comment
Вы правы, чтобы отменить это, вы можете использовать git push -f <remote> HEAD@{1}:<branch> - person Benny; 24.04.2017
comment
К сожалению, я использую --hard, и мои файлы удаляются! Я сначала не проверял комментарий, потому что он свернут. Не используйте --hard, если не знаете, что делаете! - person anonymous; 19.08.2018

Самый простой способ отменить последнюю фиксацию -

git reset HEAD^

Это приведет к состоянию проекта до того, как вы совершите фиксацию.

person Community    schedule 10.12.2018

Вот сайт: Oh shit, git!.

Вот много рецептов, как отменить что-то в Git. Некоторые из них:

Вот дерьмо, мне нужно изменить сообщение при последней фиксации!

git commit --amend
# follow prompts to change the commit message

Вот дерьмо, я случайно передал мастеру кое-что, что должно было быть в совершенно новой ветке!

# Create a new branch from the current state of master
git branch some-new-branch-name
# Remove the commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# Your commit lives in this branch now :)
person Community    schedule 28.02.2018

Для полноты я приведу один явно очевидный метод, который был упущен из виду в предыдущих ответах.

Поскольку фиксация не была нажата, пульт не изменился, поэтому:

  1. Удалите локальный репозиторий.
  2. Клонируйте удаленный репозиторий.

Это иногда необходимо, если ваш модный клиент Git уходит. (например, non-fast-forward ошибок)

Не забудьте повторно зафиксировать свои сохраненные изменения с момента последнего нажатия.

person Community    schedule 27.06.2017

Просто используйте git reset --hard <last good SHA>, чтобы сбросить ваши изменения и дать новую фиксацию. Вы также можете использовать git checkout -- <bad filename>.

person Community    schedule 29.05.2016

Ссылка: Как отменить последнюю фиксацию в Git?

Если у вас установлены расширения Git, вы можете легко отменить / отменить любую фиксацию (вы можете загрузить расширения git с здесь).

Откройте Git Extensions, щелкните правой кнопкой мыши фиксацию, которую вы хотите отменить, и выберите «Отменить фиксацию».

Снимок экрана Git Extensions

Откроется всплывающее окно (см. Снимок экрана ниже).

«Всплывающее

Выберите «Автоматически создавать фиксацию», если вы хотите напрямую зафиксировать отмененные изменения или если вы хотите вручную зафиксировать отмененные изменения, не устанавливайте флажок и нажмите кнопку «Вернуть эту фиксацию».

person Community    schedule 30.03.2017

ГОЛОВА:

Перед сбросом фиксации мы должны знать о HEAD ... HEAD - это не что иное, как ваше текущее состояние в вашем рабочем каталоге. Он представлен номером фиксации.

Git commit:

Каждое изменение, назначенное в рамках фиксации, представлено уникальным тегом. Коммиты не могут быть удалены. Так что, если вам нужна последняя фиксация, вы можете просто погрузиться в нее, используя git reset.

Вы можете погрузиться в последний коммит двумя способами:

Метод 1: (если вы не знаете номер фиксации, но хотите перейти к самому первому)

git reset HEAD~1  # It will move your head to last commit

Метод 2: (если вы знаете фиксацию, вы просто сбрасываете ее на известную фиксацию)

git reset 0xab3 # Номер фиксации

Примечание. если вы хотите узнать о недавней фиксации, попробуйте git log -p -1

Вот графическое представление:

Введите описание изображения здесь

person Community    schedule 18.07.2017

Чтобы удалить некоторые файлы из фиксации Git, используйте команду «git reset» с параметром «–soft» и укажите фиксацию перед HEAD.

$ git reset --soft HEAD~1

При запуске этой команды вам будут представлены файлы из самой последней фиксации (HEAD), и вы сможете их зафиксировать.

Теперь, когда ваши файлы находятся в промежуточной области, вы можете удалить их (или отключить их), снова используя команду «git reset».

$ git reset HEAD <file>

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

Если вас просто больше не интересует этот файл, вы можете использовать команду «git rm», чтобы удалить файл из индекса (также называемого промежуточной областью).

$ git rm --cached <file>

Когда вы закончите с модификациями, вы можете просто снова зафиксировать их с помощью опции «–amend».

$ git commit --amend

Чтобы убедиться, что файлы были правильно удалены из репозитория, вы можете запустить команду «git ls-files» и убедиться, что файл не отображается в файле (если он, конечно, новый).

$ git ls-files

 <file1>
 <file2>

Удаление файла из фиксации с помощью Git Restore

Начиная с Git 2.23, появился новый способ удаления файлов из фиксации, но вам нужно будет убедиться, что вы используете версию Git выше или равную 2.23.

$ git --version

Git версии 2.24.1

Примечание: Git 2.23 был выпущен в августе 2019 года, и у вас может не быть этой версии на вашем компьютере.

Чтобы установить более новые версии Git, вы можете проверить это руководство. Чтобы удалить файлы из коммитов, используйте команду «git restore», укажите источник с помощью опции «–source» и файл, который нужно удалить из репозитория.

Например, чтобы удалить файл с именем «myfile» из HEAD, вы должны написать следующую команду

$ git restore --source=HEAD^ --staged  -- <file>

В качестве примера представим, что вы редактировали файл в своей последней фиксации в своей «основной» ветке.

Файл зафиксирован правильно, но вы хотите удалить его из репозитория Git.

Чтобы удалить файл из репозитория Git, вам нужно сначала восстановить его.

$ git restore --source=HEAD^ --staged  -- newfile

$ git status

В ветке master

Ваша ветка опережает origin / master на 1 коммит. (используйте git push для публикации ваших локальных коммитов)

Изменения, которые необходимо зафиксировать:

 (use "git restore --staged <file>..." to unstage)
    modified:   newfile

Изменения, не предназначенные для фиксации:

 (use "git add <file>..." to update what will be committed)
 (use "git restore <file>..." to discard changes in working directory)
      modified:   newfile

Как видите, ваш файл вернулся в область подготовки.

Оттуда у вас есть два варианта: вы можете изменить свой файл, чтобы повторно зафиксировать его, или просто удалить его из своего репозитория Git.

Удалить файл из репозитория Git

В этом разделе мы собираемся описать шаги, чтобы удалить файл из вашего репозитория Git.

Во-первых, вам нужно деактивировать файл, так как вы не сможете удалить его, если он поставлен.

Чтобы отключить файл, используйте команду «git reset» и укажите HEAD в качестве источника.

$ git reset HEAD newfile

Если ваш файл правильно не настроен, используйте команду «git rm» с параметром «–cached», чтобы удалить этот файл из индекса Git (это не приведет к удалению файла на диске).

$ git rm --cached newfile

rm 'новый файл'

Теперь, если вы проверите статус репозитория, вы увидите, что Git произвел фиксацию удаления.

$ git status

В ветке master

Ваша ветка опережает origin / master на 1 коммит. (используйте git push для публикации ваших локальных коммитов)

Изменения, которые необходимо зафиксировать:

 (use "git restore --staged <file>..." to unstage)
    deleted:    newfile

Теперь, когда ваш файл подготовлен, просто используйте «git commit» с опцией «–amend», чтобы внести поправки в самую последнюю фиксацию из вашего репозитория.

`$ git commit --amend

 [master 90f8bb1] Commit from HEAD
  Date: Fri Dec 20 03:29:50 2019 -0500
  1 file changed, 2 deletions(-)
  delete mode 100644 newfile

`Как видите, это не создаст новую фиксацию, но существенно изменит самую последнюю фиксацию, чтобы включить ваши изменения.

Удаление определенного файла из фиксации Git

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

Чтобы удалить определенный файл из фиксации Git, используйте команду «git reset» с параметром «–soft», укажите фиксацию перед HEAD и файл, который вы хотите удалить.

$ git reset HEAD^ -- <file>

Когда вы закончите с изменениями, ваш файл вернется в область подготовки.

Во-первых, вы можете удалить файл из промежуточной области с помощью команды «git reset» и указать, что вы хотите выполнить сброс из HEAD.

$ git reset HEAD <file>

Примечание: это не означает, что вы потеряете изменения в этом файле, просто файл будет удален из промежуточной области.

Если вы хотите полностью удалить файл из индекса, вам нужно будет использовать команду «git rm» с параметром «–cached».

$ git reset HEAD <file>

Чтобы убедиться, что ваш файл был правильно удален из области подготовки, используйте команду «git ls-files» для вывода списка файлов, принадлежащих к индексу.

$ git ls-files

Когда вы полностью закончите свои модификации, вы можете исправить коммит, из которого вы удалили файлы, используя команду «git commit» с опцией «–amend».

$ git commit --amend
person Community    schedule 22.11.2020
comment
В чем разница между использованием git rm file` and git checkout file`? - person Maf; 11.03.2021

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

Если вам нужно отбросить самую верхнюю фиксацию, тогда поможет следующий однострочный

git rebase --onto HEAD~1 HEAD

Но если вы хотите отказаться от одного из многих коммитов, вы сказали

а -> б -> в -> г -> мастер

и вы хотите отказаться от фиксации 'c'

git rebase --onto b c

Это сделает 'b' новой базой 'd', исключив 'c'

person Community    schedule 22.05.2018

В IntelliJ IDEA вы можете просто открыть журнал репозитория Git, нажав Alt + 9, щелкнув правой кнопкой мыши по тегу из списка коммитов и выбрав: " Сбросить текущую ветку сюда ... ".

person Community    schedule 20.06.2017

git reset --soft HEAD~1

git status

Выход

На главном узле ветки
Ваша ветка опережает origin / master на 1 фиксацию.
(используйте git push для публикации локальных коммитов)

Изменения, которые необходимо зафиксировать:
(используйте git restore --staged ... для отмены постановки) новый файл: file1

git log --oneline --graph

Выход

  • 90f8bb1 (HEAD - ›master) Вторая фиксация \
  • 7083e29 Первоначальная фиксация репозитория \
person Community    schedule 17.04.2020

Чтобы отменить последнюю локальную фиксацию, не выбрасывая ее изменения, у меня есть этот удобный псевдоним в ~/.gitconfig

[alias]
  undo = reset --soft HEAD^

Затем я просто использую git undo, который очень легко запомнить.

person Community    schedule 23.10.2019

Найдите хэш-код последней фиксации, просмотрев журнал:

git log

потом

git reset <the previous co>
person Community    schedule 03.06.2017

введите описание изображения здесь

Предполагая, что вы работаете в Visual Studio, если вы войдете в историю веток и посмотрите все свои коммиты, просто выберите событие перед фиксацией, которое вы хотите отменить, щелкните его правой кнопкой мыши и выберите Revert. Как это просто.

person Community    schedule 15.11.2016

Замените вашу локальную версию, включая ваши изменения, версией сервера. Эти две строки кода заставят Git извлечь и перезаписать локальный.

Откройте командную строку и перейдите в корень проекта Git. Если вы используете Visual Studio, нажмите Команда, Синхронизация и нажмите «Открыть командную строку» (см. Изображение) ниже.

Visual Studio

Оказавшись в командной строке Cmd, выполните следующие две инструкции.

git fetch --all

Тогда ты делаешь

git reset --hard origin/master

Это заменит существующую локальную версию версией на сервере Git.

person Community    schedule 10.02.2019

Я проверяю предложенный эффективный метод, и вот конкретный пример его использования:

Если вы хотите навсегда отменить / отменить свою последнюю фиксацию (и так далее, одну за другой, столько, сколько хотите), три шага:

1: Получите id = SHA коммита, с которым вы, конечно, хотите прийти.

$ git log

2: Удалите предыдущую фиксацию с помощью

$ git reset --hard 'your SHA'

3: Заставить новую локальную историю на вашем исходном GitHub с параметром -f (последний трек фиксации будет удален из истории GitHub)

$ git push origin master -f

Пример

$ git log

(Последняя фиксация для отмены :)

commit e305d21bdcdc51d623faec631ced72645cca9131 (HEAD -> master, origin/master, origin/HEAD)
Author: Christophe <[email protected]>
Date:   Thu Jul 30 03:42:26 2020 +0200

U2_30 S45; updating files package.json & yarn.lock for GitHub Web Page from docs/CV_Portfolio...

(Зафиксируйте, что мы хотим сейчас на HEAD :)

commit 36212a48b0123456789e01a6c174103be9a11e61
Author: Christophe <[email protected]>
Date:   Thu Jul 30 02:38:01 2020 +0200

First commit, new title

Достигните фиксации раньше, удалив последнюю

$ git reset --hard 36212a4

HEAD is now at 36212a4 First commit, new title

Проверить все в порядке

$ git log

commit 36212a48b0123456789e01a6c174103be9a11e61 (HEAD -> master)
Author: Christophe <[email protected]>
Date:   Thu Jul 30 02:38:01 2020 +0200

    First commit, new title

$ git status

On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
 (use "git pull" to update your local branch)

nothing to commit, working tree clean

Обновите свою историю в Git (Hub)

$ git push origin master -f

Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/ GitUser bla bla/React-Apps.git
 + e305d21...36212a4 master -> master (forced update)

Проверить все в порядке

$ git status

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

= ›Готово! :)

person Community    schedule 31.07.2020

Попробуйте это, выполните полный сброс до предыдущей фиксации, в которую эти файлы не были добавлены, а затем:

git reset --hard <commit_hash>

Убедитесь, что у вас есть резервная копия ваших изменений на всякий случай, так как это полный сброс, что означает, что они будут потеряны (если вы не спрятали ранее)

person Community    schedule 17.04.2018

Если вы хотите удалить неправильные файлы, вам следует сделать

git reset --soft <your_last_good_commit_hash_here> Здесь, если вы сделаете git status, вы увидите файлы в промежуточной области. Вы можете выбрать неправильные файлы и удалить их из области подготовки.

Как следующее.

git reset wrongFile1 wrongFile2 wrongFile3

Теперь вы можете просто добавить файлы, которые вам нужно отправить,

git add goodFile1 goodFile2

совершить их

git commit -v or git commit -am "Message"

и толкнуть

git push origin master

Однако, если вас не интересуют измененные файлы, вы можете выполнить полный сброс до предыдущей хорошей фиксации и отправить все на сервер.

by

git reset --hard <your_last_good_commit_hash_here>

git push origin master

Если вы уже опубликовали неправильные файлы на сервере, вы можете использовать флаг --force для отправки на сервер и редактирования истории.

git push --force origin master

person Community    schedule 16.03.2017

Я писал об этом много лет назад после того, как сам столкнулся с такими же проблемами:

Как удалить / отменить фиксацию Git

В основном вам просто нужно сделать:

git log, получите первые семь символов хэша SHA, а затем выполните git revert <sha>, за которым следует git push --force.

Вы также можете отменить это, используя команду Git revert следующим образом: git revert <sha> -m -1, а затем git push.

person Community    schedule 08.07.2019

Что я делаю каждый раз, когда мне нужно отменить фиксацию / коммиты:

  1. git reset HEAD~<n> // количество последних коммитов, которые мне нужно отменить
  2. git status // необязательно. Все файлы теперь красные (неустановленные).

  3. Теперь я могу добавить и зафиксировать только те файлы, которые мне нужны:

    • git add <file names> & git commit -m "message" -m "details"
  4. Optional: I can rollback the changes of the rest files, if i need, to their previous condition, with checkout:
    • git checkout <filename>
  5. if i had already pushed it to remote origin, previously:
    • git push origin <branch name> -f // use -f to force the push.
person Community    schedule 16.09.2018

Если вы хотите отменить самую первую фиксацию в своем репо

Вы столкнетесь с этой проблемой:

$ git reset HEAD~
fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Ошибка возникает из-за того, что если последняя фиксация является исходной фиксацией (или без родителей) репозитория, HEAD ~ отсутствует.

Решение

Если вы хотите сбросить единственную фиксацию в ветке master

$ git update-ref -d HEAD
$ git rm --cached -r .
person Community    schedule 24.09.2018

Получите идентификатор последнего коммита с помощью этой команды (в журнале один вверху он самый последний):

git log

Получите идентификатор фиксации (GUID) и выполните эту команду:

git revert <commit_id>
person Community    schedule 12.11.2018
comment
В чем разница с ответом @JacoPretorius? - person Rémi P; 21.11.2018

Как редактировать более раннюю фиксацию

Как правило, я не хочу отменять кучу коммитов, а скорее отредактирую более раннюю фиксацию так, как мне хотелось бы, чтобы я ее совершил в первую очередь.

Я обнаружил, что исправляю прошлый коммит достаточно часто, поэтому написал для него сценарий.

Вот рабочий процесс:

  1. git commit-edit <commit-hash>
    

    Это приведет вас к фиксации, которую вы хотите отредактировать.

    Изменения фиксации будут не поэтапными, готовыми к постановке, как вы хотите, чтобы это было в первый раз.

  2. Исправьте и выполните фиксацию так, как вы хотите, чтобы она была изначально.

    (Вы можете использовать git stash save --keep-index, чтобы удалить все файлы, которые вы не фиксируете)

  3. Повторите фиксацию с помощью --amend, например:

    git commit --amend
    
  4. Завершите перебазирование:

    git rebase --continue
    

Назовите это следующее git-commit-edit и поместите в свой $PATH:

#!/bin/bash

# Do an automatic git rebase --interactive, editing the specified commit
# Revert the index and working tree to the point before the commit was staged
# https://stackoverflow.com/a/52324605/5353461

set -euo pipefail

script_name=${0##*/}

warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "$@"; exit 1; }

[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"

# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")

# Be able to show what commit we're editing to the user
if git config --get alias.print-commit-1 &>/dev/null; then
  message=$(git print-commit-1 "$commit")
else
  message=$(git log -1 --format='%h %s' "$commit")
fi

if [[ $OSTYPE =~ ^darwin ]]; then
  sed_inplace=(sed -Ei "")
else
  sed_inplace=(sed -Ei)
fi

export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed

echo
echo "Editing commit: $message" >&2
echo
person Community    schedule 27.09.2018

Вы можете использовать git revert <commit-id>.

А для получения идентификатора фиксации просто используйте git log.

person Community    schedule 23.05.2019

git revert commit

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

https://git-scm.com/docs/git-revert

person Community    schedule 03.09.2018

$ git commit -m 'Initial commit'
$ git add forgotten_file
$ git commit --amend

Важно понимать, что, когда вы вносите поправки в свою последнюю фиксацию, вы не столько ее исправляете, сколько полностью заменяете ее новой, улучшенной фиксацией, которая вытесняет старую фиксацию и помещает новую фиксацию на свое место. Фактически, это выглядит так, как будто предыдущей фиксации никогда не было, и она не будет отображаться в истории вашего репозитория.

Очевидная ценность изменения коммитов - внести незначительные улучшения в вашу последнюю фиксацию, не загромождая историю вашего репозитория сообщениями фиксации в форме «Упс, забыл добавить файл» или «Черт, исправляем опечатку в последней фиксации».

2.4 Основы Git - отмена действий < / em>

person Community    schedule 03.09.2020
comment
Что, если бы мы хотели вернуть один файл? - person Maf; 11.03.2021

Самый простой способ:

$ git reset --soft HEAD~1

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

person Community    schedule 20.04.2021
comment
Я запускаю эту команду git reset, а затем просто принудительно нажимаю на свою ветку следующим образом: git push upstream head -f После этого фиксация исчезла. - person alakin_11; 20.05.2021

Если вы просто хотите удалить все свои локальные изменения / коммиты и сделать вашу локальную ветку похожей на исходную ветку, с которой вы начали ...

git reset --hard origin/branch-name

person Community    schedule 29.11.2018

Обычно я сначала нахожу хэш моей недавней фиксации:

git log

Выглядит это так: commit {long_hash}

Скопируйте этот long_hash и сбросьте его (вернитесь к тем же файлам / состоянию, которые были при этом коммите):

git reset --hard {insert long_hash without braces}
person Community    schedule 01.01.2021
comment
Обратите внимание, что опция --hard отменяет все изменения, не позволяя нам удалять только некоторые файлы. - person Maf; 11.03.2021

Если репозиторий был зафиксирован локально и еще не отправлен на сервер, другим грубым / непрофессиональным способом решения этой проблемы будет:

  1. Git клонирует репозиторий в другое место.
  2. Скопируйте модификации (файлы / каталоги) из исходного репозитория в этот новый. Затем зафиксируйте и нажмите с изменениями из нового.
  3. Замените старый репозиторий новым.
person Community    schedule 06.01.2021

git reset HEAD@{n} сбросит ваши последние n действий.

Для сброса, для последнего действия используйте git reset HEAD@{1}.

person Community    schedule 17.11.2020

#1) $ git commit -m "Something terribly misguided" 
#2) $ git reset HEAD~                              

[редактировать файлы по мере необходимости]

 #3) $ git add .
#4) $ git commit -c ORIG_HEAD  
person Community    schedule 16.07.2021

Visual Studio Code делает это очень просто.

Код VS

person Community    schedule 11.06.2021
comment
И это не было охвачено одним из предыдущих 151 ответов (не риторический вопрос)? (Включая удаленные ответы). В любом случае вы можете составить (аннотированный) список ссылок на похожие ответы (например, 152 ответа (включая удаленный ответ), так как 6 длинных длинных страниц затрудняют навигацию), чтобы упростить навигацию - скажем, те, которые содержат решения, использующие Код Visual Studio. (30 синонимов кода Visual Studio Code на данный момент обнаружены в дикой природе.) - person Peter Mortensen; 24.06.2021
comment
Нет, это не был. - person Kyle Delaney; 24.06.2021

Во-первых, запустите эту команду, чтобы сбросить фиксацию:

git reset --hard HEAD~1

Во-вторых, запустите эту команду, чтобы отправить новую фиксацию:

git push upstream head -f
person Community    schedule 26.05.2021

Вы можете использовать команду git reset unwanted_file с файлом, который не хотите обрабатывать. Используя эту команду, мы можем переместить измененный файл из промежуточной области в рабочий каталог.

Как я могу отменить коммиты в Git локально и удаленно?

person Community    schedule 04.06.2021