Удалить коммит из ветки в Git

Я хотел бы знать, как удалить коммит.

Под delete я подразумеваю, как будто я не сделал этот коммит, и когда я сделаю push в будущем, мои изменения не будут переданы в удаленную ветвь.

Я прочитал справку по git и думаю, что мне нужно использовать команду git reset --hard HEAD. Это правильно?

Ответ 1

Осторожно: git reset --hard УДАЛИТЬ ВАШИ ИЗМЕНЕНИЯ РАБОЧИХ СПРАВОЧНИКОВ. Обязательно занести любые локальные изменения, которые вы хотите сохранить, прежде чем запускать эту команду.

Предполагая, что вы сидите на этом коммите, эта команда будет обмануть его...

git reset --hard HEAD~1

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

Или вы можете посмотреть вывод git log, найти идентификатор фиксации коммита, к которому хотите выполнить резервное копирование, и затем сделать следующее:

git reset --hard <sha1-commit-id>

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

git push origin HEAD --force

Однако, если другие могут его потянуть, вам лучше начать новую ветку. Потому что, когда они потянутся, он просто сольет его в свою работу, и вы снова получите его обратно.

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


FYI - git reset --hard HEAD отлично, если вы хотите избавиться от WORK IN PROGRESS. Он будет reset вернуться к последнему фиксации и удалить все изменения в рабочем дереве и индексе.


Наконец, если вам нужно найти коммит, который вы "удалили", он обычно присутствует в git reflog, если у вас нет мусора, собирающего ваш репозиторий.

Ответ 2

Если вы еще не нажали на коммит, вы можете использовать git rebase -i, чтобы удалить эту фиксацию. Во-первых, узнайте, как далеко назад это фиксация (приблизительно). Затем выполните:

git rebase -i HEAD~N

~N означает переустановку последних N commits (N должно быть числом, например HEAD~10). Затем вы можете отредактировать файл, который Git представляет вам, чтобы удалить оскорбительную фиксацию. При сохранении этого файла Git будет переписывать все следующие коммиты, как если бы тот, который вы удалили, не существовал.

В книге Git есть хороший раздел для перезагрузки с картинками и примерами.

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

Ответ 3

Другая возможность - одна из моих личных любимых команд:

git rebase -i <commit>~1

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

Ответ 4

Я добавляю этот ответ, потому что не понимаю, почему кто-то, кто только что пытался выполнить работу, захочет удалить всю эту работу из-за некоторой ошибки с помощью Git!

Если вы хотите сохранить свою работу и просто "отменить" эту команду commit (вы поймали до нажатия на репо):

git reset --soft HEAD~1

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

Ответ 5

Удаление целой фиксации

git rebase -p --onto SHA^ SHA

Очевидно, замените "SHA" ссылкой, с которой вы хотите избавиться. "^" В этой команде является буквальным.

http://sethrobertson.github.io/GitFixUm/fixup.html

Ответ 6

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

$ git reset --hard HEAD^

(обратите внимание, что это также устранит все незафиксированные изменения, используйте с осторожностью).

Если вы уже опубликовали commit-to-be-commit, используйте git revert

$ git revert HEAD

Ответ 7

git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId ссылается на тот, который вы хотите вернуть назад к

Ответ 8

Принудительно изменить историю

Предполагая, что вы не хотите просто удалить последний коммит, но хотите удалить определенные коммиты из последних n коммитов, перейдите к:

git rebase -i HEAD~<number of commits to go back>, поэтому git rebase -i HEAD~5 если вы хотите увидеть последние пять коммитов.

Затем в текстовом редакторе измените pick слова, чтобы он drop рядом с каждым коммитом, который вы хотите удалить. Сохраните и выйдите из редактора. Вуаля!

История изменений

Попробуйте git revert <commit hash>. Revert создаст новый коммит, который отменяет указанный коммит.

Ответ 9

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

git reset HEAD~1

Это приведет к возврату вашего репозитория до его состояния перед командами git add, которые устраивают файлы. Ваши изменения будут в вашем рабочем каталоге. HEAD ~ 1 относится к фиксации ниже текущего наконечника ветки.

Если вы хотите разблокировать N коммитов, но сохраните изменения кода в своем рабочем каталоге:

git reset HEAD~N

Если вы хотите избавиться от своей последней фиксации и не хотите сохранять изменения кода, вы можете сделать "жесткий" reset.

git reset --hard HEAD~1

Аналогично, если вы хотите отменить последние N коммиттов и не хотите, чтобы изменения кода менялись:

git reset --hard HEAD~N

Ответ 10

Скажем, мы хотим удалить коммиты 2 и 4 из репо.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Примечание. Вам необходимо иметь права администратора для репо, поскольку вы используете --hard и -f.

  • git checkout b3d92c5 Оформить последний использованный коммит.
  • git checkout -b repair Создайте новую ветку для работы.
  • git cherry-pick 77b9b82 Запустить коммит 3.
  • git cherry-pick 2c6a45b Запустить коммит 1.
  • git checkout master Checkout Master Checkout Master.
  • git reset --hard b3d92c5 Сброс мастера до последней используемой фиксации.
  • git merge repair Объединить нашу новую ветку на master.
  • git push -f origin master Нажмите мастер для удаленного репо.

Ответ 11

git rebase -i HEAD~2

Здесь '2' - количество коммитов, которые вы хотите переустановить.

'git rebase -i HEAD`

если вы хотите переустановить все коммиты.

Затем вы сможете выбрать один из этих вариантов.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

Эти строки могут быть переупорядочены; они выполняются сверху вниз.  Если вы удалите строку здесь, то КОМИТЕТ БУДЕТ ПОТЕРЯТЬ.  Однако, если вы удалите все, rebase будет прерван.  Обратите внимание, что пустые коммиты закомментированы

Вы можете просто удалить эту фиксацию с помощью опции "d" или "Удалить строку с вашей фиксацией".

Ответ 12

Чтобы удалить в локальной ветке, используйте

git reset --hard HEAD~1

Для удаления в удаленной ветки используйте

git push origin HEAD --force

Ответ 13

Вот еще один способ сделать это:

Зарезервируйте ветку, которую вы хотите вернуть, затем reset ваша локальная рабочая копия обратно к фиксации, которую вы хотите быть последним на удаленном сервере (все после того, как оно пройдет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши на выбранном "Reset BRANCHNAME" для этого фиксации ". Я думаю, что в командной строке:

git reset --hard COMMIT_ID

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

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

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

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

Ответ 14

Ошибка:

Я git rebase -i --root моей ветки, по незнанию думая, что могу перефразировать первый коммит, отличный от основного (представление по умолчанию GitHub для Windows - это сравнение с master, скрывая его целиком).

Я отрастил бороду в Силиконовой долине, в то время как коммиты 900+ погрузились в Sublime. Выйдя без изменений, я зарядил батарею, а затем приступил к бритью, поскольку все индивидуальные коммиты 900+ небрежно перезагружены - сбрасывая время их фиксации до настоящего времени.

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

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

Исчерпывающие возможности:

Я не хотел, чтобы git revert - это создавало бы дополнительный коммит, давая Git преимущество.

git reset --hard HEAD ничего не сделал, после проверки reflog последний и единственный HEAD был клоном - Git выигрывает.

Чтобы получить самый последний SHA, я проверил удаленный репозиторий на github.com - незначительный выигрыш.

git reset --hard <SHA> что git reset --hard <SHA> сработал, я обновил другую ветку до master и 1... 2... poof! коммит вернулся - Гит побеждает.

Возвращаясь к мастеру, пора попробовать git rebase -i <SHA>, затем удалите строку... безрезультатно, к сожалению. "Если вы удалите строку здесь, то этот коммит будет потерян". Ах... в новой заметке о тролле n00b в примечаниях к выпуску 2.8.3.

Решение:

git rebase -i <SHA> затем d, drop = remove commit.

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

https://twitter.com/holman/status/706006896273063936

Хороший день для тебя.

Ответ 15

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

Я думаю, что нет никаких средств для удаления фиксации с помощью фарфоровых команд. Единственный способ - удалить его из журнала и reflog, а затем выполнить git prune --expire -now.

Ответ 16

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

git commit --amend -m "New message here"

Если у вас есть новые поэтапные изменения, они будут объединены с последним фиксатором (который вы пытаетесь избавиться) и замените это commit.

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

Вы также можете передать параметр "-no-edit" вместо "-m", если вы предпочитаете использовать предыдущее сообщение фиксации.

Docs: http://git-scm.com/docs/git-commit.html

Ответ 17

Если вы хотите сохранить историю, показывая фиксацию и возврат, вы должны использовать:

git revert GIT_COMMIT_HASH

введите сообщение, объясняющее, почему вы возвращаетесь, и затем:

git push  

Когда вы выдаете git log, вы увидите как "неправильную" фиксацию, так и возврат сообщений журнала.

Ответ 18

Источник: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Удалить последний коммит

Например, ваш последний коммит

git push origin +aa61ab32 ^: мастер

Теперь вы хотите удалить этот коммит, затем простой способ сделать следующее

меры

  1. Сначала сбросьте ветвь к родителю текущего коммита

  2. Сила-толкни его на пульт.

git reset HEAD^ --hard

git push origin -f

Для конкретного коммита вы хотите сбросить следующее

git reset bb676878^ --hard

git push origin -f

Ответ 19

Если вы уже нажали, сначала найдите фиксацию, которую хотите видеть в HEAD ($ GIT_COMMIT_HASH_HERE), затем выполните следующее:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Затем каждое место клонирования repo запускается:

git reset --hard origin/master

Ответ 20

То, что я делаю обычно, когда я совершаю и толкаю (если кто-то толкнул его фиксацию, это решит проблему):

git reset --hard HEAD~1

git push -f origin

надеюсь, что эта помощь

Ответ 21

Сброс на локальный филиал

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Принудительный толчок к началу

git push -f origin

Ответ 22

Сделайте резервную копию вашего кода во временную папку. Следующая команда будет сброшена так же, как сервер.

git reset --hard HEAD
git clean -f
git pull

Если вы хотите сохранить свои изменения и удалить последние коммиты

git reset --soft HEAD^
git pull

Ответ 23

Я уже подтолкнул. Нужно вернуть некоторые коммиты обратно удаленно. Перепробовал много вариантов, но только это от Джастина через git bush работает нормально для меня:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Ответ 24

git reset --hard

git push origin HEAD --force

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

Ответ 25

delete local commit

Как вы можете видеть на изображении выше, я хочу удалить возвращенную фиксацию "test change 2" (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (вы можете получить идентификатор SHA1 с помощью команды gitk в git bash)).

Для этого я могу использовать (все нижеприведенные команды работают только на локальных. Вам нужно нажать после удаления):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2//он git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 резервную копию этого коммита (ID SHA1 для теста с изменением 4 коммита 515b5220c50e3dfbb1063f23789d92ae1d3481a2)
  2. git reset --hard HEAD~1//git reset --hard HEAD~1 резервную копию перед одним коммитом.
  3. git reset --hard HEAD^//Удалить последний коммит из git

после удаления:

after delete commit

Ответ 27

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

Ответ 28

использовать git revert https://git-scm.com/docs/git-revert. Он вернет весь код, после чего вы сможете сделать следующее commit.Then head укажет на это последнее совершение. reverted commit никогда не удаляется, но это не повлияет на вашу последнюю фиксацию.

Ответ 29

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

  • войдите в исходный каталог и сделайте резервную копию своего кода с помощью команды:

    tar czvf code.tgz *

  • отобразите список git commit с помощью команды:

    git log

  • получить "sha1-commit-id" фиксации под нежелательной фиксацией, это идентификатор фиксации до вашего (журнал git содержит список последних коммитов первая)

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

    git reset --hard "sha1-commit-id"

    * вы можете проверить, что вы сделали это правильно, выполнив команду анотера git log <* >

  • верните свой незаданный код с помощью команды:

    tar xzvf code.tgz

Команды tar используются для того, чтобы убедиться, что ваша тяжелая работа не будет стерта по ошибке, так как команда git reset удалит изменения вашего рабочего каталога, так что шаги 1 и 5 используются для хранения локальных изменений.