Удалить коммиты из ветки в Git
Я хотел бы знать, как удалить коммит.
От delete
Я имею в виду, как будто я не сделал этот коммит, и когда я сделаю push в будущем, мои изменения не будут переданы в удаленную ветвь.
Я читаю git help и думаю, что команда, которую я должен использовать, git reset --hard HEAD
, Это правильно?
39 ответов
Осторожный: 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
, чтобы создать "зеркальное отображение" коммит, который отменит изменения. Тем не менее, обе фиксации будут в журнале.
К вашему сведению - git reset --hard HEAD
отлично, если вы хотите избавиться от РАБОТЫ В ПРОГРЕССЕ. Это вернет вас к самому последнему коммиту и сотрет все изменения в вашем рабочем дереве и индексе.
Наконец, если вам нужно найти коммит, который вы "удалили", он обычно присутствует в git reflog
если у вас нет мусора, собранного в вашем хранилище.
Если вы еще не выдвинули коммит, вы можете использовать git rebase -i
удалить этот коммит. Во-первых, выясните, насколько далеко назад находится этот коммит (приблизительно). Затем сделайте:
git rebase -i HEAD~N
~N
значит перебазировать последний N
совершает (N
должно быть число, например HEAD~10
). Затем вы можете отредактировать файл, который Git представляет вам, чтобы удалить оскорбительный коммит. При сохранении этого файла Git перезапишет все следующие коммиты, как если бы тот, который вы удалили, не существовал.
В Git Book есть хороший раздел о перебазировании с картинками и примерами.
Но будьте осторожны с этим, потому что если вы измените что-то, что вы нажали в другом месте, вам понадобится другой подход, если вы не планируете сделать принудительный толчок.
Другая возможность - одна из моих любимых команд:
git rebase -i <commit>~1
Это запустит ребаз в интерактивном режиме -i
в момент перед коммитом, который вы хотите ударить. Редактор запустит список всех коммитов с тех пор. Удалите строку, содержащую коммит, который вы хотите стереть, и сохраните файл. Rebase выполнит остальную часть работы, удалив только этот коммит и воспроизведя все остальные обратно в журнал.
Я добавляю этот ответ, потому что я не понимаю, почему любой, кто только что попытался зафиксировать работу, захочет удалить всю эту работу из-за какой-то ошибки с помощью Git!
Если вы хотите сохранить свою работу и просто "отменить" эту команду коммита (вы поймали перед тем, как нажимать на репо):
git reset --soft HEAD~1
Не используйте флаг --hard, если вы не хотите уничтожить вашу работу, выполняемую с момента последнего коммита.
Удаление всего коммита
git rebase -p --onto SHA^ SHA
Очевидно, замените "SHA" ссылкой, от которой вы хотите избавиться. "^" В этой команде буквально.
Скажем, мы хотим удалить коммиты 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
Оформить заказ мастеру.git reset --hard b3d92c5
Сбросьте мастер до последнего используемого коммита.git merge repair
Слей нашу новую ветку на мастера.git push -f origin master
Подтолкните мастера к удаленному репо.
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's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
Эти строки можно переупорядочить; они выполняются сверху вниз. Если вы удалите строку здесь, то этот коммит будет потерян. Однако, если вы удалите все, ребаз будет прерван. Обратите внимание, что пустые коммиты закомментированы
Вы можете просто удалить этот коммит, используя опцию "d" или "Удаление строки с вашим коммитом".
[Быстрый ответ]
У вас есть много альтернатив, например:
Альтернатива 1:
git rebase -i <YourCommitId>~1
Измените YourCommitId на номер фиксации, к которой вы хотите вернуться.
Альтернатива 2:
git reset --hard YourCommitId git push <origin> <branch> --force
Измените YourCommitId на номер фиксации, к которой вы хотите вернуться.
Я не рекомендую этот вариант, потому что вы можете потерять незавершенную работу.
Альтернатива 3:
git reset --soft HEAD~1
Вы можете сохранить свою работу и только отменить фиксацию.
Принудительно изменить историю
Предполагая, что вы не хотите просто удалить последний коммит, но хотите удалить определенные коммиты из последних n коммитов, перейдите к:
git rebase -i HEAD~<number of commits to go back>
, так git rebase -i HEAD~5
если вы хотите увидеть последние пять коммитов.
Затем в текстовом редакторе измените слово pick
в drop
рядом с каждым коммитом, который вы хотели бы удалить. Сохраните и выйдите из редактора. Вуаля!
История изменений
Пытаться git revert <commit hash>
, Revert создаст новый коммит, который отменяет указанный коммит.
Если вы не опубликовали изменения, чтобы удалить последний коммит, вы можете сделать
$ git reset --hard HEAD^
(обратите внимание, что это также удалит все незафиксированные изменения; используйте с осторожностью).
Если вы уже опубликовали коммит для удаления, используйте git revert
$ git revert HEAD
git reset --hard commitId
git push <origin> <branch> --force
PS: CommitId ссылается на тот, который вы хотите вернуть обратно
Если вы хотите исправить свой последний коммит, вы можете отменить коммит и удалить из него файлы, выполнив:
git reset HEAD~1
Это вернет ваш репозиторий в его состояние до того, как команды git add разместили файлы. Ваши изменения будут в вашем рабочем каталоге. HEAD~1 относится к коммиту ниже текущего кончика ветви.
Если вы хотите отменить N коммитов, но сохраните изменения кода в вашем рабочем каталоге:
git reset HEAD~N
Если вы хотите избавиться от своего последнего коммита и не хотите сохранять изменения кода, вы можете выполнить "жесткий" сброс.
git reset --hard HEAD~1
Аналогично, если вы хотите отменить последние N коммитов и не хотите сохранять изменения кода:
git reset --hard HEAD~N
Если вы хотите удалить фиксацию, на которой вы сейчас находитесь, но не хотите удалять данные-
git reset --soft HEAD~1
Если вы хотите удалить фиксацию, на которой вы сейчас находитесь, и хотите удалить связанные данные-
git reset --hard HEAD~1
PS: эти команды удалят только локальные коммиты.
Чтобы удалить в локальной ветке, используйте
git reset --hard HEAD~1
Чтобы удалить в удаленной ветке, используйте
git push origin HEAD --force
Если вы пользователь IntelliJ , интерфейс просто потрясающий. Одним щелчком мыши вы можете сразу увидеть эффект. Ярлык для этого места:
Cmd + 9
Источник: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Удалить последний коммит
Например, ваш последний коммит
git push origin +aa61ab32^:master
Теперь вы хотите удалить этот коммит, затем простой способ сделать следующее
меры
Сначала сбросьте ветвь к родителю текущего коммита
Сила-толкни его на пульт.
git reset HEAD^ --hard git push origin -f
Для конкретного коммита вы хотите сбросить следующее
git reset bb676878^ --hard
git push origin -f
Здесь я просто публикую один четкий конвейер, чтобы сделать это
Шаг 1. Используйте git log, чтобы получить идентификатор фиксации.
git log
Шаг 2: используйте git reset, чтобы вернуться к предыдущей версии:
git reset --hard <your commit id>
Если вы хотите сохранить историю, показывая фиксацию и возврат, вы должны использовать:
git revert GIT_COMMIT_HASH
введите сообщение, объясняющее, почему вы возвращаетесь, а затем:
git push
Когда вы выпускаете git log
вы увидите как "неправильный" коммит, так и возврат сообщений журнала.
Все вышеперечисленные команды восстанавливают состояние вашего рабочего дерева и индекса, как они были до принятия коммита, но не восстанавливают состояние репозитория. Если вы посмотрите на него, "удаленный" коммит на самом деле не удаляется, он просто не тот, что на кончике текущей ветви.
Я думаю, что нет способа удалить коммит с помощью фарфоровых команд. Единственный способ - удалить его из журнала и reflog, а затем выполнить git prune --expire -now
,
Вот еще один способ сделать это:
Извлеките ветку, которую вы хотите вернуть, затем сбросьте локальную рабочую копию на коммит, который вы хотите сделать последним на удаленном сервере (все после того, как оно пройдет до свидания). Для этого в SourceTree я щелкнул правой кнопкой мыши и выбрал "Сбросить BRANCHNAME для этого коммита". Я думаю, что командная строка:
git reset --hard COMMIT_ID
Так как вы только что проверили свою ветку с удаленного компьютера, у вас не будет локальных изменений, чтобы беспокоиться о проигрыше. Но это потеряло бы их, если бы вы сделали.
Затем перейдите в локальный каталог вашего репозитория и выполните следующую команду:
git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME: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>
сработало, я обновил другую ветку до мастера и 1... 2... пуф! коммит вернулся - Гит побеждает.
Возвращаясь к мастеру, время попробовать git rebase -i <SHA>
затем уберите строку... безрезультатно, к сожалению. " Если вы уберете строку, то этот коммит будет потерян ". Ах... в новой заметке о тролле n00b в примечаниях к выпуску 2.8.3.
Решение:
git rebase -i <SHA>
затем d, drop = remove commit
,
Чтобы проверить, я проверил в другую ветку, и вуаля - не скрывать коммит для выборки / извлечения от мастера.
https://twitter.com/holman/status/706006896273063936
Хороший день для тебя.
Если вы только что испортили свой последний коммит (неправильное сообщение, забыли добавить некоторые изменения) и хотите исправить его, прежде чем отправлять в публичный репозиторий, почему бы не использовать:
git commit --amend -m "New message here"
Если у вас есть новые изменения, они будут объединены с последним коммитом (от которого вы пытаетесь избавиться) и заменит этот коммит.
Конечно, если вы измените коммит после того, как вы его выдвинули, вы переписываете историю, поэтому, если вы это сделаете, обязательно поймите последствия.
Вы также можете передать опцию '--no-edit' вместо '-m', если вы предпочитаете использовать сообщение предыдущего коммита.
Документы: http://git-scm.com/docs/git-commit.html
Что я обычно делаю, когда я фиксирую и нажимаю (если кто-то нажал на его коммит, это решит проблему)
git reset --hard HEAD~1
git push -f origin
надеюсь, это поможет
git reset --hard HEAD~1
Теперь вы будете в предыдущей главе. Вытащите ветку. Вставьте новый код. Коммит будет удален из git
Если вы уже нажали, сначала найдите коммит, которым вы хотите быть, в HEAD ($ GIT_COMMIT_HASH_HERE), а затем выполните следующее:
git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Затем каждое место, где репозиторий был клонирован, запускают:
git reset --hard origin/master
Сброс на локальный филиал
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
Принудительный толчок к началу
git push -f origin
// display git commit log
$ git log --pretty=oneline --abbrev-commit
// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2
Сделайте резервную копию вашего кода во временную папку. Следующая команда будет сброшена так же, как сервер.
git reset --hard HEAD
git clean -f
git pull
Если вы хотите сохранить свои изменения и удалить последние коммиты
git reset --soft HEAD^
git pull
Используйте фиксацию отбрасывания IntelliJ как одно из самых простых и понятных решений. Вы можете получить к нему доступ из нижнего левого угла:
Затем вы можете выбрать фиксацию и щелкнуть по ней правой кнопкой мыши, и вы получите это меню:Затем вы можете выбрать: опцию удаления фиксации.