Я хотел бы знать, как удалить коммит.
К delete
, я имею в виду, как если бы я не делал , что совершал, и когда я делаю толчок в будущем, мои изменения не будет толкать к удаленной ветви.
Я прочитал git help и думаю, что команда, которую я должен использовать, - это git reset --hard HEAD
. Это правильно?
git
git-rebase
git-reset
hap497
источник
источник
cherry-pick
иdelete
один коммит , который мог произойти некоторое время назад.git rebase -i HEAD~10
действительно отвечает на вопрос, так как позволяет произвольно выбирать коммиты для удаления. Git применяет коммиты в указанном вами диапазоне один за другим, игнорируя коммиты, которые вы удалили из журнала. Я использовал эту команду сегодня, чтобы избавиться от второго и третьего последних коммитов в моем репо, сохранив при этом верхний. Я согласен, что ни один из других ответов не является удовлетворительным.Ответы:
Осторожно:
git reset --hard
УДАЛИТ ВАШИ РАБОЧИЕ СПРАВОЧНИКИ ИЗМЕНЕНИЯ . Обязательно сохраните все локальные изменения, которые вы хотите сохранить, перед запуском этой команды.Предполагая, что вы сидите на этом коммите, эта команда испортит его ...
В
HEAD~1
означает , что совершить , прежде чем голова.Или вы можете просмотреть выходные данные
git log
, найти идентификатор коммита коммита, на который вы хотите создать резервную копию, и затем сделать это:Если вы уже нажали, вам нужно будет сделать принудительный толчок, чтобы избавиться от него ...
Тем не менее , если другие его вытянули, вам лучше начать новую ветку. Потому что, когда они потянут, это просто объединит их с их работой, и вы снова подтолкнете их вверх.
Если вы уже нажали, может быть лучше использовать
git revert
для создания фиксации «зеркального отображения», которая отменит изменения. Тем не менее, обе фиксации будут в журнале.К вашему сведению -
git reset --hard HEAD
это здорово, если вы хотите избавиться от РАБОТЫ В ПРОГРЕССЕ. Он вернет вас к самому последнему коммиту и сотрет все изменения в вашем рабочем дереве и индексе.И наконец, если вам нужно найти коммит, который вы «удалили», он обычно присутствует,
git reflog
если вы не собрали мусор в своем хранилище.источник
HEAD~1
или простоHEAD^
. Если вы нажали, вы должны использоватьgit revert
вместо этого.HEAD~n
для «возврата»n
коммиты из своей головы. Может быть, с этого момента вы можете интерпретировать... --hard HEAD
какHEAD~0
=> удаление незавершенного производства.reset --hard
, и проверьтеlog --oneline --all
, коммиты все еще остаются в дереве. Как мы удаляем эти коммиты из дерева? Спасибо.reset --soft
для удаления локального коммита БЕЗ возврата к текущей работе!Если вы еще не отправили коммит, вы можете использовать его
git rebase -i
для удаления. Во-первых, выясните, насколько далеко назад находится этот коммит (приблизительно). Затем сделайте:В
~N
средства перебазироваться последниеN
коммиты (N
должен быть числом, напримерHEAD~10
). Затем вы можете отредактировать файл, который Git представляет вам, чтобы удалить оскорбительный коммит. При сохранении этого файла Git перезапишет все следующие коммиты, как если бы тот, который вы удалили, не существовал.В Git Book есть хороший раздел о перебазировании с картинками и примерами.
Будьте осторожны с этим , хотя, потому что если вы что- то изменить , что вы уже толкнули в другом месте, другой подход будет необходим , если вы не планируете делать силы толчка.
источник
push -f
для принудительной отправки и замены удаленной ветви вашей локальной. Если это просто ваше собственное удаленное репо, нет проблем. Беда начинается, если кто-то еще получил за это время.git rebase -i HEAD~5
была именно то , что мне нужно, чтобы полностью удалить этот коммит из моего локального репо! Спасибо!rebase -i
этом изменения, соответствующие удаленному коммиту , не сохраняются.Другая возможность - одна из моих любимых команд:
Это начнёт перебазирование в интерактивном режиме
-i
с того момента, когда вы хотите сделать коммит. Редактор запустит список всех коммитов с тех пор. Удалите строку, содержащую коммит, который вы хотите стереть, и сохраните файл. Rebase выполнит остальную часть работы, удалив только этот коммит и воспроизведя все остальные обратно в журнал.источник
git rebase --continue
git rebase -i HEAD~1
git rebase -i HEAD~1
действительно много почистил репо! Трудно сказать, что именно он сделал, но все выглядит намного аккуратнее. На самом деле немного тревожно.Я добавляю этот ответ, потому что не понимаю, почему кто-то, кто только что попытался зафиксировать работу, захочет удалить всю эту работу из-за какой-то ошибки с помощью Git!
Если вы хотите сохранить свою работу и просто «отменить» эту команду коммита (вы поймали перед тем, как нажать на репо):
Не используйте флаг --hard, если вы не хотите уничтожить вашу работу, выполняемую с момента последнего коммита.
источник
git reset --hard HEAD~1
ваш последний последний коммит будет доступен через reflog (до истечения срока его действия); см. также здесь: gitready.com/intermediate/2009/02/09/…Удаление всего коммита
Очевидно, замените «SHA» ссылкой, от которой вы хотите избавиться. «^» В этой команде буквально.
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
источник
-p, --preserve-merges
Воссоздание коммитов слияния вместо выравнивания истории путем воспроизведения коммитов, которые вводит коммит слияния. Разрешения конфликтов слияния или ручные изменения для слияния коммитов не сохраняются.Если вы не опубликовали изменения, чтобы удалить последний коммит, вы можете сделать
(обратите внимание, что это также удалит все незафиксированные изменения; используйте с осторожностью).
Если вы уже опубликовали коммит для удаления, используйте git revert
источник
tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Скажем, мы хотим удалить коммиты 2 и 4 из репо.
Примечание: вам нужно иметь права администратора на репо, так как вы используете
--hard
и-f
.git checkout b3d92c5
Оформить последний использованный коммит.git checkout -b repair
Создайте новую ветку для работы.git cherry-pick 77b9b82
Запустите коммит 3.git cherry-pick 2c6a45b
Запустите коммит 1.git checkout master
Оформить заказ мастеру.git reset --hard b3d92c5
Сбросьте мастер до последнего используемого коммита.git merge repair
Слей нашу новую ветку на мастера.git push -f origin master
Подтолкните мастера к удаленному репо.источник
git push -f origin master
нет выбора--hard
commit 0
, старшеcommit 1
. Пожалуйста, не могли бы вы сказать мне, почему сначала пробегатьcommit 3
(по черри-пик), а затем мимоcommit 1
? После проверкиb3d92cd
(commit 0
), я бы ожидал вишниcommit 1
, тогдаcommit 3
. Спасибо.PS: CommitId ссылается на тот, который вы хотите вернуть обратно
источник
Принудительно изменить историю
Предполагая, что вы не хотите просто удалить последний коммит, но хотите удалить определенные коммиты из последних n коммитов, перейдите к:
git rebase -i HEAD~<number of commits to go back>
, так чтоgit rebase -i HEAD~5
если вы хотите увидеть последние пять коммитов.Затем в текстовом редакторе измените слово
pick
наdrop
рядом с каждым коммитом, который вы хотите удалить. Сохраните и выйдите из редактора. Вуаля!История изменений
Попробуй
git revert <commit hash>
. Revert создаст новый коммит, который отменяет указанный коммит.источник
drop
Ключевое слово не определено. Чтобы удалить коммит, просто удалите всю строку.Если вы хотите исправить свой последний коммит, вы можете отменить коммит и удалить из него файлы, выполнив:
Это вернет ваш репозиторий в его состояние до того, как команды git add разместили файлы. Ваши изменения будут в вашем рабочем каталоге. HEAD ~ 1 относится к коммиту ниже текущей вершины ветви.
Если вы хотите отменить N коммитов, но сохраните изменения кода в вашем рабочем каталоге:
Если вы хотите избавиться от своего последнего коммита и не хотите сохранять изменения кода, вы можете выполнить «жесткий» сброс.
Аналогично, если вы хотите отменить последние N коммитов и не хотите сохранять изменения кода:
источник
Здесь «2» - это количество коммитов, которые вы хотите перебазировать.
если вы хотите отменить все коммиты.
Тогда вы сможете выбрать один из этих вариантов.
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's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
Эти строки можно переупорядочить; они выполняются сверху вниз. Если вы удалите строку здесь, то этот коммит будет потерян. Однако, если вы удалите все, ребаз будет прерван. Обратите внимание, что пустые коммиты закомментированы
Вы можете просто удалить этот коммит, используя опцию «d» или «Удаление строки с вашим коммитом».
источник
Чтобы удалить в локальной ветке, используйте
Чтобы удалить в удаленной ветке, используйте
источник
[Быстрый ответ]
У вас есть много альтернатив, например:
Альтернатива 1:
Альтернатива 2:
Альтернатива 3:
источник
Источник: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Удалить последний коммит
Например, ваш последний коммит
git push origin + aa61ab32 ^: master
Теперь вы хотите удалить этот коммит, а затем простой способ сделать следующее
меры
Сначала сбросьте ветвь к родителю текущего коммита
Сила-толкни его на пульт.
Для конкретного коммита вы хотите сбросить следующее
источник
Вот еще один способ сделать это:
Извлеките ветку, которую вы хотите вернуть, а затем сбросьте свою локальную рабочую копию обратно на коммит, который вы хотите, чтобы он был последним на удаленном сервере (все после того, как оно пройдет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал «Сбросить BRANCHNAME для этого коммита». Я думаю, что командная строка:
Так как вы только что проверили свою ветку с удаленного компьютера, у вас не будет локальных изменений, чтобы беспокоиться о проигрыше. Но это потеряло бы их, если бы вы сделали.
Затем перейдите в локальный каталог вашего репозитория и выполните следующую команду:
Это удалит все коммиты после текущего в вашем локальном репозитории, но только для этой ветки.
источник
Ошибка:
Я
git rebase -i --root
редактировал свою ветку, не зная, что могу перефразировать первый коммит, отличный от основного (представление по умолчанию GitHub для Windows - это сравнение с основным, скрывающее его целостность).Я отрастил бороду в Силиконовой долине, в то время как 900+ коммитов погрузились в Sublime. Выйдя без изменений, я зарядил батарею, а затем приступил к бритью, так как все 900+ отдельных коммитов небрежно перебазированы - сбрасывая время их фиксации до настоящего времени.
Решив побить Git и сохранить первоначальное время, я удалил этот локальный репозиторий и повторно клонировал с пульта.
Теперь он заново добавил самый последний ненужный коммит к мастеру, который я хотел удалить, поэтому продолжал так.
Исчерпывающие возможности:
Я не хотел
git revert
- это создаст дополнительный коммит, предоставив Git преимущество.git reset --hard HEAD
ничего не сделал, проверивreflog
, последним и единственнымHEAD
был клон - Git побеждает.Чтобы получить самый последний SHA, я проверил удаленный репозиторий на github.com - незначительный выигрыш.
После того, как размышления
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
Хороший день для тебя.
источник
Все вышеперечисленные команды восстанавливают состояние вашего рабочего дерева и индекса, как они были до принятия коммита, но не восстанавливают состояние репозитория. Если вы посмотрите на него, «удаленный» коммит на самом деле не удаляется, он просто не тот, что на кончике текущей ветви.
Я думаю, что нет способа удалить коммит с помощью фарфоровых команд . Единственный способ - удалить его из журнала и reflog, а затем выполнить
git prune --expire -now
.источник
git prune
на самом деле одна из "фарфоровых" команд . Кроме того, редко вы захотите полностью очистить ваш reflog (один из вариантов использования - удалить конфиденциальную информацию из вашего репо, но, как я уже сказал, это редкий случай использования). Чаще всего вы захотите сохранить старые коммиты в reflog на случай, если вам понадобится восстановить данные. См. Pro Git: 9.7 Git Internals - Обслуживание и восстановление данных .Если вы хотите сохранить историю, показывая фиксацию и возврат, вы должны использовать:
введите сообщение, объясняющее, почему вы возвращаетесь, а затем:
При выдаче
git log
вы увидите как «неправильный» коммит, так и возврат сообщений журнала.источник
Если вы только что испортили свой последний коммит (неправильное сообщение, забыли добавить некоторые изменения) и хотите исправить его, прежде чем отправлять в публичный репозиторий, почему бы не использовать:
Если у вас есть новые изменения, они будут объединены с последним коммитом (от которого вы пытаетесь избавиться) и заменит этот коммит.
Конечно, если вы вносите изменения в коммит после его нажатия, вы переписываете историю, поэтому, если вы это сделаете, обязательно поймите последствия.
Вы также можете передать опцию «--no-edit» вместо «-m», если вы предпочитаете использовать сообщение предыдущего коммита.
Документы: http://git-scm.com/docs/git-commit.html
источник
Если вы уже нажали, сначала найдите коммит, которым вы хотите быть в HEAD ($ GIT_COMMIT_HASH_HERE) , а затем выполните следующее:
Затем каждое место, где репозиторий был клонирован, запускается:
источник
Что я обычно делаю, когда я фиксирую и нажимаю (если кто-то нажал на его фиксацию, это решит проблему):
надеюсь, это поможет
источник
Я уже подтолкнул. Нужно вернуть некоторые коммиты обратно удаленно. Перепробовал много вариантов, но только это от Джастина через git bush работает нормально для меня:
источник
Сброс на локальный филиал
Принудительный толчок к началу
источник
Сделайте резервную копию вашего кода во временную папку. Следующая команда будет сброшена так же, как сервер.
Если вы хотите сохранить свои изменения и удалить последние коммиты
источник
Ссылка: Как удалить коммит в git, local и remote
источник
Как вы можете видеть на изображении выше, я хочу удалить возвращенную фиксацию «test change 2» (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (вы можете получить ID SHA1, используя
gitk
команду в git bash)).Для этого я могу использовать (все нижеприведенные команды работают только на локальных. Вам нужно нажать после удаления):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// его обратно вверх , чтобы вы , что совершить (SHA1 идентификатор изменения тест 4 фиксации является 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )git reset --hard HEAD~1
// это резервное копирование перед одним коммитом.git reset --hard HEAD^
// Удалить последний коммит из gitпосле удаления:
источник
git reset --hard HEAD~1
Вы будете теперь в предыдущей главе. Потяните ветку. Нажмите новый код. Коммит будет удален из Git
источник
git reset --hard
git push origin HEAD --force
Если один или несколько коммитов помечены, сначала удалите тег (ы). В противном случае помеченный коммит не удаляется.
источник
используйте git revert https://git-scm.com/docs/git-revert. Он вернет весь код, после чего вы сможете сделать следующий коммит. Затем глава укажет на этот последний коммит. отмененные коммиты никогда не удаляются, но это не повлияет на ваш последний коммит.
источник
В моем случае, мой магический код для этой цели:
Проверьте это и скажите мне. Я пробовал несколько разных, но этот был единственным, который помог мне.
источник