Вопрос

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

Автор: delete, Я имею в виду, что это похоже на то, как если бы я не совершал этот коммит, и когда я сделаю push в будущем, мои изменения не будут отправлены в удаленную ветку.

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

Это было полезно?

Решение

Осторожный: 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

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

Удаление всего коммита

git rebase -p --onto SHA^ SHA

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

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

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

$ git reset --hard HEAD^

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

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

$ git revert HEAD
git reset --hard commitId

git push <origin> <branch> --force

ПС:CommitId относится к тому, к которому вы хотите вернуться.

Допустим, мы хотим удалить коммиты 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 Объедините нашу новую ветку с master.
  • git push -f origin master Отправьте мастер в удаленный репозиторий.

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

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

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

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

Дополнительная история изменений

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

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

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 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» или удалив строку, в которой есть ваш коммит.

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

git reset --hard HEAD~1

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

git push origin HEAD --force

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

Извлеките ветку, которую хотите вернуть, затем сбросьте локальную рабочую копию обратно на коммит, который вы хотите сделать последним на удаленном сервере (все, что будет после него, останется до свидания).Для этого в 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'сделал свою ветку, по незнанию думая, что могу перефразировать первый коммит, отличающийся от основного ( Гитхаб для 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...пуф!коммит вернулся — Git побеждает.

Возвращаюсь к мастеру, пора попробовать git rebase -i <SHA>, затем удалите строку...безрезультатно, к сожалению."Если вы удалите здесь строку, ЭТА КОММИТ БУДЕТ ПОТЕРЯНА.".Ах... пропустили новую функцию троллить n00b в 2.8.3 примечания к выпуску.

Решение:

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

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

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

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

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

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

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

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

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

git push origin +aa61ab32^:master

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

Шаги

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

  2. Принудительно нажмите на пульт.

git reset HEAD^ --hard

git push origin -f

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

git reset bb676878^ --hard

git push origin -f

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

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

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

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

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

Документы:http://git-scm.com/docs/git-commit.html

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

git revert GIT_COMMIT_HASH

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

git push  

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

Если вы уже сделали пуш, сначала найдите коммит, который вы хотите видеть в 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~1

git push -f origin

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

Сброс в локальной ветке

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

Принудительное нажатие в начало координат

git push -f origin

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

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

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

git reset --soft HEAD^
git pull

delete local commit

Как вы можете видеть на изображении выше, я хочу удалить коммит revert «test Change 2» (идентификатор SHA1: 015b5220c50e3dfbb1063f23789d92ae1d3481a2(вы можете получить идентификатор SHA1, используя gitk команда в git bash)).

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

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

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

after delete commit

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

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

git сброс --hard

git push origin HEAD --force

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

// 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, локальный и удаленный

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top